4. kubeadm 证书轮换:kubeadm certs renew 命令详解、手动轮换与自动轮换、kubeadm 证书更新流程
4.1 证书轮换背景与必要性
Kubernetes 集群中,kubeadm 部署的控制平面组件(API Server、Controller Manager、Scheduler)以及 kubelet 与 API Server 之间的通信均依赖 TLS 证书。kubeadm 默认签发的证书有效期为 1 年。证书过期后,集群将无法正常通信,kubectl 命令失效,节点状态异常。
⚠️ 关键风险:证书过期不会自动触发集群停机,但会导致 API Server 拒绝所有 TLS 握手,集群进入不可用状态。生产环境必须在证书到期前完成轮换。
4.2 kubeadm certs renew 命令详解
kubeadm certs renew 是 kubeadm 提供的证书续签命令,支持对单个或全部证书进行轮换。命令格式如下:
# 查看所有可续签的证书列表
kubeadm certs renew --help
# 续签所有证书
kubeadm certs renew all
# 续签单个证书(例如 API Server 证书)
kubeadm certs renew apiserver
# 查看证书过期时间
kubeadm certs check-expiration
4.2.1 可续签证书清单
| 证书名称 | 证书文件路径 | 用途 |
|---|---|---|
| apiserver | /etc/kubernetes/pki/apiserver.crt | API Server 对外服务证书 |
| apiserver-kubelet-client | /etc/kubernetes/pki/apiserver-kubelet-client.crt | API Server 连接 kubelet 客户端证书 |
| front-proxy-client | /etc/kubernetes/pki/front-proxy-client.crt | 聚合 API 代理客户端证书 |
| etcd-server | /etc/kubernetes/pki/etcd/server.crt | etcd 服务端证书 |
| etcd-peer | /etc/kubernetes/pki/etcd/peer.crt | etcd 节点间通信证书 |
| etcd-healthcheck-client | /etc/kubernetes/pki/etcd/healthcheck-client.crt | etcd 健康检查客户端证书 |
| apiserver-etcd-client | /etc/kubernetes/pki/apiserver-etcd-client.crt | API Server 连接 etcd 客户端证书 |
| admin.conf | /etc/kubernetes/admin.conf | 管理员 kubeconfig 客户端证书 |
4.2.2 命令执行效果
执行 kubeadm certs renew all 后,kubeadm 会基于现有的 CA 证书重新签发所有证书,新证书有效期从当前时间起算 1 年。命令输出示例:
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[renew] Renewing apiserver certificate
[renew] Renewing apiserver-kubelet-client certificate
[renew] Renewing front-proxy-client certificate
[renew] Renewing etcd-server certificate
[renew] Renewing etcd-peer certificate
[renew] Renewing etcd-healthcheck-client certificate
[renew] Renewing apiserver-etcd-client certificate
[renew] Renewing admin.conf certificate
[renew] Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.
💡 注意:
kubeadm certs renew 只负责生成新证书文件,不会自动重启控制平面组件。证书更新后必须手动重启相关 Pod 或静态 Pod 才能生效。
4.3 手动轮换 vs 自动轮换
4.3.1 手动轮换流程
手动轮换适用于需要精确控制轮换时间窗口的场景,例如配合变更窗口执行。标准步骤:
- 检查当前证书过期时间:
kubeadm certs check-expiration - 备份现有证书:
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak - 执行证书续签:
kubeadm certs renew all - 更新 kubeconfig 文件:
kubeadm init phase kubeconfig all --config kubeadm-config.yaml - 重启控制平面静态 Pod:
docker restart或crictl restart或直接删除 Pod 由 kubelet 重建 - 更新 kubelet 证书:
kubeadm upgrade node phase kubelet-config或手动替换 kubelet 证书 - 验证新证书:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not After
4.3.2 自动轮换机制
kubeadm 从 v1.15 开始支持 kubelet 客户端证书自动轮换,从 v1.17 开始支持 控制平面证书自动轮换(需启用 RotateKubeletServerCertificate 特性门控)。自动轮换依赖以下组件:
- kube-controller-manager:内置的
csrapproving控制器自动批准证书签名请求(CSR) - kubelet:定期检查本地证书过期时间,过期前自动发起 CSR
- CA 证书:集群 CA 证书必须有效,自动轮换不会更新 CA 本身
4.3.3 手动 vs 自动对比
| 对比维度 | 手动轮换 | 自动轮换 |
|---|---|---|
| 操作复杂度 | 高,需多步手动执行 | 低,集群自动完成 |
| 控制粒度 | 精确控制轮换时间 | 依赖控制器调度周期 |
| 适用场景 | 生产变更窗口、合规审计 | 开发测试、自动化运维 |
| CA 证书更新 | 支持手动替换 CA | 不支持自动更新 CA |
| 重启影响 | 需手动重启组件 | kubelet 自动重启,控制平面需手动 |
| 失败恢复 | 可回滚备份证书 | 需手动干预 CSR 审批 |
4.4 kubeadm 证书更新完整流程
下图展示了从证书过期检测到集群恢复的完整更新流程:
4.5 证书轮换关键操作示例
4.5.1 检查证书过期时间
# 使用 kubeadm 命令
kubeadm certs check-expiration
# 输出示例
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Apr 10, 2026 08:12 UTC 364d no
apiserver Apr 10, 2026 08:12 UTC 364d ca no
apiserver-kubelet-client Apr 10, 2026 08:12 UTC 364d ca no
controller-manager.conf Apr 10, 2026 08:12 UTC 364d no
etcd-healthcheck-client Apr 10, 2026 08:12 UTC 364d etcd-ca no
etcd-peer Apr 10, 2026 08:12 UTC 364d etcd-ca no
etcd-server Apr 10, 2026 08:12 UTC 364d etcd-ca no
front-proxy-client Apr 10, 2026 08:12 UTC 364d front-proxy-ca no
scheduler.conf Apr 10, 2026 08:12 UTC 364d no
4.5.2 重启控制平面静态 Pod
# 方法一:删除静态 Pod 由 kubelet 自动重建(推荐)
kubectl -n kube-system delete pod kube-apiserver-<node-name>
kubectl -n kube-system delete pod kube-controller-manager-<node-name>
kubectl -n kube-system delete pod kube-scheduler-<node-name>
# 方法二:使用 crictl 重启容器(CRI 运行时)
crictl ps | grep -E 'kube-apiserver|kube-controller|kube-scheduler|etcd' | awk '{print $1}' | xargs crictl stop
# 方法三:重启 kubelet 服务(会重启所有静态 Pod)
systemctl restart kubelet
4.5.3 更新 kubelet 证书
# 手动更新 kubelet 证书(非自动轮换场景)
kubeadm init phase kubelet-finalize all --config kubeadm-config.yaml
# 验证 kubelet 证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep "Not After"
4.6 证书轮换避坑指南
🔧 常见问题与解决方案:
- 证书续签后 API Server 仍报证书错误:未重启控制平面组件,执行
kubectl delete pod -n kube-system kube-apiserver-$(hostname) - kubelet 证书未更新:检查 kubelet 配置中
rotateCertificates: true是否启用,或手动执行kubeadm init phase kubelet-finalize - etcd 集群证书不一致:多节点 etcd 集群需逐个节点轮换并重启,确保节点间证书匹配
- CA 证书过期:kubeadm 不自动轮换 CA 证书,需手动生成新 CA 并重新签发所有证书,操作复杂建议重建集群
- kubeconfig 文件未更新:执行
kubeadm init phase kubeconfig all重新生成 admin.conf、controller-manager.conf、scheduler.conf
4.7 自动轮换配置示例
启用 kubelet 自动证书轮换需要在 kubelet 配置文件中设置:
# /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
rotateCertificates: true
serverTLSBootstrap: true # 启用服务端证书自动轮换(v1.17+)
featureGates:
RotateKubeletServerCertificate: true
控制平面自动轮换依赖 kube-controller-manager 的 csrapproving 控制器,默认启用。可通过以下命令查看 CSR 自动审批状态:
# 查看待审批的 CSR
kubectl get csr
# 手动审批 CSR(自动轮换失败时备用)
kubectl certificate approve <csr-name>
💡 最佳实践:生产环境建议采用 手动轮换 + 自动化脚本 的方式,在变更窗口内执行证书更新,同时保留备份用于回滚。自动轮换适用于测试环境或已建立完善监控告警的生产集群。