调度器的调度流程和算法介绍

500 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情 >>

k8s-scheduler是核心组件之一,主要负责整个集群资源的调度功能,根据调度算法和策略,分配pod最优的工作节点。

1. k8s-scheduler启动流程

image.png

  1. 注册调度算法
  2. 实例化scheduler
  3. 事件管理的广播
  4. 运行https和http
  5. 同步资源,informer机制
  6. raft选举节点
  7. 运行调度的队列处理,预选和优选节点
  8. 和 apiserver 对话(通过发出绑定调用)并设置

2. 资源请求

Kubernetes 里 Pod 的 CPU 和内存资源,实际上还要分为 limits 和 requests 两种情况:在调度的时候,kube-scheduler 只会按照 requests 的值进行计算

在定义pod的部署文件时,还会对所需的资源量进行设置,保证pod的高可用。

如果按Pod的QoS(Quality of Service)进行分类,那么可以分为三类。

  • 第一类:Guaranteed:pod的每个容器设置的资源需求(CPU/内存)的limits和request的值完全一样。
  • 第二类:Burstable:只要一个容器指定了CPU或者内存的request,requests的limits的值不一样。
  • 第三类:BestEffort:Pod中所有容器都未指定CPU或内存资源需求的requests。

当计算节点检测到内存压力时,Kubernetes会按BestEffort>Burstable>Guaranteed的顺序依次进行驱逐。

3. 资源调度

  1. 组件交互,包括如何与api server交互感知pod 变化,如何感知node 节点的cpu、内存等参数。

  2. 调度算法,预选(Predicate)和优选(Priority )算法

    1. 预选阶段

      • 过滤节点,调度器用一组规则过滤掉不符合要求的 Node 节点
    2. 优选阶段

      • 为节点的优先级打分,将预选阶段过滤出来的 Node 列表进行打分
  3. 绑定循环将调度决策应用到集群中,包括绑定 Pod 和 Node、绑定持久存储等工作;

image-20220816154803379

Scheduling Cycle 调度循环在多个 Node 中为 Pod 选择最合适的 Node

  1. Sort,对调度队列中的 pod 进行排序。一次只能启用一个队列排序插件。

  2. PreFilter, 调度流程启动之前的预处理,可以加工pod数据,也可以检查一些预知条件进行筛选。

  3. Filter,用来过滤掉不满足 Pod 调度要求的节点

  4. PostFilter, 主要是用于处理当 Pod 在 Filter 阶段失败后的操作,如果发生抢占,Autoscale 触发等行为需要在这一步进行处理。

  5. PreScore, 在打分之前进行信息生成,这一步会获取到通过 Filter 阶段的节点列表。可以在此处进行生成日志或者监控信息,或者信息预处理。

  6. Scoring, 目的是为了基于 Filter 过滤后的剩余节点,根据 Scoring 扩展点定义的策略挑选出最优的节点。分为两个阶段:

    1. Score,打分:打分阶段会对 Filter 后的节点进行打分,scheduler 会调用所配置的打分策略
    2. Normalize score,归一化: 对打分之后的结构在 0-100 之间进行归一化处理
  7. Reserve,此处会对调度结果进行缓存,如果失败进入 Unreserve 阶段,进行数据回滚。

  8. Permit,当 Pod 在 Reserve 阶段完成资源预留之后,Bind 操作之前,开发者自定义对节点的拦截,可以对Pod进行allow,reject 和 wait 的 3 种操作。

binding cycle, 需要调用 apiserver 的接口,耗时较长,为了提高调度的效率,需要异步执行,所以此阶段线程不安全。

  1. PreBind,进行节点绑定前的一些数据信息的获取和更新
  2. Bind, 会调用 apiserver 提供的接口,将 pod 绑定到对应的节点上。
  3. PostBind, 节点绑定后的数据信息的获取和更新。

4.总结

对k8s-scheduler的调度启动流程和调度流程进行了详细的介绍。对调度循环和绑定循环的每一个步骤的作用进行了讲解。

参考

认识k8s中资源申请和探针

Kubernetes资源调度——scheduler