4. 故障根因分析:证书过期/不匹配导致 API Server 拒绝 kube-controller-manager 请求

当集群证书轮换操作未遵循严格的顺序或存在配置遗漏时,kube-controller-manager 与 API Server 之间的双向 TLS 认证会因证书过期或 CN/组织不匹配而失败。API Server 一旦拒绝来自 controller-manager 的请求,所有依赖控制器循环的副本管理机制(如 Deployment、StatefulSet、ReplicaSet)将立即失效。

4.1 证书认证链路与故障点

kube-controller-manager 通过 --kubeconfig 或 --client-ca-file 加载客户端证书,向 API Server 发起请求。API Server 使用 --client-ca-file 验证客户端证书的签发者,并检查证书中的 CN(Common Name)是否映射到合法的 RBAC 主体。证书轮换过程中,以下三个环节最容易出现断裂:

环节 正常状态 故障状态
证书有效期 客户端证书 notAfter 晚于当前时间 证书已过期,API Server 返回 tls: bad certificate
签发者匹配 客户端证书由 API Server 信任的 CA 签发 轮换后使用了不同 CA 或中间 CA,API Server 不信任该签发者
CN/组织映射 CN 为 system:kube-controller-manager 或对应组织 CN 被修改或缺失,RBAC 绑定失效,请求被 403 拒绝
关键日志线索: 在 controller-manager Pod 日志中搜索 Unauthorized、certificate has expired 或 tls: bad certificate;在 API Server 审计日志中搜索 Decision=deny 且 User=system:kube-controller-manager 的记录。

4.2 证书轮换导致故障的典型路径

以下流程展示了从证书轮换开始到 Deployment 副本数异常的完整因果链:

  1. 运维人员执行证书轮换脚本,生成新的 kube-controller-manager 客户端证书和密钥。
  2. 证书被分发到 controller-manager 所在节点,但未同步更新 API Server 的 --client-ca-file 所指向的 CA 证书(或 CA 证书链不完整)。
  3. kube-controller-manager 重新加载证书(或 Pod 重启后加载新证书),向 API Server 发起 List/Watch 请求。
  4. API Server 验证客户端证书失败,原因可能是:
    • 新证书由新 CA 签发,而 API Server 仍使用旧 CA 文件。
    • 新证书的 notAfter 时间早于当前时间(生成时时钟偏差或过期)。
    • 新证书的 CN 不是 system:kube-controller-manager,导致 RBAC 绑定不生效。
  5. API Server 返回 401/403 错误,controller-manager 的 informer 无法同步资源。
  6. 控制器循环中断,ReplicaSet 控制器无法更新 status.readyReplicas,Deployment 控制器无法执行滚动更新或扩缩容。
  7. 用户观察到 Deployment 副本数异常:kubectl get deployment 显示 READY 列与实际 Pod 数量不一致,或 kubectl scale 命令无响应。
证书轮换故障因果链 ① 证书轮换执行 ② 新证书分发到节点 ③ API Server 验证 ④ 验证失败 ⑤ 控制器循环中断 ⑥ Deployment 副本异常 故障放大因素 • 证书轮换未同步更新 API Server 的 --client-ca-file • 新证书 CN 不是 system:kube-controller-manager • 轮换后未重启 controller-manager Pod 或证书热加载失败 • 集群中存在多个 CA 且 controller-manager 使用了错误的 CA 签发

4.3 证书不匹配的三种具体场景

场景 错误表现 根因
CA 不匹配 API Server 日志:tls: failed to verify client certificate: x509: certificate signed by unknown authority controller-manager 客户端证书由新 CA 签发,但 API Server 的 --client-ca-file 仍指向旧 CA 证书文件
证书过期 API Server 日志:tls: bad certificate 或 certificate has expired or is not yet valid 轮换时使用了已过期证书,或节点时钟偏差导致证书被认为过期
CN/组织缺失 API Server 审计日志:Decision=deny, Reason=RBAC: role not found 新证书的 CN 不是 system:kube-controller-manager,或组织 (O) 字段未设置为 system:masters
快速验证命令: 使用 openssl x509 -in /path/to/controller-manager.crt -text -noout 检查证书的 Issuer、Subject(CN)和 Validity 字段。对比 API Server 的 --client-ca-file 中的 CA 证书指纹是否一致。

4.4 故障影响范围

证书认证失败导致 controller-manager 无法与 API Server 通信,直接影响以下控制器功能:

  • ReplicaSet 控制器:无法创建/删除 Pod,无法更新 status.readyReplicas。
  • Deployment 控制器:无法执行滚动更新、回滚、扩缩容。
  • StatefulSet 控制器:无法管理有状态 Pod 的启动顺序和持久化存储。
  • DaemonSet 控制器:无法在新增节点上自动调度 Pod。
  • Job/CronJob 控制器:无法创建新的 Job Pod。
注意: 证书故障不会导致已有 Pod 被立即删除,但所有依赖控制器循环的自动化运维操作(如 HPA 自动扩缩、滚动更新、故障自愈)将完全失效。集群进入“半瘫痪”状态,手动 kubectl run 创建的 Pod 仍可运行,但 Deployment 管理的副本数将永久停滞。