携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情 >>
k8s-scheduler是核心组件之一,主要负责整个集群资源的调度功能,根据调度算法和策略,分配pod最优的工作节点。
1. k8s-scheduler启动流程
- 注册调度算法
- 实例化scheduler
- 事件管理的广播
- 运行https和http
- 同步资源,informer机制
- raft选举节点
- 运行调度的队列处理,预选和优选节点
- 和 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. 资源调度
-
组件交互,包括如何与api server交互感知pod 变化,如何感知node 节点的cpu、内存等参数。
-
调度算法,预选(Predicate)和优选(Priority )算法
-
预选阶段
- 过滤节点,调度器用一组规则过滤掉不符合要求的 Node 节点
-
优选阶段
- 为节点的优先级打分,将预选阶段过滤出来的 Node 列表进行打分
-
-
绑定循环将调度决策应用到集群中,包括绑定 Pod 和 Node、绑定持久存储等工作;
Scheduling Cycle 调度循环在多个 Node 中为 Pod 选择最合适的 Node
-
Sort,对调度队列中的 pod 进行排序。一次只能启用一个队列排序插件。
-
PreFilter, 调度流程启动之前的预处理,可以加工pod数据,也可以检查一些预知条件进行筛选。
-
Filter,用来过滤掉不满足 Pod 调度要求的节点
-
PostFilter, 主要是用于处理当 Pod 在 Filter 阶段失败后的操作,如果发生抢占,Autoscale 触发等行为需要在这一步进行处理。
-
PreScore, 在打分之前进行信息生成,这一步会获取到通过 Filter 阶段的节点列表。可以在此处进行生成日志或者监控信息,或者信息预处理。
-
Scoring, 目的是为了基于 Filter 过滤后的剩余节点,根据 Scoring 扩展点定义的策略挑选出最优的节点。分为两个阶段:
- Score,打分:打分阶段会对 Filter 后的节点进行打分,scheduler 会调用所配置的打分策略
- Normalize score,归一化: 对打分之后的结构在 0-100 之间进行归一化处理
-
Reserve,此处会对调度结果进行缓存,如果失败进入 Unreserve 阶段,进行数据回滚。
-
Permit,当 Pod 在 Reserve 阶段完成资源预留之后,Bind 操作之前,开发者自定义对节点的拦截,可以对Pod进行allow,reject 和 wait 的 3 种操作。
binding cycle, 需要调用 apiserver 的接口,耗时较长,为了提高调度的效率,需要异步执行,所以此阶段线程不安全。
- PreBind,进行节点绑定前的一些数据信息的获取和更新
- Bind, 会调用 apiserver 提供的接口,将 pod 绑定到对应的节点上。
- PostBind, 节点绑定后的数据信息的获取和更新。
4.总结
对k8s-scheduler的调度启动流程和调度流程进行了详细的介绍。对调度循环和绑定循环的每一个步骤的作用进行了讲解。