K8S kubeadm 集群证书更新 续签10年
myluzh 发布于 阅读:27 Kubernetes
0x00 说明
这篇记录 kubeadm 集群控制面证书续签。
我这里放两种方式:
- 官方方式:
kubeadm certs renew all - 10 年方式:
update-kube-cert
如果只是正常维护,优先用官方方式。如果明确想把证书一次续到 10 年,再用 update-kube-cert。
这篇只适合 kubeadm 初始化的集群。二进制部署、RKE、RKE2、k3s、云厂商托管 Kubernetes,证书路径和组件管理方式可能不一样,不要直接套。
默认环境:
- 控制面组件是静态 Pod
- 证书目录:
/etc/kubernetes/pki - 静态 Pod 目录:
/etc/kubernetes/manifests - 容器运行时:containerd 或 docker
0x01 检查和备份
先看版本、节点和证书过期时间,再备份 /etc/kubernetes 和当前 kubeconfig。
# 看版本和节点
kubeadm version
kubectl get nodes -o wide
kubectl get pods -n kube-system -o wide
# 新版本 kubeadm:
kubeadm certs check-expiration
# 老版本如果没有 certs 子命令,换成:
# kubeadm alpha certs check-expiration
# 备份
mkdir -p /root/k8s-cert-backup
cp -a /etc/kubernetes /root/k8s-cert-backup/kubernetes-$(date +%F-%H%M%S)
cp -a /root/.kube /root/k8s-cert-backup/kubeconfig-$(date +%F-%H%M%S) 2>/dev/null || true
注意:命令是 alpha,不是 aplha。
如果是堆叠 etcd,建议先做 etcd snapshot。证书和 etcd 同时出问题时,回滚会麻烦很多。
0x02 官方方式
官方方式适合常规续签,风险最低。
# 新版本 kubeadm:
kubeadm certs renew all
# 老版本如果没有 certs 子命令,换成:
# kubeadm alpha certs renew all
# 更新 root 用户 kubectl 配置:
mkdir -p /root/.kube
cp -f /etc/kubernetes/admin.conf /root/.kube/config
# 如果普通用户也要用 kubectl:
USER_NAME=your-user
mkdir -p /home/${USER_NAME}/.kube
cp -f /etc/kubernetes/admin.conf /home/${USER_NAME}/.kube/config
chown -R ${USER_NAME}:${USER_NAME} /home/${USER_NAME}/.kube
证书续签完成后,要让控制面组件重新加载证书。
kubeadm 的控制面组件一般是静态 Pod,直接移动 manifests 里的 YAML,让 kubelet 重新拉起即可。
mkdir -p /root/k8s-manifests-tmp
for name in kube-apiserver kube-controller-manager kube-scheduler; do
mv /etc/kubernetes/manifests/${name}.yaml /root/k8s-manifests-tmp/
sleep 30
mv /root/k8s-manifests-tmp/${name}.yaml /etc/kubernetes/manifests/
sleep 30
done
# 如果是堆叠 etcd,再执行这一段:
# mv /etc/kubernetes/manifests/etcd.yaml /root/k8s-manifests-tmp/
# sleep 30
# mv /root/k8s-manifests-tmp/etcd.yaml /etc/kubernetes/manifests/
# sleep 30
单 Master 操作时,API Server 会短暂不可用。多 Master 不要一起重启控制面,一台恢复后再处理下一台。
验证:
kubeadm certs check-expiration
kubectl get nodes
kubectl get pods -n kube-system -o wide
journalctl -u kubelet -n 100 --no-pager
# 老版本检查证书换成:
# kubeadm alpha certs check-expiration
0x03 续签到 10 年
update-kube-cert 是第三方脚本,作用是把 kubeadm 集群证书续签到 10 年。
项目地址:https://github.com/yuyicai/update-kube-cert
拉取脚本:
git clone https://github.com/yuyicai/update-kube-cert.git
# 如果服务器访问 GitHub 不稳定,上面那条可以换成:
# git clone https://ghp.ci/https://github.com/yuyicai/update-kube-cert.git
cd update-kube-cert
chmod +x update-kubeadm-cert.sh
执行时使用 bash 或直接执行脚本,不要用 sh update-kubeadm-cert.sh。
# containerd 环境:
./update-kubeadm-cert.sh all --cri containerd
# docker 环境换成:
# ./update-kubeadm-cert.sh all
脚本会自动备份 /etc/kubernetes,常见目录类似 /etc/kubernetes.old-20260527。
执行完成后检查证书。
kubeadm certs check-expiration
# 老版本 kubeadm 换成:
# kubeadm alpha certs check-expiration
如果检查结果已经变成 10 年,但是控制面组件没有正常恢复,就按前面官方方式里的方法手动重启静态 Pod。
0x04 多 Master 顺序
多 Master 集群不要所有控制面节点一起续签。
我一般按这个顺序:
- 处理第一个 Master
- 检查 apiserver、controller-manager、scheduler、etcd
- 执行
kubectl get nodes - 确认正常后处理第二个 Master
- 全部处理完,再整体检查集群
每台 Master 本地都有自己的 /etc/kubernetes 证书和 kubeconfig,所以每台 Master 都要处理。
Worker 节点一般不用执行 kubeadm certs renew all。kubelet 客户端证书通常会自动轮换。如果 Worker 变成 NotReady,再单独看 /var/lib/kubelet/pki 和 kubelet 日志。
0x05 回滚
如果续签后控制面不正常,先停 kubelet,再恢复备份。
systemctl stop kubelet
mv /etc/kubernetes /etc/kubernetes.failed-$(date +%F-%H%M%S)
# 手动备份目录:
BACKUP_DIR=/root/k8s-cert-backup/kubernetes-你的备份时间
# 如果使用 update-kube-cert 自动备份,上面一行换成:
# BACKUP_DIR=/etc/kubernetes.old-20260527
cp -a "$BACKUP_DIR" /etc/kubernetes
systemctl start kubelet
mkdir -p /root/.kube
cp -f /etc/kubernetes/admin.conf /root/.kube/config
kubectl get nodes
kubectl get pods -n kube-system -o wide
journalctl -u kubelet -n 100 --no-pager
0x06 几个注意点
kubeadm certs renew all 通常不会轮换 CA。它续签的是由 CA 签发的组件证书。CA 如果已经过期,就不是普通续签能解决的事情。
证书文件更新后,控制面进程不一定自动重新加载,所以续签后要重启静态 Pod。
kubeadm 升级控制面时通常会自动续签控制面证书,除非显式关闭证书续签。但如果集群长期不升级,还是建议定期检查:
kubeadm certs check-expiration
0x07 总结
我这边生产环境一般这样选:
- 正常维护:用官方
kubeadm certs renew all - 想一次续到 10 年:用
update-kube-cert - 多 Master:逐台操作,不要一起重启控制面
- 操作前:必须备份
/etc/kubernetes - 堆叠 etcd:建议先做 etcd snapshot
参考链接:
- Kubernetes 官方 kubeadm 证书管理:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
- update-kube-cert:https://github.com/yuyicai/update-kube-cert
证书 k8s kubeadm kubernetes 集群 续签