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 年
关键认知:CA 证书有效期长达 10 年,而节点证书仅 1 年。这意味着在集群生命周期内,节点证书需要多次轮换,而 CA 证书通常只在集群初始化或重大安全事件时才更换。

3.2 自动证书轮换机制

kubeadm 从 v1.15 版本开始支持控制面证书的自动轮换。该机制依赖 kube-controller-manager 中的 csrapproving 控制器和 CertificateSigningRequest (CSR) API。

3.2.1 自动轮换流程

当节点证书剩余时间不足总有效期的 80% 时,kubelet 会自动发起 CSR 请求。整个自动轮换流程如下:

  1. 检测触发:kubelet 定期检查本地证书的有效期,当剩余时间 < 80% 时,生成新的私钥和 CSR。
  2. 提交 CSR:kubelet 通过 certificates.k8s.io API 向 API Server 提交 CSR 对象。
  3. 自动审批:kube-controller-manager 中的 csrapproving 控制器验证 CSR 的签名和身份,若符合节点身份规则,则自动批准。
  4. 签发证书:kube-controller-manager 中的 csrsigning 控制器使用集群 CA 签发新证书。
  5. 证书更新:kubelet 获取新证书并写入本地磁盘,同时更新内存中的 TLS 配置。
kubeadm 自动证书轮换流程图 kubelet 检测证书 生成新私钥 & CSR 提交 CSR 至 API csrapproving 审批 csrsigning 签发 kubelet 更新证书 触发条件: • 证书剩余时间 < 总有效期的 80%(默认 1 年证书,剩余约 73 天触发) • kubelet 每 5 分钟检查一次证书状态 • 仅对 kubelet 客户端证书和 kubelet 服务端证书生效

3.2.2 自动轮换的局限性

注意:自动轮换仅适用于 kubelet 证书。控制面组件(如 kube-apiserver、etcd)的证书不会自动轮换,必须通过手动方式或集群升级流程处理。

3.3 手动证书轮换

对于控制面证书、CA 证书或自动轮换失效的场景,运维人员需要执行手动轮换。kubeadm 提供了 kubeadm certs renew 命令来简化此操作。

3.3.1 手动轮换步骤

  1. 检查证书过期时间:
    kubeadm certs check-expiration
    该命令会列出所有证书的剩余时间、有效期和 SAN 信息。
  2. 续期指定证书:
    kubeadm certs renew apiserver
    支持续期的证书包括:apiserver、apiserver-kubelet-client、front-proxy-client、etcd-server、etcd-peer、etcd-healthcheck-client、admin.conf 等。
  3. 续期所有证书:
    kubeadm certs renew all
    该命令会续期所有非 CA 证书,但不会重启任何组件。
  4. 重启控制面组件:

    证书续期后,必须重启使用该证书的 Pod 才能加载新证书。推荐使用以下方式:

    # 移动静态 Pod 清单,触发 kubelet 重建
    mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
    sleep 5
    mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
  5. 更新 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
最佳实践:在生产环境中,建议将控制面证书有效期设置为 2-3 年(17520h-26280h),以减少手动轮换频率。同时,开启 kubelet 自动轮换并设置合理的阈值(0.8),确保节点证书在过期前有充足的时间完成续期。

3.5 证书轮换与 Pod 调度的协同

证书轮换与 Pod 调度之间存在紧密的协同关系。证书过期或轮换失败会直接影响 Pod 的调度和运行状态:

  • 证书过期导致 API Server 不可用:kube-scheduler 无法与 API Server 通信,调度队列阻塞,新 Pod 无法被调度。
  • kubelet 证书过期:kubelet 无法向 API Server 注册节点状态,节点被标记为 NotReady,已有 Pod 被驱逐。
  • 证书轮换期间的调度策略:在手动轮换控制面证书时,建议先通过 kubectl cordon 将节点标记为不可调度,待证书更新并验证通过后再 uncordon。
证书轮换与 Pod 调度协同关系图 证书层(Certificate Layer) CA 证书 | API Server 证书 | kubelet 证书 | etcd 证书 控制面层(Control Plane Layer) kube-apiserver | kube-controller-manager | kube-scheduler | etcd 调度层(Scheduler Layer) Pod 调度 | 节点状态管理 | 资源分配 | 污点容忍

3.6 证书轮换故障恢复

当证书轮换失败时,集群可能陷入不可用状态。以下是常见故障场景及恢复步骤:

故障场景 现象 恢复步骤
API Server 证书过期 kubectl 无法连接,apiserver 日志报 TLS 错误 1. 登录控制面节点
2. 执行 kubeadm certs renew apiserver
3. 重启 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.pem
3. 重启 kubelet:systemctl restart kubelet
4. kubelet 自动生成新 CSR 并等待审批
etcd 证书过期 etcd 集群成员无法通信,控制面组件连接 etcd 超时 1. 停止 etcd 服务
2. 执行 kubeadm certs renew etcd-server etcd-peer etcd-healthcheck-client
3. 重启 etcd 静态 Pod
4. 验证 etcd 集群健康:etcdctl endpoint health
CA 证书过期 所有证书验证失败,集群完全不可用 1. 生成新 CA 证书和密钥
2. 使用新 CA 重新签发所有证书
3. 更新所有节点的 CA 信任链
4. 重启所有控制面组件和 kubelet
注意:此操作风险极高,建议在测试环境演练
预防建议:在集群升级前,务必执行 kubeadm certs check-expiration 检查证书状态。若证书剩余时间不足 30 天,先手动续期再执行升级操作,避免升级过程中证书过期导致升级失败。