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 手动轮换流程

手动轮换适用于需要精确控制轮换时间窗口的场景,例如配合变更窗口执行。标准步骤:

  1. 检查当前证书过期时间:kubeadm certs check-expiration
  2. 备份现有证书:cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
  3. 执行证书续签:kubeadm certs renew all
  4. 更新 kubeconfig 文件:kubeadm init phase kubeconfig all --config kubeadm-config.yaml
  5. 重启控制平面静态 Pod:docker restart 或 crictl restart 或直接删除 Pod 由 kubelet 重建
  6. 更新 kubelet 证书:kubeadm upgrade node phase kubelet-config 或手动替换 kubelet 证书
  7. 验证新证书: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 证书更新完整流程

下图展示了从证书过期检测到集群恢复的完整更新流程:

kubeadm 证书更新完整流程 kubeadm 证书更新完整流程 1. 检测证书过期 2. 备份证书目录 3. 执行续签命令 4. 更新 kubeconfig 文件 5. 重启控制平面组件 6. 更新 kubelet 证书 7. 验证新证书与集群健康 成功? ✅ 轮换完成 ❌ 回滚备份 说明:手动轮换需执行步骤 1-7;自动轮换仅需确保 kube-controller-manager CSR 审批控制器正常运行 证书续签后必须重启对应组件,否则旧证书仍被使用

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>
💡 最佳实践:生产环境建议采用 手动轮换 + 自动化脚本 的方式,在变更窗口内执行证书更新,同时保留备份用于回滚。自动轮换适用于测试环境或已建立完善监控告警的生产集群。