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 集群中,网络拓扑通常按以下层级组织。调度器需要理解这些层级,才能做出拓扑感知的决策。

Kubernetes 网络拓扑层级模型 可用区(Availability Zone) 物理隔离的数据中心区域,跨 AZ 延迟通常 1-5ms 交换机 / 机架顶部交换机(ToR) 同一交换机下节点间延迟 < 0.1ms,跨交换机延迟 0.5-2ms 机架(Rack) 物理机架,共享电源和网络,同机架节点间延迟极低 节点(Node) 物理机或虚拟机,运行 kubelet 和容器运行时
实践建议: 在集群中为每个节点添加拓扑标签,例如 topology.kubernetes.io/zone、topology.kubernetes.io/rack、topology.kubernetes.io/switch。调度器插件通过读取这些标签,即可在调度决策中引入网络拓扑信息。

1.6 课程路线图

本课程将围绕网络拓扑感知调度,从原理到实践逐步深入:

  1. 基础篇: 深入调度框架扩展点,理解如何编写 Filter 和 Score 插件。
  2. 拓扑建模: 学习如何定义和注入网络拓扑标签,构建集群拓扑视图。
  3. 亲和性规则设计: 设计基于机架、交换机、可用区的 Pod 亲和性与反亲和性规则。
  4. 性能优化: 结合网络度量数据(延迟、带宽、丢包率)动态调整调度权重。
  5. 生产实践: 在真实集群中部署网络拓扑感知调度器,并进行压测与调优。

通过本课程,你将掌握如何让 Kubernetes 调度器“看见”网络拓扑,从而为延迟敏感、数据本地性和带宽密集型工作负载提供最优调度方案。