3、证书轮换机制:kubeadm证书自动轮换、kubelet证书轮换、controller-manager证书轮换、API Server证书轮换
Kubernetes 集群的证书体系是保障组件间 mTLS 通信安全的基石。证书轮换机制若失效,将直接导致组件认证失败、调度器无法连接 API Server、kubelet 无法注册节点等严重故障。本章深入剖析 kubeadm、kubelet、controller-manager 和 API Server 四大核心组件的证书轮换原理与常见失败场景。
3.1 证书体系总览
K8s 集群内部主要使用以下证书类型,其轮换策略与生命周期各不相同:
| 证书类型 | 签发者 | 默认有效期 | 轮换触发方式 | 失败影响 |
|---|---|---|---|---|
| CA 证书(根证书) | 自签 / 外部 CA | 10 年 | 手动更新 | 所有子证书信任链断裂 |
| API Server 证书 | 集群 CA | 1 年 | kubeadm 自动 / 手动 | kubectl、组件无法访问 API |
| kubelet 服务端证书 | 集群 CA | 1 年 | kubelet 自动轮换 | API Server 无法访问 kubelet |
| kubelet 客户端证书 | 集群 CA | 1 年 | kubelet 自动轮换 | kubelet 无法注册/上报状态 |
| controller-manager 证书 | 集群 CA | 1 年 | kubeadm 自动 / 手动 | 控制器无法与 API Server 通信 |
| scheduler 证书 | 集群 CA | 1 年 | kubeadm 自动 / 手动 | 调度器无法与 API Server 通信 |
排查要点: 证书轮换失败通常表现为
x509: certificate has expired 或 Unauthorized 错误。优先检查证书剩余有效期和轮换日志。
3.2 kubeadm 证书自动轮换机制
kubeadm 在 v1.15+ 版本中引入了证书自动轮换功能,通过 kubeadm certs renew 命令或控制面组件重启触发。其核心流程如下:
kubeadm 自动轮换的触发条件与操作命令:
- 自动触发: 控制面组件(kube-apiserver、kube-controller-manager、kube-scheduler)启动时检测证书有效期,若剩余不足 30 天则自动发起轮换。
- 手动触发: 执行
kubeadm certs renew all强制轮换所有证书,或指定kubeadm certs renew apiserver轮换单个证书。 - 验证轮换: 使用
kubeadm certs check-expiration查看所有证书的到期时间。
高危场景: 若 CA 证书本身已过期,kubeadm 无法自动轮换子证书。此时必须手动更新 CA 证书并重新签发所有组件证书,否则集群将完全不可用。
3.3 kubelet 证书轮换机制
kubelet 使用 --rotate-certificates 和 --rotate-server-certificates 两个特性门控控制客户端与服务端证书的自动轮换。kubelet 证书轮换失败是导致节点 NotReady 的常见原因之一。
kubelet 证书轮换的关键配置参数:
| 参数 | 默认值 | 说明 | 失败场景 |
|---|---|---|---|
--rotate-certificates |
true | 启用客户端证书自动轮换 | kubelet 无法向 API Server 认证 |
--rotate-server-certificates |
false | 启用服务端证书自动轮换 | kubectl logs/exec 无法连接 kubelet |
RotateKubeletServerCertificate |
特性门控 | 控制服务端证书轮换功能开关 | 需在 kubelet 配置中显式开启 |
排查命令:
# 查看 kubelet 证书有效期
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
# 查看 CSR 审批状态
kubectl get csr --field-selector spec.signerName=kubernetes.io/kubelet-serving
# 查看 kubelet 日志中的证书错误
journalctl -u kubelet -n 50 | grep -i cert
3.4 controller-manager 证书轮换
kube-controller-manager 使用 /etc/kubernetes/pki/ 目录下的证书连接 API Server。其证书轮换由 kubeadm 统一管理,但存在以下特殊失败场景:
- CSR 自动批准控制器失效: kube-controller-manager 中的
csrapproving控制器负责自动批准 kubelet 的 CSR。若该控制器证书过期,将导致所有 kubelet CSR 处于 Pending 状态。 - 证书与组件配置不匹配: 手动替换证书后未更新
/etc/kubernetes/controller-manager.conf中的证书路径或内容。 - Leader Election 证书失效: 多副本 controller-manager 使用证书进行租约认证,证书过期会导致选主失败。
典型故障现象: 集群中大量 Node 状态为 NotReady,
kubectl get csr 显示大量 Pending CSR,且 kube-controller-manager 日志中出现 Failed to approve CSR 或 x509: certificate has expired。
3.5 API Server 证书轮换
API Server 证书是集群的入口凭证,其轮换失败将导致整个集群不可访问。API Server 证书轮换涉及以下关键文件:
| 文件路径 | 用途 | 轮换方式 |
|---|---|---|
/etc/kubernetes/pki/apiserver.crt |
API Server 服务端证书 | kubeadm certs renew apiserver |
/etc/kubernetes/pki/apiserver-kubelet-client.crt |
API Server 连接 kubelet 的客户端证书 | kubeadm certs renew apiserver-kubelet-client |
/etc/kubernetes/pki/apiserver-etcd-client.crt |
API Server 连接 etcd 的客户端证书 | kubeadm certs renew apiserver-etcd-client |
API Server 证书轮换失败的高危场景:
- SAN 缺失: 新证书未包含所有 API Server 的 DNS 名称和 IP 地址(如
kubernetes、kubernetes.default.svc、节点 IP 等),导致客户端 TLS 验证失败。 - etcd 证书不匹配: API Server 与 etcd 之间的双向 TLS 认证要求双方证书均由同一 CA 签发。轮换 API Server 证书时若未同步轮换 etcd 证书,将导致 etcd 连接中断。
- kubeconfig 未更新: 轮换 API Server 证书后,
/etc/kubernetes/admin.conf、controller-manager.conf、scheduler.conf中的 CA 数据若未同步更新,组件将无法连接 API Server。
安全轮换步骤:
# 1. 备份现有证书
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
# 2. 轮换 API Server 证书
kubeadm certs renew apiserver
# 3. 更新 kubeconfig 文件中的 CA 数据
kubeadm init phase kubeconfig all --config=kubeadm-config.yaml
# 4. 重启 API Server 静态 Pod
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/ && sleep 5 && mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
# 5. 验证新证书
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -E "Not Before|Not After|Subject Alternative Name"
3.6 证书轮换失败通用排查清单
当证书轮换导致调度异常时,按以下清单逐项排查:
| 步骤 | 检查项 | 命令 / 方法 | 预期结果 |
|---|---|---|---|
| 1 | 证书有效期 | kubeadm certs check-expiration |
所有证书剩余 > 30 天 |
| 2 | CA 证书状态 | openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -dates |
CA 证书未过期 |
| 3 | CSR 审批状态 | kubectl get csr -o wide |
无 Pending CSR |
| 4 | kubelet 证书 | openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates |
证书在有效期内 |
| 5 | 组件日志 | journalctl -u kubelet -n 100 | grep -i cert |
无 x509 错误 |
| 6 | kubeconfig 一致性 | grep certificate-authority-data /etc/kubernetes/*.conf | head -1 |
CA 数据与 ca.crt 一致 |
最佳实践: 建议在证书到期前 60 天设置监控告警,使用
kubeadm certs check-expiration 定期巡检。对于生产集群,考虑使用 cert-manager 等外部工具实现证书生命周期自动化管理。