使用 AKS 上的群集自动缩放程序为 Kueue 批处理作业预配容量

本文介绍如何将 Kueue 准入控制与 Azure Kubernetes 服务 (AKS) 群集自动缩放器 结合使用,以便批处理作业在运行之前就能获得所需的节点。 使用 suspend: true 队列标签创建作业。 Kueue 会为其创建一个 Kubernetes ProvisioningRequest。 集群自动扩缩器会以原子方式扩容节点池以满足该需求,之后 Kueue 才会接纳该作业。

组件 角色
Kueue 根据配额对作业和入口进行排队
预配请求准入检查 在准入之前先向集群自动扩缩器请求容量
群集自动缩放程序 以原子方式纵向扩展节点池以满足请求

Important

AKS 文档和示例中都提到了开源软件。 您部署的软件被排除在 AKS 服务级别协议、有限保修和 Azure 支持之外。 将开源技术与 AKS 一起使用时,请查阅相应社区和项目维护者提供的支持选项来制定计划。

Microsoft 将负责生成我们在 AKS 上部署的开源包。 该责任包括拥有构建、扫描、签名、验证和快速修复流程的完整所有权,并掌控容器镜像中的二进制文件。 如需了解详细信息,请参阅 AKS 漏洞管理和 AKS 支持范围。

先决条件

  • 本文假设对 Kueue 有基本的了解。 如需了解详细信息,请参阅了解用于批处理调度的 Kueue。
  • 具有启用了 群集自动缩放 的节点池的 AKS 群集。 这些示例使用一个名为 、带有 的池。
  • Azure CLI 2.70 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
  • kubectl 连接到群集(az aks get-credentials)。
  • 使用 Helm 3.12 或更高版本来安装 Kueue 控制器。

可以在 Azure/AKS 存储库的 kueue-and-ray-on-aks 目录中找到本文中使用的示例清单。 克隆存储库,以便可以运行它们:

git clone https://github.com/Azure/AKS.git
cd AKS/examples/kueue-and-ray-on-aks

安装 Kueue

使用 Helm 安装 Kueue 控制器:

helm install kueue oci://k8sgcr.azk8s.cn/kueue/charts/kueue \
  --version 0.17.1 \
  --namespace kueue-system \
  --create-namespace \
  --wait

验证控制器是否正在运行:

kubectl -n kueue-system get pods

创建队列配置

应用自动缩放队列配置。 该文件创建自己的 cas-kueue-demo 命名空间以及队列对象,因此不需要单独的命名空间步骤:

kubectl apply -f 2-kueue-queues/manifests/40-autoscale-queue.yaml

ResourceFlavor 以带有 agentpool=scalepool 标签的节点为目标,AKS 会自动将该标签应用到该节点池:

apiVersion: kueue.x-k8s.io/v1beta2
kind: ResourceFlavor
metadata:
  name: scalepool
spec:
  nodeLabels:
    agentpool: scalepool

验证:

kubectl get resourceflavor scalepool

配置预配门

同一文件将预配门与另外三个对象连接:

  • ProvisioningRequestConfigcas-provreq-config选择best-effort-atomic-scale-up.autoscaling.x-k8s.io预配类,因此自动扩缩器会以单次原子性扩容的方式添加所请求的容量。
  • AdmissionCheckcas-provisioning 使用 kueue.x-k8s.io/provisioning-request 控制器并指向该配置。
  • ClusterQueuecas-cluster-queue通过cas-provisioning上的admissionChecksStrategy对准入进行控制,因此它接纳的每个工作负载都会先经过资源预配关卡。

验证对象:

kubectl get admissioncheck cas-provisioning
kubectl get clusterqueue cas-cluster-queue
kubectl -n cas-kueue-demo get localqueue cas-local-queue

预期输出:

NAME               AGE
cas-provisioning   1m

NAME                COHORT   PENDING WORKLOADS
cas-cluster-queue            0

NAME              CLUSTERQUEUE        PENDING WORKLOADS   ADMITTED WORKLOADS
cas-local-queue   cas-cluster-queue   0                   0

提交工作负载

提交通过队列路由的挂起作业。 它请求三个 Pod,而单个初始节点无法全部容纳它们,这会触发扩容:

kubectl apply -f 3-workloads/cas-batch-job/manifests/job.yaml

该作业带有 kueue.x-k8s.io/queue-name: cas-local-queue 标签和 suspend: true,因此其准入由 Kueue 接管:

apiVersion: batch/v1
kind: Job
metadata:
  name: kueue-cas-job
  namespace: cas-kueue-demo
  labels:
    kueue.x-k8s.io/queue-name: cas-local-queue
spec:
  parallelism: 3
  completions: 3
  suspend: true
  template:
    spec:
      nodeSelector:
        agentpool: scalepool
      containers:
        - name: worker
          image: mcr.azk8s.cn/azurelinux/busybox:1.36
          command: ["sh", "-c", "echo running on $(hostname); sleep 30"]
          resources:
            requests:
              cpu: "1800m"
              memory: "256Mi"
      restartPolicy: Never

查看预配流程

Kueue 创建工作负荷,然后创建 ProvisioningRequest。 集群自动扩缩器满足该请求,池会扩容:

# Kueue creates a Workload and a ProvisioningRequest
kubectl -n cas-kueue-demo get workloads
kubectl -n cas-kueue-demo get provisioningrequest

# The autoscaler marks the request Provisioned and adds nodes
kubectl get nodes -l agentpool=scalepool -w

# The Job runs to completion once nodes are Ready
kubectl -n cas-kueue-demo get job kueue-cas-job -w

预期结束状态:

NAME            STATUS     COMPLETIONS   DURATION   AGE
kueue-cas-job   Complete   3/3           34s        2m

Troubleshooting

症状 原因 修复
作业暂停,否 ProvisioningRequest 错误的队列名称标签 验证 kueue.x-k8s.io/queue-name: cas-local-queue 是否与 LocalQueue 名称匹配。
ProvisioningRequest 已创建,但 status.conditions 为空 自动缩放程序尚未处理请求 确认节点池已启用群集自动缩放程序,然后在一分钟后重新检查
Provisioned=False,原因 CapacityIsNotFound 池无法达到所请求的大小,通常是因为现有工作负载占用了池容量,或者请求超过了 --max-count 释放容量或增加 --max-count。 自动缩放程序会不断重试,作业保持挂起状态,而不是部分计划。
准入后处于 Pending 状态的 Pod 节点标签不匹配 确认 scalepool 节点携带 agentpool=scalepool 标签 kubectl get nodes --show-labels
Kueue 控制器未运行 Helm 发布问题 通过 kubectl -n kueue-system logs deploy/kueue-controller-manager 进行检查

有关完整清单,请参阅 Azure/AKS 存储库中的 kueue-and-ray-on-aks 目录。

清理资源

删除工作负荷和队列配置:

kubectl delete -f 3-workloads/cas-batch-job/manifests/job.yaml
kubectl delete -f 2-kueue-queues/manifests/40-autoscale-queue.yaml

后续步骤

若要详细了解本文中使用的组件,请参阅: