使用 kubeadm 安装 kubernetes 集群非常方便,但是也有一个比较烦人的问题就是默认的证书有效期只有一年时间,所以需要考虑证书升级的问题,本文的演示集群版本为 v1.13.1 版本,不保证下面的操作对其他版本也适用,在操作之前一定要先对证书目录进行备份,防止操作错误进行回滚。
1.查看证书有效期
$ openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
Not Before: Feb 13 19:17:50 2020 GMT
Not After : Feb 12 19:17:50 2021 GMT
1.15及以上版本可以使用下面的命令查看证书有效期:
kubeadm alpha certs check-expiration
2.备份证书和etcd数据
mkdir /etc/kubernetes.bak
cp -r /etc/kubernetes/* /etc/kubernetes.bak
cp -r /var/lib/etcd /var/lib/etcd.bak
3.更新证书
注意:kubeadm.conf 中 controlPlaneEndpoint
需配置为leader的节点ip+apiserver 端口号。
注意:此处需要先备份并删除 /etc/kubernetes/admin.conf 文件,否则会导致admin.conf不能正常更新
# 备份并删除旧的配置文件
sudo mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.bak
$ sudo mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak
$ sudo mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.bak
$ sudo mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.bak
$ sudo kubeadm alpha certs renew all --config=kubeadm.conf
$ sudo kubeadm init phase kubeconfig all --config kubeadm.conf
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/scheduler.conf"
4.更新kubeconfig文件
# 更新kubeconfig文件
cp $HOME/.kube/config $HOME/.kube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
完成后重启 kube-apiserver、kube-controller、kube-scheduler、etcd 这4个容器即可,我们可以查看 apiserver 的证书的有效期来验证是否更新成功:
$ echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
notAfter=Dec 24 10:03:04 2021 GMT
可以看到现在的有效期是一年过后的,证明已经更新成功了。
如果有多个master节点
,分别在各个master上执行上述操作即可。
遇到的问题
1.证书到期后,kubeconfig文件失效,导致alpha不能正常访问K8s。其他表现:执行kubectl或kubeadm命令超时
原因:第3步未删除并备份/etc/kubernetes/admin.conf文件,导致admin.conf文件未正常更新,进而导致~/.kube/config文件未更新。
解决方案:重新执行第3步和第4步
2.证书到期后,kubelet重启失败,提示“Part of the existing bootstrap client certificate is expired”
原因:第3步未删除旧的kubelet.conf文件
解决方案:参考第3步更新kubelet.conf文件
3. 服务不能正常访问K8s,提示信息如下
原因:istio-ingressgateway 认证信息过期
解决方案:重启 istio-ingressgateway 即可
k delete po istio-ingressgateway-6d787bdcd9-ql8rj -n istio-system --force --grace-period=0