3. kubeadm 证书轮换机制

kubeadm 管理的 PKI 证书默认有效期为 1 年。在生产集群中,证书轮换是保障控制面通信安全的核心运维操作。本章深入分析 kubeadm cert renew 命令、自动续期原理以及 kube-controller-manager 的 CSR Approve 流程。

3.1 kubeadm cert renew 命令

kubeadm cert renew 是手动触发证书续期的入口命令。它不会重启任何控制面组件,仅更新本地证书文件,需要管理员手动 reload 或重启对应 Pod。

子命令 作用 典型场景
kubeadm cert renew all 续期所有 kubeadm 管理的证书 批量轮换,配合重启控制面 Pod
kubeadm cert renew apiserver 仅续期 apiserver 证书 API Server 证书即将过期
kubeadm cert renew etcd-healthcheck-client 续期 etcd 健康检查客户端证书 etcd 通信异常排查后修复
kubeadm cert renew --help 查看所有可续期的证书名称 确认当前版本支持的证书列表
关键行为:kubeadm cert renew 使用与原始证书相同的私钥重新生成证书,因此不会改变证书的 Subject / SAN。如果 SAN 需要变更,必须重新生成 CSR 或使用 kubeadm init phase certs 覆盖。

3.2 证书自动续期原理

kubeadm 在 v1.15+ 版本中引入了 kubelet 客户端证书自动续期 机制,但控制面证书(apiserver、etcd、front-proxy 等)默认不自动续期。自动续期依赖以下两个组件协作:

  • kubelet:在证书剩余时间 < 80% 时,自动向 apiserver 发起 CSR。
  • kube-controller-manager:内置的 csrapproving 控制器自动审批符合策略的 CSR。

控制面证书的自动续期需要额外配置 kubeadm.conf 中的 CertificateRotation 特性门控(v1.17+ 默认启用),但实际生产环境中仍建议通过 cronjob 或定期手动轮换控制面证书。

建议:控制面证书使用 kubeadm cert renew all + 滚动重启控制面 Pod 的方式,kubelet 证书依赖自动 CSR 续期。两者结合可覆盖集群全部证书轮换需求。
kubeadm 证书轮换流程 kubeadm cert renew 更新本地证书文件 需手动重启 Pod kubelet 自动 CSR 剩余 < 80% 发起 CSR kcm 自动 Approve 证书生效

3.3 kube-controller-manager CSR Approve

kube-controller-manager(kcm)中的 csrapproving 控制器是自动续期的核心决策者。它根据以下策略自动批准或拒绝 CSR:

CSR 类型 自动批准条件 拒绝条件
nodeclient 请求者与 Node 名称一致,且 Group 为 system:nodes SAN 包含非节点 IP 或 DNS
selfnodeclient 已有同名已批准 CSR,且私钥一致 私钥不匹配或节点已删除
kubelet-serving 请求者与 Node 名称一致,且 DNS/IP 属于该 Node 请求的 SAN 超出节点地址范围
常见问题:如果 kcm 的 --cluster-signing-cert-file 和 --cluster-signing-key-file 指向的 CA 证书过期,CSR Approve 将失败。此时需要先轮换 CA 证书,再处理节点 CSR。
kcm CSR Approve 决策流程 CSR 请求到达 验证请求者身份 匹配自动批准策略 不匹配 → 等待人工 Approved Pending / Denied

3.4 证书轮换兼容性排查清单

在执行证书轮换前,建议按以下清单逐项排查,避免因证书不兼容导致集群通信中断:

  1. CA 证书有效期:检查 /etc/kubernetes/pki/ca.crt 是否在有效期内,CA 过期会导致所有子证书验证失败。
  2. 证书 SAN 一致性:轮换后证书的 SAN 必须包含所有控制面 Endpoint(VIP、负载均衡域名、节点 IP)。
  3. kubeconfig 文件:admin.conf、kubelet.conf 等文件中的 certificate-authority-data 需与当前 CA 匹配。
  4. etcd 证书:etcd 集群成员证书必须使用相同的 CA 签发,且 peer 证书的 SAN 包含所有 etcd 节点地址。
  5. kubelet 证书:kubelet 客户端证书由 system:nodes 组签发,轮换后需确认 kubelet 能重新注册。
验证命令:
# 查看证书过期时间
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -enddate

# 验证证书与 CA 匹配
openssl verify -CAfile /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/apiserver.crt

# 查看证书 SAN
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"