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