1. 课程导论:Kubernetes 调度器概述、调度流程、调度性能瓶颈、网络拓扑感知与亲和性配置的重要性
1.1 Kubernetes 调度器概述
Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。它并非执行容器运行时操作,而是通过一系列算法和策略,为每个未调度的 Pod 选择一个最优的 Node,并将绑定决策写入 etcd。
调度器以插件化架构运行,默认调度框架(Scheduling Framework)包含多个扩展点,允许用户通过自定义插件实现调度策略的定制化。
核心职责: 监听未调度的 Pod,根据资源需求、约束条件、亲和性规则和拓扑信息,从候选 Node 中选出最优节点。
1.2 调度流程详解
Kubernetes 调度流程分为两个主要阶段:过滤(Filtering) 和 打分(Scoring)。调度框架在此基础上增加了排序、预留、预绑定、绑定等扩展点。
| 阶段 | 名称 | 说明 |
|---|---|---|
| 1 | PreFilter | 预处理 Pod 信息,检查 Pod 是否满足基本条件 |
| 2 | Filter | 过滤掉不满足调度约束的 Node(如资源不足、端口冲突、污点容忍) |
| 3 | PostFilter | 当过滤后无可用 Node 时,执行抢占或失败处理 |
| 4 | PreScore | 运行评分前的预处理逻辑 |
| 5 | Score | 对通过过滤的 Node 进行打分,分值越高越优先 |
| 6 | NormalizeScore | 对评分结果进行归一化处理 |
| 7 | Reserve | 预留资源,防止并发调度冲突 |
| 8 | Permit | 批准或延迟绑定决策 |
| 9 | PreBind | 绑定前的预处理(如挂载卷) |
| 10 | Bind | 将 Pod 绑定到选定的 Node |
默认调度器使用 LeastRequestedPriority、BalancedResourceAllocation 等策略进行打分,但生产环境中往往需要更精细的拓扑感知能力。
1.3 调度性能瓶颈
在大规模集群中,调度器可能面临以下性能瓶颈:
- 调度延迟: 当集群节点数超过 1000 时,过滤和打分阶段的循环计算耗时显著增加。
- 资源竞争: 多个调度器实例或并发 Pod 调度可能导致 etcd 写入冲突。
- 拓扑感知缺失: 默认调度器不考虑网络拓扑距离,导致 Pod 可能被调度到跨可用区或跨机架的 Node 上,增加网络延迟。
- 亲和性规则计算开销: 复杂的 Pod 亲和性/反亲和性规则需要遍历大量 Node 和 Pod,消耗 CPU 和内存。
- 调度队列阻塞: 高优先级 Pod 可能长时间阻塞低优先级 Pod 的调度。
常见误区: 很多团队只关注 CPU 和内存资源,却忽略了网络拓扑对应用性能的影响。在微服务架构中,跨机架或跨可用区的 Pod 通信延迟可能比同机架高出 3-5 倍。
1.4 网络拓扑感知与亲和性配置的重要性
网络拓扑感知调度是指调度器在决策时考虑节点之间的网络距离、可用区分布、机架位置等拓扑信息,将 Pod 调度到网络距离最近的 Node 上。亲和性配置则通过规则约束 Pod 与 Pod、Pod 与 Node 之间的部署关系。
两者的结合能带来以下收益:
| 场景 | 问题 | 拓扑感知 + 亲和性方案 |
|---|---|---|
| 微服务通信 | 服务 A 与服务 B 跨可用区调用,延迟高 | 使用 Pod 亲和性将相关服务调度到同一可用区 |
| 数据本地性 | Pod 需要访问本地 SSD,但被调度到远端节点 | 使用 Node 亲和性 + 拓扑键约束 |
| 高可用部署 | 所有副本集中在同一机架,单点故障风险 | 使用 Pod 反亲和性 + 拓扑分布约束 |
| GPU 集群 | 跨 NVLink 通信的 Pod 被分散到不同 GPU 节点 | 使用拓扑感知调度 + 自定义打分插件 |
Kubernetes 从 1.21 版本开始引入 拓扑管理策略(Topology Manager),结合 CPU 管理器和设备管理器,实现更细粒度的拓扑感知。同时,NodeTopology 和 TopologySpreadConstraints 等 API 对象为调度器提供了拓扑信息输入。
1.5 课程目标与学习路径
本课程将深入讲解以下核心内容:
- 调度框架扩展: 如何编写自定义调度插件实现拓扑感知。
- 亲和性配置实战: Pod 亲和性、Node 亲和性、反亲和性的 YAML 配置与最佳实践。
- 拓扑分布约束: 使用 topologySpreadConstraints 实现跨可用区均匀分布。
- Topology Manager 集成: 结合 CPU 和 GPU 拓扑实现高性能计算调度。
- 性能调优: 调度器参数优化、缓存策略、并发控制。
- 生产案例: 大规模集群中的拓扑感知调度方案设计与故障排查。
学习建议: 建议先掌握 Kubernetes 基础调度概念(Pod、Node、污点/容忍),再深入本课程的拓扑感知与亲和性专题。每章都配有可运行的 YAML 示例和调度器插件代码片段。