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 过程中触发,并非后台守护进程。其工作流程如下:
- 触发条件:执行
kubeadm upgrade plan或kubeadm upgrade apply。 - 证书检查:kubeadm 读取
/etc/kubernetes/pki/下所有证书的NotAfter字段。 - 自动续期:对于剩余有效期不足 180 天的证书,kubeadm 使用现有 CA 重新签发新证书,并覆盖原文件。
- 组件重启:kubeadm 不会自动重启静态 Pod,需要手动
docker restart或等待 kubelet 重新拉取清单。
自动轮换的局限性:
- 仅通过
kubeadm upgrade触发,无法独立运行。 - 不覆盖 kubelet 客户端证书(kubelet 有自己的轮换机制)。
- 升级后需手动重启控制平面容器,否则旧证书仍被加载。
4.3 手动轮换证书
当自动轮换无法满足需求(如 CA 过期、证书被误删、需要立即更新)时,需执行手动轮换。标准步骤如下:
- 备份现有证书:
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak - 生成新证书:使用
kubeadm init phase certs子命令单独生成指定证书。 - 更新 kubeconfig:使用
kubeadm init phase kubeconfig重新生成 admin/kubelet/controller-manager/scheduler 配置文件。 - 重启所有控制平面组件:通过
docker restart或crictl restart重启静态 Pod。 - 分发新 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。
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 触发自动续期。