1. 课程导论:Kubernetes 调度器概述、调度流程与网络拓扑感知调度
1.1 Kubernetes 调度器概述
Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。调度器以“谓词-优先级”两阶段算法为基础,通过一系列可扩展的调度插件,实现资源匹配、约束满足与负载均衡。
核心职责: 调度器不直接运行容器,而是为每个未调度的 Pod 选择一个最优 Node,并将绑定信息写入 API Server。调度决策直接影响集群的资源利用率、应用性能与运维成本。
1.2 调度流程详解
Kubernetes 调度流程分为 调度周期 和 绑定周期 两个阶段。调度周期为 Pod 选择一个 Node,绑定周期将决策结果持久化。整个流程在默认调度器中以“串行 + 插件化”方式执行。
| 阶段 | 子步骤 | 说明 |
|---|---|---|
| 调度周期 | 排序(QueueSort) | 对调度队列中的 Pod 按优先级排序 |
| 预选(Filter) | 过滤不满足 Pod 资源请求、污点容忍、节点选择器等约束的 Node | |
| 优选(Score) | 对通过预选的 Node 打分,选出最高分 Node | |
| 绑定周期 | 绑定(Bind) | 将 Pod 与 Node 的绑定关系写入 API Server |
调度器通过 调度框架(Scheduling Framework) 暴露扩展点,允许用户注入自定义插件。每个扩展点对应一个调度阶段,插件可以在此处执行过滤、打分、预留等操作。
// 调度框架核心扩展点示例
// Filter 插件:过滤不满足网络拓扑约束的节点
func (pl *NetworkTopologyFilter) Filter(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
// 检查节点是否在 Pod 指定的网络拓扑域内
if !pl.isInTopologyDomain(pod, nodeInfo.Node()) {
return framework.NewStatus(framework.Unschedulable, "node not in required topology domain")
}
return framework.NewStatus(framework.Success)
}
1.3 为什么需要网络拓扑感知调度
传统调度器主要关注 CPU、内存、GPU 等计算资源,对网络拓扑信息几乎无感知。在以下场景中,这种“网络盲区”会导致严重的性能问题:
- 跨可用区延迟敏感应用: 微服务调用链跨多个可用区(AZ)时,网络延迟可能增加 2-5 倍。
- 数据本地性(Data Locality): 大数据或 AI 训练任务需要 Pod 靠近数据所在节点或存储集群,避免大量跨架数据传输。
- 带宽密集型工作负载: 分布式数据库、视频转码等任务需要高带宽低丢包,跨架或跨交换机通信可能成为瓶颈。
- 多租户网络隔离: 某些租户要求 Pod 必须调度到同一网络平面或同一 ToR 交换机下,以满足合规或性能要求。
关键问题: 默认调度器将集群视为“扁平网络”,所有节点间的网络性能被假设为一致。实际数据中心网络中,跨架、跨交换机、跨可用区的带宽和延迟差异可达 10 倍以上。忽略这些差异会导致应用性能不可预测、SLA 违约、资源利用率下降。
网络拓扑感知调度(Network Topology Aware Scheduling)正是为了解决上述问题而设计。它通过引入节点、机架、交换机、可用区等网络拓扑层级信息,让调度器在预选和优选阶段考虑网络距离、带宽容量、数据本地性等约束,从而做出更优的调度决策。
1.4 网络拓扑感知调度的核心价值
| 维度 | 传统调度 | 网络拓扑感知调度 |
|---|---|---|
| 资源视角 | CPU、内存、GPU、存储 | CPU、内存、GPU、存储 + 网络拓扑层级 |
| 网络假设 | 扁平网络,节点间性能一致 | 分层网络,感知机架/交换机/AZ 差异 |
| 调度目标 | 资源利用率最大化 | 资源利用率 + 网络性能最优化 |
| 适用场景 | 通用无状态应用 | 延迟敏感、数据本地性、带宽密集型工作负载 |
| 扩展方式 | 默认调度器 + 少量自定义策略 | 调度框架插件 + 拓扑标签 + 网络度量 |
1.5 网络拓扑层级模型
在 Kubernetes 集群中,网络拓扑通常按以下层级组织。调度器需要理解这些层级,才能做出拓扑感知的决策。
实践建议: 在集群中为每个节点添加拓扑标签,例如
topology.kubernetes.io/zone、topology.kubernetes.io/rack、topology.kubernetes.io/switch。调度器插件通过读取这些标签,即可在调度决策中引入网络拓扑信息。
1.6 课程路线图
本课程将围绕网络拓扑感知调度,从原理到实践逐步深入:
- 基础篇: 深入调度框架扩展点,理解如何编写 Filter 和 Score 插件。
- 拓扑建模: 学习如何定义和注入网络拓扑标签,构建集群拓扑视图。
- 亲和性规则设计: 设计基于机架、交换机、可用区的 Pod 亲和性与反亲和性规则。
- 性能优化: 结合网络度量数据(延迟、带宽、丢包率)动态调整调度权重。
- 生产实践: 在真实集群中部署网络拓扑感知调度器,并进行压测与调优。
通过本课程,你将掌握如何让 Kubernetes 调度器“看见”网络拓扑,从而为延迟敏感、数据本地性和带宽密集型工作负载提供最优调度方案。