4、Pod调度协同原理:调度器、kubelet、控制器管理器在证书轮换中的角色与交互流程
在Kubernetes集群证书轮换过程中,控制平面的三大核心组件——调度器(kube-scheduler)、kubelet和控制器管理器(kube-controller-manager)——并非独立工作,而是通过API Server形成紧密的协同闭环。证书轮换引发的节点状态变化、Pod重新调度、以及控制器对工作负载的修复,构成了一个典型的分布式协同场景。理解这三者的角色定位与交互流程,是诊断和恢复证书轮换故障的基础。
4.1 核心组件角色定义
下表从证书轮换视角,明确三个组件的职责边界与关键行为差异:
| 组件 | 证书轮换中的核心角色 | 关键行为 | 故障影响范围 |
|---|---|---|---|
| kube-scheduler | 调度决策者 | 基于节点证书状态过滤不可调度节点;更新Pod调度队列优先级 | 新Pod无法调度到证书异常的节点;调度队列阻塞 |
| kubelet | 节点状态上报者 & Pod生命周期执行者 | 证书到期前主动上报NodeCondition;证书更新后重新注册节点;驱逐异常Pod | 节点状态变为NotReady;Pod被驱逐;节点注册失败 |
| kube-controller-manager | 工作负载修复者 & 证书生命周期管理者 | 检测到节点NotReady后创建替代Pod;触发证书签名请求(CSR)自动批准;清理过期证书关联的端点 | Pod副本数不足;Service端点漂移;CSR堆积 |
4.2 证书轮换协同交互流程
一次完整的证书轮换事件,从kubelet检测到证书即将过期开始,到控制器管理器完成Pod副本修复结束,共经历6个关键阶段。以下流程图展示了各组件之间的消息传递与状态转换:
4.3 阶段详解与协同机制
4.3.1 阶段①:kubelet 证书到期检测
kubelet 在启动时加载客户端证书,并在运行期间定期检查证书有效期。当证书剩余时间低于 证书轮换阈值(默认 80% 生命周期) 时,kubelet 自动发起证书签名请求(CSR)。此阶段的关键行为:
- 证书文件检查:kubelet 读取
/var/lib/kubelet/pki/kubelet-client-current.pem的到期时间。 - CSR 发起:通过 API Server 创建
CertificateSigningRequest资源。 - 自动批准:若集群配置了
kubelet-serving-approver或kubelet-client-certificate-renewer控制器,CSR 会被自动批准。
故障点:如果 kubelet 证书已过期且未配置自动轮换,kubelet 将无法与 API Server 通信,导致节点状态无法上报。此时需要手动重启 kubelet 或重新签发证书。
4.3.2 阶段②:节点状态上报与调度器过滤
kubelet 在证书更新失败或通信中断时,通过 NodeStatus 更新 NodeCondition。调度器通过 Watch 机制 实时监听节点状态变化:
# 节点状态中的证书相关条件示例
status:
conditions:
- type: Ready
status: "False"
reason: "NodeStatusUnknown"
message: "Kubelet stopped posting node status."
- type: DiskPressure
status: "False"
- type: MemoryPressure
status: "False"
调度器在 调度周期 中执行 NodeUnschedulable 和 NodeCondition 过滤插件,将 Ready=False 的节点标记为不可调度。新创建的 Pod 将不会调度到该节点上。
4.3.3 阶段③:控制器管理器的修复动作
控制器管理器中的 节点生命周期控制器(Node Lifecycle Controller) 检测到节点 NotReady 状态持续超过 pod-eviction-timeout(默认 5 分钟)后,执行以下操作:
- 节点污点添加:自动为节点添加
node.kubernetes.io/unreachable污点。 - Pod 驱逐:将节点上运行的 Pod 标记为
Terminating,并更新 Pod 状态。 - 替代 Pod 创建:对于属于 ReplicaSet、Deployment、StatefulSet 等控制器的 Pod,控制器管理器创建新的 Pod 副本调度到其他健康节点。
注意:如果证书轮换导致节点短暂不可用(例如 < 5 分钟),控制器管理器不会触发 Pod 驱逐。但如果证书轮换失败导致节点长时间离线,控制器会启动完整的修复流程,可能造成不必要的 Pod 迁移。
4.4 组件间消息传递时序
以下时序图展示了证书轮换过程中,三个组件与 API Server 之间的关键消息交互:
4.5 协同故障模式与诊断
基于上述交互流程,证书轮换过程中常见的协同故障模式如下:
| 故障模式 | 表现 | 根因 | 诊断命令 |
|---|---|---|---|
| 调度器忽略节点 | 新Pod Pending,调度队列无节点可用 | 节点证书过期导致NodeCondition=False,调度器过滤插件未更新 | kubectl describe node 查看Conditions |
| 控制器过度修复 | Pod副本数超过预期,出现重复Pod | 证书轮换导致节点短暂NotReady,控制器在pod-eviction-timeout内创建了替代Pod | kubectl get pods --all-namespaces 检查重复Pod |
| kubelet注册失败 | 节点状态一直为NotReady,kubelet日志显示证书错误 | CSR未被自动批准,或kubelet证书与集群CA不匹配 | kubectl get csr 查看CSR状态 |
| 调度队列阻塞 | 调度器日志显示"failed to schedule pod" | 所有节点证书异常,调度器无法找到可用节点 | kubectl describe pod 查看调度事件 |
4.6 协同优化建议
最佳实践:为减少证书轮换对Pod调度的影响,建议配置以下参数:
- kubelet 证书轮换提前量:设置
--rotate-certificates和--certificate-rotation-check-interval为较短间隔(如 30 秒),确保证书在到期前完成更新。 - 控制器 Pod 驱逐容忍时间:调整
--pod-eviction-timeout为 10-15 分钟,给证书轮换留出缓冲时间。 - 调度器重试机制:配置调度器
--retry-period和--renew-interval,避免因节点短暂不可用导致调度失败。