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 证书自动轮换流程 kubeadm 控制面组件 检测证书有效期 剩余 < 30 天? 生成新 CSR CA 签发新证书 替换旧证书并重启组件 常见失败原因 • CA 证书已过期 • CSR 被拒绝 • 证书存储权限不足

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 证书轮换交互流程 kubelet API Server kube-controller-manager 1. 检测证书即将过期 2. 生成 CSR 并发送 3. 创建 CertificateSigningRequest 4. 自动批准 CSR 5. 签发证书并返回 6. 更新本地证书文件

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 证书轮换失败的高危场景:

  1. SAN 缺失: 新证书未包含所有 API Server 的 DNS 名称和 IP 地址(如 kubernetes、kubernetes.default.svc、节点 IP 等),导致客户端 TLS 验证失败。
  2. etcd 证书不匹配: API Server 与 etcd 之间的双向 TLS 认证要求双方证书均由同一 CA 签发。轮换 API Server 证书时若未同步轮换 etcd 证书,将导致 etcd 连接中断。
  3. 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 等外部工具实现证书生命周期自动化管理。