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个关键阶段。以下流程图展示了各组件之间的消息传递与状态转换:

证书轮换协同交互流程(6阶段) ① kubelet 检测证书到期 ② 上报 NodeCondition ③ 调度器过滤节点 ④ 控制器检测 NotReady ⑤ 创建替代 Pod ⑥ 证书更新 & 恢复 API Server 状态存储 调度队列 CSR 管理 端点管理 PATCH /status Watch Node Watch Node POST /pods PUT /csr 交互要点 • 所有交互通过API Server中转 • 调度器被动接收节点状态变化 • 控制器主动修复工作负载 • kubelet是证书轮换的触发者

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 分钟)后,执行以下操作:

  1. 节点污点添加:自动为节点添加 node.kubernetes.io/unreachable 污点。
  2. Pod 驱逐:将节点上运行的 Pod 标记为 Terminating,并更新 Pod 状态。
  3. 替代 Pod 创建:对于属于 ReplicaSet、Deployment、StatefulSet 等控制器的 Pod,控制器管理器创建新的 Pod 副本调度到其他健康节点。

注意:如果证书轮换导致节点短暂不可用(例如 < 5 分钟),控制器管理器不会触发 Pod 驱逐。但如果证书轮换失败导致节点长时间离线,控制器会启动完整的修复流程,可能造成不必要的 Pod 迁移。

4.4 组件间消息传递时序

以下时序图展示了证书轮换过程中,三个组件与 API Server 之间的关键消息交互:

证书轮换组件交互时序图 kubelet API Server Scheduler Controller PATCH /api/v1/nodes/{name}/status Watch: NodeCondition=NotReady Watch: NodeCondition=NotReady POST /api/v1/namespaces/{ns}/pods Watch: new Pod created PUT /api/v1/certificatesigningrequests CSR Approved PATCH /status: Ready=True Watch: NodeCondition=Ready Watch: NodeCondition=Ready 时序关键点 • 消息1-3:证书到期导致节点状态变化,调度器和控制器同时收到通知 • 消息4-5:控制器创建替代Pod,调度器将其调度到健康节点

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,避免因节点短暂不可用导致调度失败。