k8s证书续期

k8s 里大部分组件证书默认只有 ‌1年有效期‌,这其实是 kubeadm 在生成证书时‌硬编码‌的设计,不是技术限制,而是‌安全与运维之间的平衡‌。‌‌

🎯 为什么是 1 年
‌安全考虑‌:证书有效期越短,密钥泄露后能被恶意利用的时间窗口就越小,符合安全最佳实践。
‌倒逼版本升级‌:K8s 官方希望借此推动用户每年更新一次集群版本,保持与社区同步,降低老版本的安全风险。
‌默认策略‌:kubeadm 在 constants.go 里写死了 CertificateValidity = time.Hour * 24 * 365,也就是 1 年;而根 CA 证书是 10 年(CACertificateValidity = time.Hour * 24 * 365 * 10)

 所有节点检测证书有效期:

#cat check_k8s_cert.sh
#!/usr/bin/env bash
# 替换为你的所有Master节点真实IP列表,避免重复
MASTER_IPS=("10.169.2.21" "10.169.2.21" "10.169.2.21")

echo "=== 全集群Master节点证书过期时间汇总 ==="
for ip   in "${MASTER_IPS[@]}"
do
    echo -e   "\n👉 节点 $ip 证书状态:"
    ssh -o ConnectTimeout=5 root@"$ip" "kubeadm certs check-expiration 2>/dev/null || echo '节点连接失败或kubeadm命令不可用'"
done


etcd_crt=`openssl x509 - in /opt/etcd/ssl/etcd.pem -noout -dates`
echo "###################################"
echo etcd_crt=$etcd_crt
echo "###################################"
#bash check_k8s_cert.sh

 

🎯 kubeadm 续证书有效期全流程指南

kubeadm 提供了官方原生续期方式,同时也支持通过第三方工具延长证书有效期,覆盖常规续期、延长有效期等不同场景。

📋 官方标准续期(默认续1年)

这是最稳妥的官方原生方案,适用于所有 kubeadm 部署的集群,操作全程无侵入。

  • ✅ ‌前置检查‌:执行 kubeadm certs check-expiration 查看所有证书当前有效期,确认哪些证书临近过期。
  • ✅ ‌安全备份‌:续期前必须全量备份证书和配置,避免操作失误导致集群异常:
BACKUP_DIR=/etc/kubernetes.bak_$(date +%Y%m%d%H%M%S)
sudo cp -a  /etc/kubernetes ${BACKUP_DIR}
sudo cp -a  /var/lib/kubelet/pki ${BACKUP_DIR}/pki
sudo cp /root/.kube/config ${BACKUP_DIR}/config

  ✅ ‌一键续期‌:执行命令更新所有由 kubeadm 管理的组件证书,自动重置有效期为1年:

# k8s 1.15+ 版本直接使用
sudo kubeadm certs renew all
# 旧版本(1.15之前)使用 alpha 子命令
sudo kubeadm alpha certs renew all

  ✅ ‌加载新证书‌:续期完成后同步更新本地 kubeconfig 并重启组件,让新证书生效:

sudo cp -i  /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo systemctl restart kubelet

          重启 kubelet 后,apiserver、scheduler、controller-manager 等静态 Pod 会自动重建加载新证书。

  ✅ ‌结果校验‌:再次执行 kubeadm certs check-expiration,确认所有证书的过期时间已向后延长1年。

🎯 核心结论:必须每个控制平面节点执行
kubeadm certs renew all ‌需要在每一台控制平面节点上单独执行‌,不能只在某一台Master节点操作,否则会出现集群证书不一致的连锁故障。

🔍 背后的核心原因
每台控制平面节点的 /etc/kubernetes/pki 目录下,都存储着独立的本地证书文件,包括apiserver服务证书、etcd节点通信证书、本地kubeconfig配置等,这些证书默认不会自动跨节点同步。
仅在单台节点续期后,其余Master节点的证书仍处于原有有效期,节点间的TLS通信会因证书信任链不匹配,出现apiserver之间认证失败、etcd集群节点失联等问题。
多Master集群中,每台节点的apiserver、etcd组件都使用本地证书对外提供服务,单节点续期无法覆盖所有组件的证书更新需求。
✅ 多Master节点续期正确操作流程
逐台检查‌:在所有控制平面节点执行 kubeadm certs check-expiration,统一确认所有节点的证书有效期状态。
逐台备份‌:每台节点都要单独备份本地证书目录,避免单节点操作失误无法回滚。
逐台续期‌:依次在每台Master节点执行 kubeadm certs renew all,不要并行操作,避免集群短暂不可用时间叠加。
逐台生效‌:每台节点续期完成后,同步更新本地admin.conf配置,重启kubelet让新证书加载生效,确认该节点组件状态正常后,再操作下一台节点。
⚠️ 避坑关键提醒
绝对不要手动将单台节点续期后的证书直接scp同步到其他Master节点,会破坏原有节点的证书标识唯一性,引发etcd集群证书冲突。
续期操作建议在业务低峰期逐台执行,单节点组件重启只会带来10~30秒的局部API短暂不可用,不会影响全集群业务Pod运行。

 

 

 

🔧 延长证书有效期(突破1年限制)

如果不想每年续期,可以使用社区成熟工具将现有集群证书有效期延长至10年,新集群甚至可以生成100年有效期的CA证书。

该方案基于开源工具 update-kube-cert,在所有控制平面节点执行即可:

git clone https: //github.com /yuyicai/update-kube-cert.git
cd update-kube-cert
# 适配 containerd 运行时,自动将所有组件证书有效期更新为10年
bash update-kubeadm-cert.sh --cri containerd

  工具会自动完成证书备份、有效期重签、组件重启全流程,执行完成后可再次校验证书有效期确认生效。

生产环境注意事项
多 Master 集群必须在‌每台控制平面节点‌上都执行续期操作,避免节点间证书不一致导致集群通信异常。
续期操作建议在业务低峰期执行,控制平面组件重启过程中会有10~30秒的API短暂不可用,不会影响集群内已运行的业务Pod。
CA根证书默认有效期为10年,kubeadm 原生续期不会修改根证书有效期,仅更新子组件证书,不会破坏集群原有信任链。
kubelet 客户端证书默认开启自动轮换,无需手动通过本流程续期,只需确保 kubelet 配置中开启 rotateCertificates: true 即可。

 

| 证书类型 | 默认有效期 |
| --- | --- |
| CA 证书(ca、etcd-ca、front-proxy-ca) | 10 年 |
| apiserver、etcd、front-proxy 等组件证书 | 1 年 |
| admin.conf 等 kubeconfig 内嵌证书 | 1 年 |
| kubelet 客户端证书 | 1 年(支持自动轮换) |

 

k8s 检查证书过期时间

kubeadm certs check-expiration

posted @ 2026-09-08 10:51  zhaoguanhao  阅读(29)  评论(0)    收藏  举报