4. 证书轮换机制:kubeadm 证书自动轮换、手动轮换与 kubelet 证书轮换

Kubernetes 集群中证书的有效期直接决定了组件间通信的可靠性。当证书过期而未被轮换时,kube-proxy 与 API Server 之间的 TLS 握手将失败,导致 Service 规则无法同步。本章深入剖析 kubeadm 集群的三种证书轮换路径:自动轮换、手动轮换以及 kubelet 证书轮换,并对比其适用场景与风险。

4.1 证书轮换的核心对象与生命周期

kubeadm 部署的集群默认生成以下关键证书,它们各自拥有不同的有效期和轮换策略:

证书文件 默认有效期 轮换方式 影响组件
/etc/kubernetes/pki/apiserver.crt 1 年 手动 / kubeadm upgrade API Server
/etc/kubernetes/pki/apiserver-kubelet-client.crt 1 年 手动 / kubeadm upgrade API Server → kubelet
/etc/kubernetes/pki/ca.crt 10 年 手动(需迁移 CA) 所有组件信任链
/var/lib/kubelet/pki/kubelet-client-current.pem 1 年 自动轮换(kubelet 内置) kubelet → API Server
/etc/kubernetes/pki/front-proxy-client.crt 1 年 手动 / kubeadm upgrade kube-proxy / aggregator
关键认知:kube-proxy 使用 /etc/kubernetes/pki/front-proxy-client.crt 或 /var/lib/kubelet/pki/kubelet-client-current.pem 与 API Server 通信。当这些证书过期且未轮换时,kube-proxy 将无法 watch Service/EndpointSlice 资源,导致规则失效。

4.2 kubeadm 证书自动轮换机制

kubeadm 从 v1.15 开始支持控制平面证书的自动续期,但该机制仅在 kubeadm upgrade 过程中触发,并非后台守护进程。其工作流程如下:

  1. 触发条件:执行 kubeadm upgrade plan 或 kubeadm upgrade apply。
  2. 证书检查:kubeadm 读取 /etc/kubernetes/pki/ 下所有证书的 NotAfter 字段。
  3. 自动续期:对于剩余有效期不足 180 天的证书,kubeadm 使用现有 CA 重新签发新证书,并覆盖原文件。
  4. 组件重启:kubeadm 不会自动重启静态 Pod,需要手动 docker restart 或等待 kubelet 重新拉取清单。
自动轮换的局限性:
  • 仅通过 kubeadm upgrade 触发,无法独立运行。
  • 不覆盖 kubelet 客户端证书(kubelet 有自己的轮换机制)。
  • 升级后需手动重启控制平面容器,否则旧证书仍被加载。
kubeadm 自动轮换流程 kubeadm upgrade apply 检查证书有效期 续期 <180天证书 覆盖原证书文件 手动重启静态 Pod ⚠ 不自动重启组件 需手动 docker restart

4.3 手动轮换证书

当自动轮换无法满足需求(如 CA 过期、证书被误删、需要立即更新)时,需执行手动轮换。标准步骤如下:

  1. 备份现有证书:cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
  2. 生成新证书:使用 kubeadm init phase certs 子命令单独生成指定证书。
  3. 更新 kubeconfig:使用 kubeadm init phase kubeconfig 重新生成 admin/kubelet/controller-manager/scheduler 配置文件。
  4. 重启所有控制平面组件:通过 docker restart 或 crictl restart 重启静态 Pod。
  5. 分发新 CA 证书:如果 CA 已轮换,需将新 CA 同步到所有节点 /etc/kubernetes/pki/ca.crt。
手动轮换风险提示:
  • CA 轮换后,所有由旧 CA 签发的证书(包括 kubelet 证书)将立即失效,需批量更新。
  • kube-proxy 依赖的 front-proxy-client 证书若未同步更新,将导致 Service 规则同步中断。
  • 建议在维护窗口执行,并提前验证 kubeadm certs check-expiration 输出。

4.4 kubelet 证书轮换机制

kubelet 拥有独立的客户端证书轮换能力,由 --rotate-certificates 和 --rotate-server-certificates 参数控制。该机制与 kubeadm 控制平面证书轮换完全解耦。

参数 默认值 作用 证书路径
--rotate-certificates true 自动轮换 kubelet 客户端证书 /var/lib/kubelet/pki/kubelet-client-current.pem
--rotate-server-certificates false 自动轮换 kubelet 服务端证书 /var/lib/kubelet/pki/kubelet.crt
--cert-dir /var/lib/kubelet/pki 证书存储目录 —

kubelet 客户端证书轮换的触发条件:

  • 当前证书剩余有效期 小于 80% 总有效期(例如 1 年证书在剩余约 73 天时触发)。
  • kubelet 向 API Server 发起 CertificateSigningRequest(CSR)。
  • 集群 CSR 控制器自动批准(kubelet-serving 或 kubelet-client 组)。
  • kubelet 下载新证书并替换旧文件,同时更新符号链接 kubelet-client-current.pem。
kubelet 客户端证书自动轮换流程 kubelet 检查证书 创建 CSR 对象 CSR 自动批准 下载新证书 更新符号链接并重载 触发条件:剩余有效期 < 80% 总有效期 默认 1 年证书约 73 天触发

4.5 三种轮换机制对比总结

维度 kubeadm 自动轮换 手动轮换 kubelet 自动轮换
触发方式 kubeadm upgrade 管理员手动执行命令 kubelet 定时检查 + CSR
覆盖范围 控制平面证书(除 kubelet) 所有证书(含 CA) 仅 kubelet 客户端/服务端证书
组件重启 需手动重启静态 Pod 需手动重启 kubelet 自动重载
对 kube-proxy 影响 若 front-proxy-client 未更新则失效 需确保 front-proxy-client 同步 无直接影响(kube-proxy 使用独立证书)
推荐场景 常规版本升级 CA 过期 / 证书损坏 / 紧急修复 大规模节点证书管理
故障排查要点:当 kube-proxy 规则失效时,应优先检查 /etc/kubernetes/pki/front-proxy-client.crt 和 /var/lib/kubelet/pki/kubelet-client-current.pem 的过期时间。使用 openssl x509 -in <证书路径> -noout -text | grep -E "Not Before|Not After" 快速验证。若证书已过期,根据集群版本选择手动轮换或执行 kubeadm upgrade apply --force 触发自动续期。