kubeadm 是 kubernetes 提供的一个初始化集群的工具,使用起来非常方便。但是它创建的apiserver、controller-manager等证书默认只有一年的有效期,同时kubelet 证书也只有一年有效期,一年之后 kubernetes 将停止服务。
官方推荐一年之内至少用 kubeadm upgrade 更新一次 kubernetes 系统,更新时也会自动更新证书, 确保你的集群保持最新状态并保持合理的安全性。不过,在产线环境或者无法连接外网的环境频繁更新 kubernetes 不太现实。
我们可以在过期之前或之后,使用kubeadm alpha phase里的certs和kubeconfig命令,同时配合kubelet证书自动轮换机制来解决这个问题。

The connection to the server 192.168.31.88:6443 was refused - did you specify the right host or port?
k8s.io/kubernetes/cmd/kube-scheduler/app/server.go:233: Failed to list *v1.Pod: Get [https://192.168.31.88:6443/api/v1/pods?fieldSelector=status.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded&limit=500&resourceVersion=0:](https://192.168.31.88:6443/api/v1/pods?fieldSelector=status.phase%21%3DFailed%2Cstatus.phase%21%3DSucceeded&limit=500&resourceVersion=0:) x509: certificate has expired or is not yet valid
k8s-master kubelet[57845]: E0329 22:13:33.345140 57845 bootstrap.go:265] part of the existing bootstrap client certificate is expired: 2021-04-05 14:00:17 +0000 UTC
k8s-master kubelet[57845]: F0329 22:13:33.345240 57845 server.go:274] failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf:
image.png

解决方法

在实际中,如果遇到证书过期,则需手动更新证书,通过 kubeadm certs renew 命令手动更新你的证书。

  1. 查看证书过期时间。

在 Master 节点上,执行 kubeadm certs check-expiration 命令,查看证书过期时间。
image.png

  1. 备份证书

为防止更新证书等操作失败,关键操作前一定要进行备份。备份 /etc/kubernetes 目录:
cp -r /etc/kubernetes /etc/kubernetes.old # 当升级证书失败时, 可以将此文件夹复原, 即可恢复原有集群

  1. 更新证书。使用 kubeadm certs renew 命令来更新证书。
  2. 更新 ~/.kube/config 文件。

mv config config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
sudo chmod 644 $HOME/.kube/config

  1. 重启

重启kube-apiserver,kube-controller,kube-scheduler,etcd 这4个容器:
docker ps | grep -v pause | grep -E “etcd|scheduler|controller|apiserver” | awk ‘{print $1}’ | awk ‘{print “docker”,”restart”,$1}’ | bash

整体思路:

  1. 备份:在进行证书更新前,建议备份/etc/kubernetes,防止操作失误。
  2. 更新证书:使用kubeadm alpha certs renew重新生成证书。仅更新*.key文件,需要原始的crt文件才能生成对应的key文件。
  3. 更新配置:使用kubeadm init phase kubeconfig all --config ${kubeadm.yaml配置文件}或者kubeadm alpha kubeconfig user命令。

证书更新策略:

  • 单主节点:可以直接运行kubeadm alpha certs renew all --config kubeadm.yaml完成证书更新。然后替换kubelet配置
  • 多主节点:建议使用原ca证书(有效期10年),每个组件(etcd、apiserver 等)单独更新。

查看证书有效期方法:
owen@k8s-master:~$ openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ‘ Not ‘
Not Before: Apr 5 14:00:13 2020 GMT
Not After : Mar 29 14:52:19 2023 GMT
⚠️ kubeadm 默认生成的ca证书有效期是10年,其他证书(如etcd证书,apiserver证书)有效期均为1年

image.png


多master节点证书更新

备份原始配置和证书

所有master节点运行命令:cp -rp /etc/kubernetes/ ./kubernetes/

不同版本的kubeadm对于证书renew的命令有细微的差异,具体情况需要依据已经安装的kubeadm来判断。通过命令行kubeadm alpha certs renew --help输出类似如下信息:

image.png