本文介绍 Azure Kubernetes 服务(AKS)中工作负荷放置的计划程序配置和高级计划概念,包括可配置的计划程序配置文件、计划插件和计划约束。
关于 AKS 调度器
在 AKS 中,群集中节点之间工作负荷放置的默认机制是通过计划程序进行的。 默认调度程序是一个控制平面组件,负责将 AKS 部署的 Pod 分配到节点。 AKS 计划程序选择节点后,部署 Pod 将绑定到该节点,其余生命周期将继续。
在没有指定节点的情况下创建 Pod 时,计划程序会根据多个条件(包括但不限于):选择最佳节点:
- 可用资源(CPU、内存)
- 节点相关性/反关联
- Pod 相关性/反相关性
- 污点和容忍
AKS 计划程序配置和计划策略
默认情况下,AKS 计划程序附带一组适用于常规用途工作负荷的内置规则。 但是,高级用例可能需要自定义计划策略。 例如:
- 批处理作业可能更偏好在少数节点中并置以提高性能,而不倾向于采取拓扑感知的分布方式以增强可靠性。
- 成本敏感的工作负荷可能受益于节点打包策略来合并作业,并减少空闲计算节点成本。
为了支持这些用例,AKS 允许通过 Kubernetes 自定义资源(CRD)设置一个或多个树内计划插件,以在 AKS 群集上配置计划行为。
可配置的调度器配置文件
调度器配置文件是一组或多种内置调度插件和配置,用于决定如何调度 Pod。 以前,AKS 管理计划程序配置,用户无法访问它。 从 Kubernetes 版本 1.33 开始,您现在可以为群集上的 Kubernetes 调度器配置和设置调度器配置文件(预览)。
每个计划程序配置文件具有以下组件:
- 唯一的名称。
- 一组 计划插件。
- 细化行为的自定义参数(适用于某些插件)。
支持的树内计划插件
AKS 支持配置 18 个树内 Kubernetes 计划插件,这些插件允许将 Pod 放置在特定节点上,确保 Pod 与特定存储资源匹配,针对具有容器映像的节点进行优化,等等。
以下部分将引导你完成这些插件,这些插件分为以下类别:
若要详细了解这些插件和配置选项,请参阅 Kubernetes 计划插件文档。
计划约束和基于订单的插件
DefaultBinder:在计划程序选择合适的节点后,负责将 Pod 绑定到节点。 选择节点后,DefaultBinder将创建一个绑定对象,以确保 Pod 被调度到该节点上。 -DefaultPreemption:处理抢占,这是逐出低优先级 Pod 以腾出高优先级 Pod 的空间的过程。 如果由于节点上资源不足而无法调度 Pod,该插件会通过抢占其他 Pod 来腾出空间。 此插件可以接收下列参数:-
PodPriority:定义调度中 Pod 的优先级。 -
PreemptionPolicy:用于处理 Pod 抢占的策略(例如:"PreemptLowerPriority"或"DoNotPreempt")。 -
PodPriorityClass:与 Pod 关联的优先级类。 -
PodInfo:有关可能被驱逐的候选 Pod 的信息。 -
Node:有关考虑抢占的节点的信息。
-
SchedulingGates:介绍计划入口的概念,即在计划 Pod 之前必须满足的条件。 例如,它可以强制完成某些任务或作业,然后调度程序尝试调度 Pod。PrioritySort:根据其优先级类对 Pod 列表进行排序。 Pods以更高优先级被调度。 它有助于做出抢占决策,并确定要考虑哪些 Pod 进行优先级调度。
节点选择约束调度插件
InterPodAffinity:考虑到用户指定的 关联 规则,这些规则根据其他 Pod 的接近影响调度。 如果 Pod 具有关联规则,它会尝试将 Pod 安排在同一节点上或与具有相关性的其他 Pod 在同一拓扑中(例如:出于性能原因或紧密耦合)。 此插件可以接收下列参数:-
Affinity:定义 Pod 的必需或首选亲和性规则,该规则指定哪些 Pod 应或不应在附近被调度。 -
TopologyKey:表示关联规则应用到的失败域的键(例如:"kubernetes.io/hostname"节点级相关性或"topology.kubernetes.io/zone"区域级别)。 -
Weight:定义调度器应考虑某一特定亲和性规则的力度。 -
Pod:正在调度的 Pod。 -
OtherPods:要考虑的其他 Pod 列表,这些 Pod 与关联规则有关。
-
NodeAffinity:启用基于节点标签的调度。 它允许用户根据节点的标签指定 Pod 可以被调度到哪些节点上,并提供对 Pod 在节点上放置的细粒度控制。 此插件可以接收下列参数:-
NodeAffinity:定义所需的或首选节点关联规则,例如requiredDuringSchedulingIgnoredDuringExecution或preferredDuringSchedulingIgnoredDuringExecution。 -
NodeSelectorTerms:定义必须匹配的节点标签和值集。 -
Pod:正在调度的 Pod。 -
Node:调度的潜在节点。 -
LabelSelector:基于标签选择节点的选择器。
-
NodeName:强制在特定节点上调度 Pod。 指定确切的节点名称时,计划程序将 Pod 置于该节点上(如果可能)。NodePorts:确保带有类型NodePort服务的 Pod 可以调度到具有可用于绑定的端口的节点上。 它会检查节点是否有足够的资源来支持服务的节点端口分配。NodeUnschedulable:确保不会在标记为 不可调度 的节点上调度 Pod。 如果某个节点被node.kubernetes.io/unschedulable污染,计划程序不会在该节点上放置任何新 Pod。TaintToleration:检查 Pod 是否具有所需的容忍度以被安排到具有污点的节点上。 节点上的污点会阻止 Pod 被调度到节点上,除非 Pod 具有匹配的容忍度。NodeVolumeLimits:检查节点是否超过了其卷限制。 每个节点可以附加的卷数有上限,该插件可确保 Pod 不会被调度到已达到支持限制的节点上。VolumeBinding:确保持久卷(PV)正确绑定到 pod。 它会验证 Pod 所需的卷是否能与节点绑定,并确保该卷在所选节点上可用。 此插件可以接收下列参数:-
VolumeClaims:由正在调度的 Pod 发出的持久卷声明(PVC)。 -
Node:正在考虑用于调度的候选节点。 -
VolumeAvailable:检查持久卷是否在节点上或相应区域中可用。 -
Pod:正在请求卷绑定的 Pod。 -
StorageClass:与持久卷相关联的存储类。 -
VolumeBindingMode:定义卷绑定模式是Immediate还是WaitForFirstConsumer(用于延迟绑定,直到 Pod 被调度)。
-
VolumeRestrictions:确保在计划 Pod 时遵守卷限制(例如节点可附加的卷数限制)。 它阻止在卷限制会被违反的节点上调度 Pod。VolumeZone:确保卷在 Pod 所在的同一可用性区域中进行调度。 例如,如果 Pod 请求一个必须位于特定区域的卷,插件会确保 Pod 和该卷在同一区域。
资源和拓扑优化调度插件
NodeResourcesBalancedAllocation:旨在平衡节点上的资源分配。 计划 Pod 时,它会考虑如何在节点之间分配 CPU 和内存等资源,以避免过度预配或未充分利用资源。 此插件可以接收下列参数:-
ResourceRequests:正在调度的 Pod 的资源请求(CPU、内存等)。 -
Node:用于调度的候选节点。 -
NodeResources:节点的可用资源(CPU、内存等)。 -
ClusterResourceUsage:群集范围的资源使用情况指标,以帮助确定平衡资源的最佳节点。
-
NodeResourcesFit:检查节点是否有足够的可用资源(CPU、内存等)来运行 Pod。 它确保 Pod 仅在资源充足的节点上进行调度。 此插件可以接收下列参数:-
ResourceRequests:Pod 的资源请求。 -
Node:正在考虑用于调度的候选节点。 -
NodeCapacity:节点上资源的可用容量。 -
Pod:正在调度的 Pod 及其资源请求。
-
ImageLocality:帮助调度程序根据所需容器镜像的存在情况,决定是否将 Pod 调度到节点上。 它会尝试在已存在所需镜像的节点上调度容器组(Pod),减少拉取镜像所需的时间。PodTopologySpread:确保 Pod 均匀分布在拓扑结构(如区域或地区)中,以实现高可用性和容错。 它尝试避免将 Pod 的多个副本置于同一故障域中。 此插件可以接收下列参数:-
TopologySpreadConstraints:定义 Pod 在故障域中的分布方式的约束,包括密钥(例如:topology.kubernetes.io/zone)以及要放置在每个域中的 Pod 数。 -
Pod:正在调度的 Pod。 -
FailureDomain:故障域标识符(例如:分区或区域)。 -
PodAffinity:有关 Pod 相关性的信息,这也可能会影响 Pod 的分布方式。 -
Node:放置节点的潜在位置。 -
PodSpreadScore:用于确定 Pod 应该在多大程度上跨多个域进行“分散”,更高的分数表示更好的分布。
-
DefaultPreemption:处理抢占机制,这是通过逐出低优先级 Pod 来为高优先级 Pod 腾出空间的过程。 如果由于节点上资源不足而无法调度 Pod,该插件会通过抢占其他 Pod 来腾出空间。 此插件可以接收下列参数:-
PodPriority:定义调度中 Pod 的优先级。 -
PreemptionPolicy:用于处理 Pod 抢占的策略(例如:"PreemptLowerPriority"或"DoNotPreempt")。 -
PodPriorityClass:与 Pod 关联的优先级类。 -
PodInfo:有关可能被驱逐的候选 Pod 的信息。 -
Node:有关考虑抢占的节点的信息。
-
ImageLocality:帮助调度程序根据所需容器镜像的存在情况,决定是否将 Pod 调度到节点上。 它会尝试在已存在所需镜像的节点上调度容器组(Pod),减少拉取镜像所需的时间。InterPodAffinity:考虑到用户指定的 关联 规则,这些规则根据其他 Pod 的接近影响调度。 如果 Pod 具有关联规则,它会尝试将 Pod 安排在同一节点上或与具有相关性的其他 Pod 在同一拓扑中(例如:出于性能原因或紧密耦合)。 此插件可以接收下列参数:-
Affinity:定义 Pod 的必需或首选亲和性规则,该规则指定哪些 Pod 应或不应在附近被调度。 -
TopologyKey:表示关联规则应用到的失败域的键(例如:"kubernetes.io/hostname"节点级相关性或"topology.kubernetes.io/zone"区域级别)。 -
Weight:定义调度器应考虑某一特定亲和性规则的力度。 -
Pod:正在调度的 Pod。 -
OtherPods:要考虑的其他 Pod 列表,这些 Pod 与关联规则有关。
-
NodeAffinity:启用基于节点标签的调度。 它允许用户根据节点的标签指定 Pod 可以被调度到哪些节点上,并提供对 Pod 在节点上放置的细粒度控制。 此插件可以接收下列参数:-
NodeAffinity:定义所需的或首选节点关联规则,例如requiredDuringSchedulingIgnoredDuringExecution或preferredDuringSchedulingIgnoredDuringExecution。 -
NodeSelectorTerms:定义必须匹配的节点标签和值集。 -
Pod:正在调度的 Pod。 -
Node:调度的潜在节点。 -
LabelSelector:基于标签选择节点的选择器。
-
NodeName:强制在特定节点上调度 Pod。 指定确切的节点名称时,计划程序将 Pod 置于该节点上(如果可能)。NodePorts:确保带有类型NodePort服务的 Pod 可以调度到具有可用于绑定的端口的节点上。 它会检查节点是否有足够的资源来支持服务的节点端口分配。NodeResourcesBalancedAllocation:旨在平衡节点上的资源分配。 计划 Pod 时,它会考虑如何在节点之间分配 CPU 和内存等资源,以避免过度预配或未充分利用资源。 此插件可以接收下列参数:-
ResourceRequests:正在调度的 Pod 的资源请求(CPU、内存等)。 -
Node:用于调度的候选节点。 -
NodeResources:节点的可用资源(CPU、内存等)。 -
ClusterResourceUsage:群集范围的资源使用情况指标,以帮助确定平衡资源的最佳节点。
-
NodeResourcesFit:检查节点是否有足够的可用资源(CPU、内存等)来运行 Pod。 它确保 Pod 仅在资源充足的节点上进行调度。 此插件可以接收下列参数:-
ResourceRequests:Pod 的资源请求。 -
Node:正在考虑用于调度的候选节点。 -
NodeCapacity:节点上资源的可用容量。 -
Pod:正在调度的 Pod 及其资源请求。
-
NodeUnschedulable:确保不会在标记为 不可调度 的节点上调度 Pod。 如果某个节点被node.kubernetes.io/unschedulable污染,计划程序不会在该节点上放置任何新 Pod。NodeVolumeLimits:检查节点是否超过了其卷限制。 每个节点可以附加的卷数有上限,该插件可确保 Pod 不会被调度到已达到支持限制的节点上。PodTopologySpread:确保 Pod 均匀分布在拓扑结构(如区域或地区)中,以实现高可用性和容错。 它尝试避免将 Pod 的多个副本置于同一故障域中。 此插件可以接收下列参数:-
TopologySpreadConstraints:定义 Pod 在故障域中的分布方式的约束,包括密钥(例如:topology.kubernetes.io/zone)以及要放置在每个域中的 Pod 数。 -
Pod:正在调度的 Pod。 -
FailureDomain:故障域标识符(例如:分区或区域)。 -
PodAffinity:有关 Pod 相关性的信息,这也可能会影响 Pod 的分布方式。 -
Node:放置节点的潜在位置。 -
PodSpreadScore:用于确定 Pod 应该在多大程度上跨多个域进行“分散”,更高的分数表示更好的分布。
-
PrioritySort:根据其优先级类对 Pod 列表进行排序。 Pods以更高优先级被调度。 它有助于做出抢占决策,并确定要考虑哪些 Pod 进行优先级调度。SchedulingGates:介绍计划入口的概念,即在计划 Pod 之前必须满足的条件。 例如,它可以强制完成某些任务或作业,然后调度程序尝试调度 Pod。 -TaintToleration:检查 Pod 是否具有在带有污点的节点上调度所需的容忍度。 节点上的污点会阻止 Pod 被调度到节点上,除非 Pod 具有匹配的容忍度。VolumeBinding:确保持久卷(PV)正确绑定到 pod。 它会验证 Pod 所需的卷是否能与节点绑定,并确保该卷在所选节点上可用。 此插件可以接收下列参数:-
VolumeClaims:由正在调度的 Pod 发出的持久卷声明(PVC)。 -
Node:正在考虑用于调度的候选节点。 -
VolumeAvailable:检查持久卷是否在节点上或相应区域中可用。 -
Pod:请求卷绑定的 Pod。 -
StorageClass:与持久卷相关联的存储类。 -
VolumeBindingMode:定义卷绑定模式是Immediate还是WaitForFirstConsumer(用于延迟绑定,直到 Pod 被调度)。
-
VolumeRestrictions:确保在计划 Pod 时遵守卷限制(例如节点可附加的卷数限制)。 它阻止在卷限制会被违反的节点上调度 Pod。 -VolumeZone:确保卷在 Pod 所在的同一可用性区域中调度。 例如,如果 Pod 请求一个必须位于特定区域的卷,插件会确保 Pod 和该卷在同一区域。