本文介绍如何将 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
配置预配门
同一文件将预配门与另外三个对象连接:
-
ProvisioningRequestConfig
cas-provreq-config选择best-effort-atomic-scale-up.autoscaling.x-k8s.io预配类,因此自动扩缩器会以单次原子性扩容的方式添加所请求的容量。 -
AdmissionCheck
cas-provisioning使用kueue.x-k8s.io/provisioning-request控制器并指向该配置。 -
ClusterQueue
cas-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
后续步骤
若要详细了解本文中使用的组件,请参阅: