kubeadm 部署的 K8s 集群证书续期完整指南
适用版本:Kubernetes 1.20+(kubeadm 部署)
续期停机时间:控制面滚动续期可做到零感知中断。
一、背景
kubeadm 部署的 K8s 集群,所有控制面组件(apiserver、controller-manager、scheduler、etcd 等)使用的证书默认有效期只有 1 年。一旦证书过期,集群会全面失联:
kubectl报错Unable to connect to the server: x509: certificate has expired- Pod 无法调度、服务无法更新
- etcd 通信中断,节点 NotReady
因此定期检查并续期证书是 K8s 运维的必修课。
二、检查证书有效期
1. 快速查看所有证书到期时间
# 在任意一个 master 节点执行
sudo kubeadm certs check-expiration
输出示例:
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Jul 22, 2027 09:30 UTC 364d ca no
apiserver Jul 22, 2027 09:30 UTC 364d ca no
apiserver-kubelet-client Jul 22, 2027 09:30 UTC 364d ca no
controller-manager.conf Jul 22, 2027 09:30 UTC 364d ca no
scheduler.conf Jul 22, 2027 09:30 UTC 364d ca no
etcd-healthcheck-client Jul 22, 2027 09:30 UTC 364d etcd-ca no
etcd-peer Jul 22, 2027 09:30 UTC 364d etcd-ca no
etcd-server Jul 22, 2027 09:30 UTC 364d etcd-ca no
关键看 RESIDUAL TIME 列,建议在剩余 30 天以内 时安排续期。
2. 手动查看单张证书(OpenSSL)
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
输出:
notBefore=Jul 22 09:30:00 2026 GMT
notAfter=Jul 22 09:30:00 2027 GMT
三、续期证书
方式 A:一键续期所有证书(推荐)
# 1. 备份原证书目录(重要!)
sudo cp -r /etc/kubernetes /etc/kubernetes.bak.$(date +%F)
# 2. 续期全部证书
sudo kubeadm certs renew all
执行后会看到所有证书都打印 renewed:
[renew] Reading configuration from the cluster...
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access kubelet renewed
certificate for the API server to connect to etcd renewed
...
方式 B:只续期单个证书
sudo kubeadm certs renew apiserver
sudo kubeadm certs renew apiserver-kubelet-client
sudo kubeadm certs renew etcd-server
sudo kubeadm certs renew admin.conf
# 其他依此类推
续期后必须做的事
# 1. 用新的 admin.conf 替换 ~/.kube/config
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 2. 重启控制面静态 Pod(让 kubelet 重新加载新证书)
# 最简单的办法:把 manifest 移出去再移回来,kubelet 会自动重建
sudo mv /etc/kubernetes/manifests/*.yaml /tmp/
sleep 5
sudo mv /tmp/*.yaml /etc/kubernetes/manifests/
等待约 30~60 秒,所有静态 Pod(apiserver/controller-manager/scheduler/etcd)会自动重启并加载新证书。
四、验证续期结果
# 1. 集群状态
kubectl get nodes
kubectl get cs
# 2. 再次检查证书
sudo kubeadm certs check-expiration
# 3. 确认组件全部 Running
kubectl get pods -n kube-system
五、多 Master 高可用集群续期
逐节点滚动续期,确保 apiserver 始终有可用实例:
# 在 master-1 上执行
sudo kubeadm certs renew all
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 移动 manifest 触发重启 ...
# 确认 master-1 上 apiserver 正常后,再处理 master-2、master-3
kubectl get pods -n kube-system -o wide | grep apiserver
⚠️ 一次只处理一个节点,确认上一个节点 apiserver Pod
Running后再继续,避免全部 apiserver 同时下线导致集群不可用。
六、自动化:到期前自动告警
在生产环境,建议用脚本 + 定时任务监控证书剩余天数:
#!/bin/bash
# /opt/scripts/check-k8s-cert.sh
DAYS=$(sudo kubeadm certs check-expiration 2>/dev/null \
| grep -oE '[0-9]+d' | head -1 | tr -d 'd')
THRESHOLD=30
if [ "$DAYS" -lt "$THRESHOLD" ]; then
echo "K8s 证书将在 ${DAYS} 天后过期,请立即续期!" \
| mail -s "[告警] K8s 证书即将过期" ops@example.com
fi
加入 crontab:
# 每周一上午 9 点检查一次
0 9 * * 1 /opt/scripts/check-k8s-cert.sh
七、常见问题
Q1:证书已经过期,kubectl 用不了怎么办?
证书过期后 kubeconfig 也失效,直接执行续期命令仍然可以工作,因为 kubeadm certs renew 操作的是本地文件,不依赖 apiserver:
sudo kubeadm certs renew all
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
然后重启静态 Pod 即可恢复。
Q2:续期后 worker node 还是 NotReady?
Worker 节点上的 /etc/kubernetes/kubelet.conf 也包含客户端证书,但它由 kubelet 自己 自动轮换(默认开启 rotateCertificates)。如果未开启,需要在 node 上重新生成:
sudo kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:<节点名>
Q3:externalCA(EXTERNALLY MANAGED = yes)怎么续期?
这种情况下 kubeadm 不能签发证书,需要用外部 CA 重新签发后,手动替换 /etc/kubernetes/pki/ 下的对应文件,再重启组件。
八、总结
| 步骤 | 命令 |
|---|---|
| 检查到期时间 | kubeadm certs check-expiration |
| 备份 | cp -r /etc/kubernetes /etc/kubernetes.bak.$(date +%F) |
| 续期 | kubeadm certs renew all |
| 刷新 kubeconfig | cp /etc/kubernetes/admin.conf ~/.kube/config |
| 重启组件 | 移动 /etc/kubernetes/manifests/*.yaml 触发重建 |
| 验证 | kubectl get nodes + check-expiration |
最佳实践:把"K8s 证书续期"加入运维日历,每年 6 月和 12 月 各检查一次,并配合自动化告警脚本,从根本上杜绝证书过期事故。
作者:EmporerLinux | 分类:容器与云原生
本文首发于 emporerlinux.com,转载请注明出处。