Kubernetes调度器与扩展器详解与分析

1. Kubernetes调度器概述

Kubernetes调度器(kube-scheduler)是Kubernetes集群的核心组件之一,负责将Pod分配到合适的节点上运行。
其核心目标是:

  • 资源优化:确保集群资源(CPU、内存、GPU等)被高效利用。
  • 策略驱动:根据用户定义的策略(如节点亲和性、资源请求等)进行调度。
  • 高可用性:支持多副本部署,避免单点故障。

2. 调度器的工作流程

  1. 监听Pod事件
    调度器通过Watch机制监听Kube-APIServer,筛选出PodSpec.NodeName为空的Pod(即未调度的Pod)。
  2. 调度周期(Scheduling Cycle)
  • 预选阶段(Predicates):
    遍历集群中的所有节点,通过预选策略(如资源匹配、端口冲突、节点亲和性等)过滤掉不满足条件的节点。
  • 优选阶段(Priorities):
    对通过预选的节点进行打分(0-10分),选择得分最高的节点作为最佳调度目标。
  1. 绑定周期(Binding Cycle)
    将Pod与选定的节点进行绑定,更新Kube-APIServer中的Pod信息

3.调度器的扩展方式

(1)默认调度器修改(Default Scheduler)

  • 方式:直接修改Kubernetes默认调度器的代码,重新编译部署。
  • 缺点:侵入性强,升级和维护困难。

(2)独立调度器(Standalone Scheduler)

  • 方式:实现一个独立的调度器,与默认调度器并行运行。
  • 优点:灵活性高,不与默认调度器冲突。
  • 缺点:需要自行处理资源竞争和调度策略的一致性。

(3)调度器框架插件(Scheduler Framework)

  • 方式:通过实现插件接口(如QueueSort、Filter、Score等)扩展调度逻辑。
  • 优点:标准化、插件化,易于维护和升级。
  • 适用场景:需要深度定制调度策略的场景。

(4)调度器扩展器(Scheduler Extender)

  • 方式:通过HTTP/HTTPS接口与外部服务交互,实现自定义调度逻辑。
  • 优点:非侵入式,无需修改调度器代码。
  • 缺点:
    • 性能开销大(HTTP通信+JSON序列化)。
    • 错误处理复杂,无法共享调度器缓存

4. Extender 模式

介绍:

Extender 模式是 Kubernetes 调度器的一种扩展机制,允许用户在不修改调度器核心代码的情况下,通过外部服务(Extender)实现自定义调度逻辑。Extender 以独立服务的形式运行,通过 HTTP/HTTPS 与调度器通信,实现预选(Predicates)、优选(Priorities)和绑定(Bind)等扩展功能.

工作原理

  • 调度器调用时机:在默认调度策略执行完成后,调度器会根据配置调用 Extender 的接口
  • 通信方式:通过 HTTP/HTTPS 协议,以 JSON 格式传递数据。
  • 接口类型:
    • Filter(预选):过滤不满足条件的节点。
    • Prioritize(优选):对节点进行打分。
    • Bind(绑定):将 Pod 绑定到节点。

Extender 的配置

Extender 的配置通过调度器的策略配置文件(JSON 格式)定义,主要字段包括

{
  "urlPrefix": "http://extender-server:port",
  "filterVerb": "filter",
  "prioritizeVerb": "prioritize",
  "bindVerb": "bind",
  "weight": 5,
  "managedResources": ["example.com/gpu"]
}

更多推荐