适用版本: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,转载请注明出处。

文章作者: emporer
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Emporer-Linux
喜欢就支持一下吧