«

K8S kubeadm 集群证书更新 续签10年

myluzh 发布于 阅读:27 Kubernetes


0x00 说明

这篇记录 kubeadm 集群控制面证书续签。

我这里放两种方式:

如果只是正常维护,优先用官方方式。如果明确想把证书一次续到 10 年,再用 update-kube-cert

这篇只适合 kubeadm 初始化的集群。二进制部署、RKE、RKE2、k3s、云厂商托管 Kubernetes,证书路径和组件管理方式可能不一样,不要直接套。

默认环境:

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 集群不要所有控制面节点一起续签。

我一般按这个顺序:

  1. 处理第一个 Master
  2. 检查 apiserver、controller-manager、scheduler、etcd
  3. 执行 kubectl get nodes
  4. 确认正常后处理第二个 Master
  5. 全部处理完,再整体检查集群

每台 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 总结

我这边生产环境一般这样选:

参考链接:

证书 k8s kubeadm kubernetes 集群 续签


正文到此结束
版权声明:若无特殊注明,本文皆为 Myluzh Blog 原创,转载请保留文章出处。
文章内容:https://itho.cn/k8s/603.html
文章标题:《K8S kubeadm 集群证书更新 续签10年