写点什么

42 K8S 之调度器

  • 2021 年 12 月 12 日
  • 本文字数:1380 字

    阅读完需:约 5 分钟

42 K8S之调度器

在 Kubernetes 系统上,调度是指基于集群上当前各节点资源分配状态及约束条件为 Pod 选出一个最佳运行节点,并由对应节点上的 kubelet 创建并运行该 Pod 的过程。事实上,对于每个未绑定至任何工作节点的 Pod 对象,无论是新创建、被节点驱逐或节点故障等,Kubernetes Scheduler 都要使用调度算法从集群中挑选一个最佳目标节点来运行它。


调度器需要根据特定的调度要求对现有节点进行预选,以过滤掉那些无法满足 Pod 运行条件的节点,而后对满足过滤条件的各个节点进行打分,并按综合得分进行排序,最后从优先级排序结果中挑选出得分最高节点作为适合目标 Pod 的最佳节点。如果中间任何一个步骤返回了错误信息,调度器就会中止调度过程。调度流程的最后,调度程序在 binding(绑定)的过程中将调度决策通知给 API Server


1)节点预选:基于一系列预选规则(例如 NodeAffinity 和 VolumeBinding 等)对每个节点进行检查,将那些不符合筛选条件的节点过滤掉;没有节点满足目标 Pod 的资源需求时,该 Pod 将被置于 Pending 状态,直到出现至少一个能够满足条件的节点为止。


2)节点优选:根据优先算法(例如 ImageLocality 和 PodTopologySpread 等)对预选出的节点打分,并根据最终得分进行优先级排序。


3)从优先级排序结果中挑出优先级最高的节点运行 Pod 对象,最高优先级节点数量多于一个时,则从中随机选择一个作为 Pod 可绑定的目标 Node 对象。


调度框架将每次调度一个 Pod 的整个过程进一步细分为“调度周期”和“绑定周期”两个阶段,前者负责为 Pod 选择一个最佳调度节点,后者为完成 Pod 到节点的绑定执行必要的检测或初始化操作等,它们联合起来称为“调度上下文”。


Kubernetes 通用调度程序提供的经典调度策略使用 Predicate Priority 函数实现核心调度功能,并支持多调度器和 Extender 的扩展方式。预选函数是节点过滤器,负责根据待调度 Pod 的计算资源和存储资源需求,以及节点亲和关系及反亲和关系规范等来过滤节点。优选函数是节点优选级排序工具,负责基于各节点上当前的资源水位、Pod 与 Node 的亲和或反亲和关系、Pod 之间的亲和或反亲和关系,以及尽可能将同一组 Pod 资源合理分散到不同节点上的方式对过滤后的节点进行优选级排序,最高优选级的节点即为待调度 Pod 资源的最佳运行节点。


预选函数根据指定判定标准及各 Node 对象和当前 Pod 对象能否适配,按照实现的主要目标大体可分为如下几类。

节点存储卷数量限制检测:MaxEBSVolumeCount、MaxGCEPDVolumeCount、MaxCSIVolumeCount、MaxAzureDiskVolumeCount 和 MaxCinderVolumeCount。

检测节点状态是否适合运行 Pod:CheckNodeUnschedulable 和 CheckNodeLabel-Presence。

Pod 与节点的匹配度检测:Hostname、PodFitsHostPorts、MatchNodeSelector、NoDisk-Conflict、PodFitsResources、PodToleratesNodeTaints、PodToleratesNodeNoExecuteTaints、CheckVolumeBinding 和 NoVolumeZoneConflict。

Pod 间的亲和关系判定:MatchInterPodAffinity。

将一组 Pod 打散至集群或特定的拓扑结构中:CheckServiceAffinity 和 EvenPods-Spread。


成功通过预选函数过滤的节点将生成一个列表,调度流程随后进入优先级排序阶段。各优选函数主要评定成功通过过滤检查的节点对运行该 Pod 资源的适配程度。对于每个节点,调度器会使用各个拥有权重值的优选函数分别为其打分(0~10 之间的分数),优选函数得出的初始分值乘以其权重为该函数最终分值,而各个优选函数的最终分值之和则是该节点的最终得分


发布于: 12 小时前阅读数: 7
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
42 K8S之调度器