3、证书轮换机制:kubeadm证书自动轮换、手动轮换、证书续期策略与触发条件
Kubernetes 集群中,证书是组件间通信的信任基石。kubeadm 部署的集群默认签发有效期为 1 年的证书。若证书过期,kube-apiserver、kube-controller-manager、kube-scheduler 等核心组件将无法建立 TLS 连接,导致集群控制面瘫痪。本章深入剖析 kubeadm 的证书轮换机制,涵盖自动轮换、手动轮换、续期策略及触发条件,帮助运维人员在集群升级场景中精准管理证书生命周期。
3.1 证书体系概览
kubeadm 生成的证书主要分为以下几类,每类证书的用途、路径和默认有效期如下表所示:
| 证书名称 | 用途 | 默认路径 | 默认有效期 |
|---|---|---|---|
| CA 证书 | 集群根证书,用于签发其他证书 | /etc/kubernetes/pki/ca.crt | 10 年 |
| API Server 证书 | kube-apiserver 对外提供 HTTPS 服务 | /etc/kubernetes/pki/apiserver.crt | 1 年 |
| API Server Kubelet 客户端证书 | apiserver 连接 kubelet 时使用 | /etc/kubernetes/pki/apiserver-kubelet-client.crt | 1 年 |
| Front Proxy 证书 | API Server 聚合层代理通信 | /etc/kubernetes/pki/front-proxy-client.crt | 1 年 |
| etcd 证书 | etcd 集群内部通信及客户端连接 | /etc/kubernetes/pki/etcd/server.crt | 1 年 |
| kubeconfig 文件 | admin、kubelet、controller-manager 等客户端凭证 | /etc/kubernetes/*.conf | 1 年 |
3.2 自动证书轮换机制
kubeadm 从 v1.15 版本开始支持控制面证书的自动轮换。该机制依赖 kube-controller-manager 中的 csrapproving 控制器和 CertificateSigningRequest (CSR) API。
3.2.1 自动轮换流程
当节点证书剩余时间不足总有效期的 80% 时,kubelet 会自动发起 CSR 请求。整个自动轮换流程如下:
- 检测触发:kubelet 定期检查本地证书的有效期,当剩余时间 < 80% 时,生成新的私钥和 CSR。
- 提交 CSR:kubelet 通过
certificates.k8s.ioAPI 向 API Server 提交 CSR 对象。 - 自动审批:kube-controller-manager 中的
csrapproving控制器验证 CSR 的签名和身份,若符合节点身份规则,则自动批准。 - 签发证书:kube-controller-manager 中的
csrsigning控制器使用集群 CA 签发新证书。 - 证书更新:kubelet 获取新证书并写入本地磁盘,同时更新内存中的 TLS 配置。
3.2.2 自动轮换的局限性
3.3 手动证书轮换
对于控制面证书、CA 证书或自动轮换失效的场景,运维人员需要执行手动轮换。kubeadm 提供了 kubeadm certs renew 命令来简化此操作。
3.3.1 手动轮换步骤
- 检查证书过期时间:
该命令会列出所有证书的剩余时间、有效期和 SAN 信息。kubeadm certs check-expiration - 续期指定证书:
支持续期的证书包括:kubeadm certs renew apiserverapiserver、apiserver-kubelet-client、front-proxy-client、etcd-server、etcd-peer、etcd-healthcheck-client、admin.conf等。 - 续期所有证书:
该命令会续期所有非 CA 证书,但不会重启任何组件。kubeadm certs renew all - 重启控制面组件:
证书续期后,必须重启使用该证书的 Pod 才能加载新证书。推荐使用以下方式:
# 移动静态 Pod 清单,触发 kubelet 重建 mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/ sleep 5 mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/ - 更新 kubeconfig 文件:
如果续期了
admin.conf、kubelet.conf等文件,需要将新文件复制到对应位置:cp /etc/kubernetes/admin.conf ~/.kube/config
3.3.2 手动轮换 vs 自动轮换对比
| 对比维度 | 自动轮换 | 手动轮换 |
|---|---|---|
| 适用范围 | 仅 kubelet 证书 | 所有证书(包括控制面、etcd) |
| 触发方式 | 时间阈值自动触发 | 运维人员手动执行命令 |
| 组件重启 | kubelet 自动重载 | 需要手动重启静态 Pod |
| 风险等级 | 低(自动化程度高) | 中(需操作者熟悉流程) |
| 适用场景 | 日常节点证书维护 | 集群升级、证书过期修复、CA 更换 |
3.4 证书续期策略与触发条件
证书续期策略决定了何时以及如何触发证书更新。kubeadm 集群中,证书续期策略分为以下三个层级:
3.4.1 基于时间的续期策略
- kubelet 自动续期:证书剩余时间 < 80% 时触发(约 73 天)。
- kubeadm 升级续期:执行
kubeadm upgrade apply时,kubeadm 会自动续期所有控制面证书。 - 手动续期:运维人员通过
kubeadm certs renew随时触发。
3.4.2 基于事件的续期策略
- 集群升级事件:每次升级控制面版本时,kubeadm 默认执行证书续期。
- CA 更换事件:当集群 CA 证书被替换时,所有由旧 CA 签发的证书必须立即续期。
- 节点重建事件:节点被重新初始化或加入集群时,kubelet 会重新申请证书。
3.4.3 续期策略配置
kubeadm 允许通过 kubeadm-config ConfigMap 中的 ClusterConfiguration 调整证书续期行为:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.0
certificateValidity:
# 控制面证书有效期(默认 1 年)
ca: 87600h # 10 年
server: 8760h # 1 年
client: 8760h # 1 年
etcd: 8760h # 1 年
etcdPeer: 8760h # 1 年
etcdHealthcheck: 8760h # 1 年
frontProxyClient: 8760h # 1 年
# kubelet 证书有效期(默认 1 年)
kubelet: 8760h
# kubelet 自动续期阈值(百分比)
kubeletAutoRenewThreshold: 0.8
3.5 证书轮换与 Pod 调度的协同
证书轮换与 Pod 调度之间存在紧密的协同关系。证书过期或轮换失败会直接影响 Pod 的调度和运行状态:
- 证书过期导致 API Server 不可用:kube-scheduler 无法与 API Server 通信,调度队列阻塞,新 Pod 无法被调度。
- kubelet 证书过期:kubelet 无法向 API Server 注册节点状态,节点被标记为
NotReady,已有 Pod 被驱逐。 - 证书轮换期间的调度策略:在手动轮换控制面证书时,建议先通过
kubectl cordon将节点标记为不可调度,待证书更新并验证通过后再uncordon。
3.6 证书轮换故障恢复
当证书轮换失败时,集群可能陷入不可用状态。以下是常见故障场景及恢复步骤:
| 故障场景 | 现象 | 恢复步骤 |
|---|---|---|
| API Server 证书过期 | kubectl 无法连接,apiserver 日志报 TLS 错误 |
1. 登录控制面节点 2. 执行 kubeadm certs renew apiserver3. 重启 kube-apiserver 静态 Pod 4. 验证 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
|
| kubelet 证书过期 | 节点状态 NotReady,kubelet 日志报证书错误 |
1. 登录问题节点 2. 删除过期证书: rm /var/lib/kubelet/pki/kubelet-client-current.pem3. 重启 kubelet: systemctl restart kubelet4. kubelet 自动生成新 CSR 并等待审批 |
| etcd 证书过期 | etcd 集群成员无法通信,控制面组件连接 etcd 超时 |
1. 停止 etcd 服务 2. 执行 kubeadm certs renew etcd-server etcd-peer etcd-healthcheck-client3. 重启 etcd 静态 Pod 4. 验证 etcd 集群健康: etcdctl endpoint health
|
| CA 证书过期 | 所有证书验证失败,集群完全不可用 |
1. 生成新 CA 证书和密钥 2. 使用新 CA 重新签发所有证书 3. 更新所有节点的 CA 信任链 4. 重启所有控制面组件和 kubelet 注意:此操作风险极高,建议在测试环境演练 |
kubeadm certs check-expiration 检查证书状态。若证书剩余时间不足 30 天,先手动续期再执行升级操作,避免升级过程中证书过期导致升级失败。