k8s1.19.1证书续期(etcd外设版)
• 工作节点:工作节点主要是指kubelet连接apiserver所需的客户端证书,这个证书由controller-manager组件自动颁发,默认是一年,如果到期,kubelet将无法使用过期的证书连接apiserver,从而导致无法正常工作,日志会_kubelet-client-2023-01-18-22-31-02.pem。Kubernetes Kubeadm Kubelet 证书自动续签_
·
k8s证书使用kubeadm部署有效期为一年,有一种很方便的续期方式能无脑直接续期10年时间
非etcd外设纯容器化证书续期方法
git clone https://github.com/yuyicai/update-kube-cert.git
cd update-kube-cert
chmod 755 update-kubeadm-cert.sh
./update-kubeadm-cert.sh all
但显然这并不能满足大多数场景,etcd外设此方法就解决不了。官网给出的kubeadm方式也是一年一续期。本人研究各种方式想要续期长一点发现危险指数都很高,例如替换证书。替换证书导致了集群无法访问,之前还没做备份集群直接瘫痪了,而且要替换很多。于是采用了官网1年的续期方案做实验。虽然续期是1年很短但是kubeadm毕竟稳妥,保命要紧。
本文采用centos8 k8s1.19.1 docker19.03.14版本,etcd外设
配置证书轮转,kubelet自动续期
1.查看kubelet证书有效期
cd /var/lib/kubelet/pki/
openssl x509 -in kubelet-client-current.pem -noout -dates
2.配置kube-controller-manager 组件
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
- command:
- kube-controller-manager
- --experimental-cluster-signing-duration=87600h0m0s
- --feature-gates=RotateKubeletServerCertificate=true
3.更新pod
kubectl delete pod kube-controller-manager-k8s-master -n kube-system
4.开启kubelet 证书轮转
vi /var/lib/kubelet/config.yaml
rotateCertificates: true #默认是开启的
5.重启kubelet
systemctl restart kubelet
证书验证以及细节参看以下文章:
ETCD外设集群证书续期
1.查看证书有效期
cd /etc/kubernetes/pki/ && for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A 3 'Validity' ; done
===== apiserver.crt =====
Validity
Not Before: Jun 12 08:30:08 2024 GMT
Not After : Jun 12 08:30:08 2025 GMT
Subject: CN = kube-apiserver
===== apiserver-kubelet-client.crt =====
Validity
Not Before: Jun 12 08:30:08 2024 GMT
Not After : Jun 12 08:30:08 2025 GMT
Subject: O = system:masters, CN = kube-apiserver-kubelet-client
===== ca.crt =====
Validity
Not Before: Jun 12 08:30:08 2024 GMT
Not After : Jun 10 08:30:08 2034 GMT
Subject: CN = kubernetes
===== front-proxy-ca.crt =====
Validity
Not Before: Jun 12 08:30:08 2024 GMT
Not After : Jun 10 08:30:08 2034 GMT
Subject: CN = front-proxy-ca
===== front-proxy-client.crt =====
Validity
Not Before: Jun 12 08:30:08 2024 GMT
Not After : Jun 12 08:30:08 2025 GMT
Subject: CN = front-proxy-client
[root@k8s-1 /etc/kubernetes/pki]# ls
apiserver.crt apiserver.key ca.crt front-proxy-ca.crt front-proxy-client.key
apiserver-etcd-client-key.pem apiserver-kubelet-client.crt ca.key front-proxy-ca.key sa.key
apiserver-etcd-client.pem apiserver-kubelet-client.key etcd front-proxy-client.crt sa.pub
另一种kubeadm方式查看证书有效期
kubeadm alpha certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Jun 12, 2025 08:37 UTC 15h no
apiserver Jun 12, 2025 08:37 UTC 15h ca no
apiserver-kubelet-client Jun 12, 2025 08:37 UTC 15h ca no
controller-manager.conf Jun 12, 2025 08:37 UTC 15h no
front-proxy-client Jun 12, 2025 08:37 UTC 15h front-proxy-ca no
scheduler.conf Jun 12, 2025 08:37 UTC 15h no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Jun 10, 2034 08:30 UTC 9y no
front-proxy-ca Jun 10, 2034 08:30 UTC 9y no
2.备份证书(必须执行)
cp -r /etc/kubernetes /etc/kubernetes.old
注意:必须备份,之前集群瘫痪就是没有备份
3.使用kubeadm更新证书
#上面证书可以看到时间跟需要升级的证书
#续期 API 服务器证书:
kubeadm alpha certs renew apiserver
#续期 API 服务器到 kubelet 的客户端证书:
kubeadm alpha certs renew apiserver-kubelet-client
#续期控制器管理器的 kubeconfig 证书:
kubeadm alpha certs renew controller-manager.conf
#续期调度器的 kubeconfig 证书:
kubeadm alpha certs renew scheduler.conf
#续期前端代理客户端证书:
kubeadm alpha certs renew front-proxy-client
#续期集群客户端admin证书
kubeadm alpha certs renew admin.conf
#重启kubelet
systemctl restart kubelet
#注意:master都执行一遍,切记一个一个来切勿同时更新重启!
5.验证证书有效期
cd /etc/kubernetes/pki
-rw-r--r-- 1 root root 1269 6月 12 00:30 apiserver.crt
-rw------- 1 root root 227 6月 12 2024 apiserver-etcd-client-key.pem
-rw-r--r-- 1 root root 875 6月 12 2024 apiserver-etcd-client.pem
-rw------- 1 root root 1679 6月 12 00:30 apiserver.key
-rw-r--r-- 1 root root 1143 6月 12 00:30 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 6月 12 00:30 apiserver-kubelet-client.key
-rw-r--r-- 1 root root 1066 6月 12 2024 ca.crt
-rw------- 1 root root 1675 6月 12 2024 ca.key
drwxr-xr-x 2 root root 20 6月 12 2024 etcd
-rw-r--r-- 1 root root 1078 6月 12 2024 front-proxy-ca.crt
-rw------- 1 root root 1679 6月 12 2024 front-proxy-ca.key
-rw-r--r-- 1 root root 1103 6月 12 00:31 front-proxy-client.crt
-rw------- 1 root root 1679 6月 12 00:31 front-proxy-client.key
-rw------- 1 root root 1679 6月 12 2024 sa.key
-rw------- 1 root root 451 6月 12 2024 sa.pub
#可以看到更新了哪些证书,etcd没动没有更新,因为我们是etcd外设早就配置好了有效期。如果你不小心更新了etcd或者kubeadm alpha certs renew all了,要是刚部署集群可以铲掉重来。有备份的话还原备份(备份重要性)
#查看有效期
kubeadm alpha certs check-expiration
#查看有效期
cd /etc/kubernetes/pki/ && for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A 3 'Validity' ; done
注意:kubeadm alpha certs renew all因集群而议。二进制k8s可自定义证书,证书可控。kubeadm源代码是1年,网上一些野生方法改kubeadm源码我也试了,但是没编译成功。而且k8s版本太多用到就得重新编译一次,网上虽然有1.19.0的但跟小版本不一致我也没敢用没验证感兴趣可以自己研究。最后我采用的是1年1续虽然有些麻烦但毕竟丝滑操作简单风险小。网上替换证书的方案大佬可以无视本文
更新证书脚本
#!/bin/bash
commands=("kubeadm alpha certs renew apiserver"
"kubeadm alpha certs renew apiserver-kubelet-client"
"kubeadm alpha certs renew controller-manager.conf"
"kubeadm alpha certs renew scheduler.conf"
"kubeadm alpha certs renew front-proxy-client"
"kubeadm alpha certs renew admin.conf")
# 获取命令数组长度
length=${#commands[@]}
# 循环执行命令数组中的每个命令
for ((i=0; i<$length; i++)); do
# 获取当前索引对应的命令
cmd=${commands[$i]}
# 执行命令
echo "Executing command: $cmd"
eval "$cmd" > /dev/null
# 暂停3秒
sleep 3
# 检查命令是否执行成功,可根据实际需求调整这里的检查逻辑
if [ $? -eq 0 ]; then
echo "Command executed successfully."
else
echo "Command failed with exit code $?."
# 可以在这里决定是否继续执行后续命令或退出脚本
fi
done
read -p "Do you want to restart kubelet yes/no: " KUBELETE
case $KUBELETE in
yes)
systemctl restart kubelet
if [ $? -eq 0 ]; then
echo "Restart successful"
fi
;;
no)
exit
;;
*)
echo "Please enter yes or no"
;;
esac
更多推荐
已为社区贡献2条内容
所有评论(0)