关键字
k8s、kubelet
适用产品
- AnyShare 7.0.3.9及之前的版本,k8s 版本为1.18.5
问题描述
k8s 证书到期后长时间没有续约,在之后使用 kubeadm 进行证书续约后;或者机器长时间未启动后,kubelet 无法正常启动,此时需要对相关配置进行备份,并重新配置kubelet的证书
适用于 Master、Worker 节点kubelet证书过期,Master节点apiserver、controller-manager、scheduler证书到期需要先参照KB-2809进行处理
kubelet 在messages日志中信息如下:
part of the existing bootstrap client certificate is expired:

通过命令检查证书过期时间:
openssl x509 -noout -in /var/lib/kubelet/pki/kubelet-client-current.pem -text| grep -i not
查看 Not After 过期时间

问题影响
集群异常,无法启动,业务受到影响
问题原因
证书过期后长时间内未续约,或者长时间关机未启动
解决方案
以下操作之前一定要备份相关配置,操作过程中需要重启服务,会对业务产生影响
1.首先对kubernetes目录进行备份,所有需要恢复的 k8s 节点需要操作;
cp -a /etc/kubernetes /etc/kubernetes.bak_$(date +"%Y-%m-%d_%H%M%S")
2.进入其中一个k8s master节点,根据需要处理的节点名称执行以下命令,生成新的 kubelet 配置文件,红色部分根据环境修改:
kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:node-237-173 > kubelet.conf-node-237-173
配置中 server 改成:https://proton-cs.lb.aishu.cn:xxxxx,端口参考备份的原始配置,也可以从备份文件中复制这行配置进行粘贴

将修改后的配置scp复制到需要恢复的节点,然后用此文件替换该节点下 /etc/kubernetes/kubelet.conf

重启问题节点的 kubelet,试其使用新配置进行连接,获取相关的轮换证书文件
systemctl restart kubelet
3.命令生成的配置文件里面是包含的固定证书,因为证书是自动轮换的,需要进行调整,连接的 apiserver 地址也需要修改:
将证书部分的配置由固定的证书字符串改成指向对应的文件
生成的配置是用的证书公钥、密钥字符串:

改为以下配置,注意用空格对齐缩进,也可以从备份文件中复制这部分配置进行粘贴:
user:
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

4.需要恢复节点上重启 kubelet 服务,检查容器是否正常启动
systemctl restart kubelet
docker ps

master 节点执行命令,查看节点是否在线
kubectl get nodes

5.检查 calico Pod是否正常,如果长期处于未就绪状态,需要到相关节点手动重启 calico 容器:
docker restart `docker ps | grep 'calico-node' | grep kube-system | grep -v 'anyrobot' | awk '{print $1}' | xargs` &>/dev/null
systemctl restart kubelet
更多信息
(描述更多信息)