更新证书
1、检查证书是否过期
# kubeadm alpha certs check-expiration
# kubeadm alpha certs check-expiration --config kubeadm.yaml
该命令显示 /etc/kubernetes/pki
文件夹中的客户端证书以及 kubeadm
使用的 KUBECONFIG
文件中嵌入的客户端证书的到期时间/剩余时间。
2、备份原有证书(重要)
mkdir /etc/kubernetes.bak
cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak
cp /etc/kubernetes/*.conf /etc/kubernetes.bak
3、备份ETCD数据
# 备份数据目录
cp -r /var/lib/etcd /var/lib/etcd.bak
# 快照备份
export ETCDCTL_API=3
etcdctl --endpoints localhost:2379 snapshot save snapshot.db
# 快照恢复命令
etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data
4、更新证书
kubeadm alpha certs renew all --config=kubeadm.yaml
更新完过后就可以查看证书的有效期了。
5、更新kubeconfig
kubeadm init phase kubeconfig all --config kubeadm.yaml
6、将新生成的admin配置文件覆盖原有的配置文件
mv $HOME/.kube/config $HOME/.kube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
7、完成后重启kubernetes控制面的组件
docker ps |grep -E ‘k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd’ | awk -F ‘ ’ ‘{print $1}’ |xargs docker restart
8、通过apiserver 查看证书是否更新成功
echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
问题整理
1、kubelet证书轮转失败
默认情况下,kubeadm 使用 /etc/kubernetes/kubelet.conf
中指定的 /var/lib/kubelet/pki/kubelet-client-current.pem
符号链接 来配置 kubelet 自动轮换客户端证书。如果此轮换过程失败,你可能会在 kube-apiserver 日志中看到 诸如x509: certificate has expired or is not yet valid
之类的错误。
要解决此问题,你必须执行以下步骤:
- 从故障节点备份和删除 /etc/kubernetes/kubelet.conf 和 /var/lib/kubelet/pki/kubelet-client*。
- 在集群中具有 /etc/kubernetes/pki/ca.key 的、正常工作的控制平面节点上 执行
kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf
。 $NODE 必须设置为集群中现有故障节点的名称。 手动修改生成的 kubelet.conf 以调整集群名称和服务器端点, 或传递 kubeconfig user —config(此命令接受 InitConfiguration)。 如果你的集群没有 ca.key,你必须在外部对 kubelet.conf 中的嵌入式证书进行签名。 - 将得到的 kubelet.conf 文件复制到故障节点上,作为 /etc/kubernetes/kubelet.conf。
- 在故障节点上重启 kubelet(systemctl restart kubelet),等待 /var/lib/kubelet/pki/kubelet-client-current.pem 重新创建。
- 在故障节点上运行 kubeadm init phase kubelet-finalize all。 这将使新的 kubelet.conf 文件使用 /var/lib/kubelet/pki/kubelet-client-current.pem 并将重新启动 kubelet。
- 确保节点状况变为 Ready。
Reference: