你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Kubernetes 服务中负载放置的调度器配置概念(AKS)

本文介绍 Azure Kubernetes 服务(AKS)中工作负荷放置的计划程序配置和高级计划概念,包括可配置的计划程序配置文件、计划插件和计划约束。

关于 AKS 调度器

在 AKS 中,群集中节点之间工作负荷放置的默认机制是通过计划程序进行的。 默认调度程序是一个控制平面组件,负责将 AKS 部署的 Pod 分配到节点。 AKS 计划程序选择节点后,部署 Pod 将绑定到该节点,其余生命周期将继续。

在没有指定节点的情况下创建 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 列表进行排序。 先调度优先级更高的 Pod。 它有助于做出抢占决策,并确定应将哪些 Pod 纳入优先级调度的考量范围。

节点选择约束调度插件

  • InterPodAffinity:考虑用户指定的相关性规则,这些规则会根据其他 Pod 的邻近程度来影响调度决策。 如果 Pod 具有关联规则,它会尝试将 Pod 安排在同一节点上或与具有相关性的其他 Pod 在同一拓扑中(例如:出于性能原因或紧密耦合)。 此插件可以接收下列参数:

    • Affinity:为 Pod 定义必需或偏好的相关性规则,这些规则指定该 Pod 应被调度至(或不应调度至)其他哪些 Pod 附近的条件。
    • TopologyKey:表示关联规则应用到的失败域的键(例如: "kubernetes.io/hostname" 节点级相关性或 "topology.kubernetes.io/zone" 区域级别)。
    • Weight:定义调度器应考虑某一特定亲和性规则的力度。
    • Pod:正在调度 Pod。
    • OtherPods:要考虑的与相关性规则相关的其他 Pod 列表。
  • NodeAffinity:启用基于节点标签的调度。 它允许用户根据节点的标签来指定 Pod 可被调度到的节点规则,从而对 Pod 在节点上的部署位置实现精细控制。 此插件可以接收下列参数:

    • NodeAffinity:定义所需的或首选节点关联规则,例如 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution
    • 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 在各个域之间应达到的“分散程度”(得分越高,表明分散效果越好)。

后续步骤

在 AKS 群集上配置和部署调度器配置文件(预览版)