1. 课程导学与前置知识

1.1 Kubernetes 调度器架构概述

Kubernetes 调度器(kube-scheduler)是控制平面的核心组件之一,负责将待调度的 Pod 绑定到最合适的 Node 上。调度过程并非一次性决策,而是通过一系列阶段(Phase)和扩展点(Extension Point)组合而成,形成可插拔的调度管道。

调度器内部维护一个调度队列(Scheduling Queue),所有未被调度的 Pod 按优先级入队。调度周期分为两个主要阶段:

  • Scheduling Cycle(调度周期):选择一个 Node 给 Pod,是同步操作。
  • Binding Cycle(绑定周期):将调度决策持久化到 API Server,是异步操作。

下图展示了调度器内部的核心组件与调度流程:

Kubernetes 调度器核心架构 Kubernetes 调度器核心架构 调度队列 调度周期 绑定周期 PreFilter Filter PostFilter Score PreBind Bind PostBind 说明: 调度周期是同步的,绑定周期是异步的。扩展点允许开发者在不修改核心代码的情况下注入自定义调度逻辑。

1.2 Scheduler Framework 扩展点详解

Kubernetes 从 v1.19 开始将 Scheduler Framework 作为默认调度框架。框架定义了一组清晰的扩展点(Extension Points),每个扩展点对应调度周期或绑定周期中的一个特定阶段。插件可以注册到一个或多个扩展点,从而影响调度决策。

下表列出了主要的扩展点及其作用:

扩展点 所属周期 调用时机 典型用途
PreFilter 调度周期 在 Filter 之前,预处理 Pod 或集群信息 检查 Pod 的拓扑约束、预处理节点标签
Filter 调度周期 过滤掉不满足条件的节点 节点资源不足、端口冲突、污点容忍
PostFilter 调度周期 Filter 之后,所有节点都被过滤时执行 抢占(Preemption)逻辑
PreScore 调度周期 Score 之前,用于评分前的数据准备 计算节点间网络距离、缓存拓扑信息
Score 调度周期 对通过 Filter 的节点进行打分 节点亲和性、资源均衡、网络延迟评分
NormalizeScore 调度周期 Score 之后,对分数做归一化处理 将不同插件的分数统一到同一量纲
Reserve 绑定周期 在 Bind 之前预留资源 预留网络带宽、IP 地址
PreBind 绑定周期 Bind 之前执行预处理 创建网络资源、挂载存储卷
Bind 绑定周期 将 Pod 绑定到 Node 默认绑定或自定义绑定逻辑
PostBind 绑定周期 Bind 之后执行清理或通知 释放临时资源、记录调度事件
开发提示: 网络拓扑感知插件通常注册到 PreScore 和 Score 扩展点。在 PreScore 中收集节点间的网络拓扑距离,在 Score 中根据 Pod 与工作负载的邻近性给出高分,从而将 Pod 调度到网络延迟最低的节点上。

1.3 网络拓扑感知调度概念

网络拓扑感知调度(Network Topology Aware Scheduling)是指调度器在做出调度决策时,不仅考虑节点的 CPU、内存等传统资源,还考虑节点之间的网络拓扑结构——包括物理机架、交换机层级、可用区(Zone)、区域(Region)等网络距离因素。

核心目标:将相互通信频繁的 Pod 调度到网络距离最近的节点上,从而降低跨节点通信延迟、减少网络带宽消耗、提升应用整体性能。

常见的网络拓扑层次结构如下:

  • 同一节点(Node):Pod 间通过本地回环或容器网络通信,延迟最低(通常 < 0.1ms)。
  • 同一机架(Rack):通过架顶交换机(ToR)通信,延迟较低(通常 0.1–0.5ms)。
  • 同一可用区(Zone):通过区域汇聚交换机通信,延迟中等(通常 0.5–2ms)。
  • 跨可用区(Cross-Zone):通过核心路由器或广域网通信,延迟最高(通常 2–10ms+)。

下图展示了典型的集群网络拓扑层次与调度目标:

网络拓扑层次与调度目标 网络拓扑层次与调度目标 Region(区域) Zone A(可用区) Zone B(可用区) Rack 1 Rack 2 Rack 3 Rack 4 Node Node Node Node Node Node Node Node 调度目标:将通信频繁的 Pod 调度到同一 Rack 或同一 Zone 内的节点上,最小化跨 Zone 流量。
关键概念: 网络拓扑感知调度与传统的资源调度并不冲突,而是叠加关系。插件在 Score 阶段根据拓扑距离给出额外分数,与 CPU、内存等资源分数加权求和,最终选出最优节点。

1.4 为什么需要网络拓扑感知调度

在云原生场景下,微服务架构中的服务间调用非常频繁。如果调度器不考虑网络拓扑,可能出现以下问题:

  • 跨可用区流量激增:大量 Pod 分散在不同 Zone,导致跨 Zone 网络带宽被占满,延迟上升。
  • 带宽成本增加:云厂商通常对跨可用区流量收费,不合理调度会增加运营成本。
  • 应用性能抖动:关键路径上的服务因网络延迟变长而响应超时。
  • 资源碎片化:节点资源利用率不均,但拓扑约束未被考虑,导致局部热点。

网络拓扑感知调度通过以下方式解决上述问题:

问题 传统调度结果 拓扑感知调度结果
跨 Zone 流量 Pod 随机分布,30% 流量跨 Zone Pod 聚集在同一 Zone,跨 Zone 流量 < 5%
网络延迟 平均延迟 2ms,P99 延迟 8ms 平均延迟 0.3ms,P99 延迟 1ms
带宽成本 每月跨 Zone 流量费 $1200 每月跨 Zone 流量费 $200
应用可用性 偶发超时导致 SLO 不达标 稳定满足 SLO

1.5 课程学习路径与前置要求

本课程将带领你从零开始,完整实现一个生产级别的网络拓扑感知调度插件。课程分为四个阶段:

  1. 基础篇(第 1–5 章):调度器架构、Framework 扩展点、开发环境搭建、插件注册与配置。
  2. 核心篇(第 6–15 章):拓扑信息采集、节点打分算法、缓存设计、插件单元测试与集成测试。
  3. 进阶篇(第 16–25 章):多维度拓扑权重、动态拓扑更新、与现有调度插件协同、性能调优。
  4. 实战篇(第 26–30 章):部署到生产集群、监控与告警、故障排查、社区贡献指南。
前置要求: 学习本课程需要具备以下基础:
• 熟悉 Kubernetes 基本概念(Pod、Node、Deployment、Service)
• 掌握 Go 语言基础(接口、结构体、并发编程)
• 了解 Linux 网络基础(IP、路由、延迟测量)
• 具备基本的容器化部署经验(Docker、kubectl)