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 续期。两者结合可覆盖集群全部证书轮换需求。
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。
3.4 证书轮换兼容性排查清单
在执行证书轮换前,建议按以下清单逐项排查,避免因证书不兼容导致集群通信中断:
- CA 证书有效期:检查
/etc/kubernetes/pki/ca.crt是否在有效期内,CA 过期会导致所有子证书验证失败。 - 证书 SAN 一致性:轮换后证书的 SAN 必须包含所有控制面 Endpoint(VIP、负载均衡域名、节点 IP)。
- kubeconfig 文件:
admin.conf、kubelet.conf等文件中的certificate-authority-data需与当前 CA 匹配。 - etcd 证书:etcd 集群成员证书必须使用相同的 CA 签发,且 peer 证书的 SAN 包含所有 etcd 节点地址。
- 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"