默认情况下,ACK Kube Queue仅检查ElasticQuotaTree中定义的配额的Max,配额检查通过后通过调度器进行调度。如果您需要自定义更复杂的出队检查逻辑,可基于AdmissionCheck机制来实现。AdmissionCheck是ACK Kube Queue提供的一种外部可接入的自定义出队检查机制,允许在任务从队列中出队前(即被调度器调度前)进行额外的验证或检查,确保只有符合条件的任务才能被调度器调度。
工作原理
在集群中新增AdmissionCheck后,ACK Kube Queue在QueueUnit完成了配额检查后不会立即将任务设置为Dequeued状态,而是将QueueUnit设置为Reserved状态,并在QueueUnit的status中增加Pending状态的admissionChecks。
apiVersion: scheduling.x-k8s.io/v1alpha1
kind: QueueUnit
metadata:
...
spec:
...
status:
admissionChecks:
- lastTransitionTime: "2025-01-17T01:46:58Z"
message: ""
name: sample-prov
state: Pending
lastUpdateTime: "2025-01-17T01:46:58Z"
message: Reserved resources success, waiting admission checks to be ready
phase: Reserved
podState: {}各AdmissionCheckController会检查各自的admissionChecks,并在检查通过后将admissionChecks中的state置为Ready状态。当所有AdmissionCheck都进入Ready状态后,QueueUnit进入Dequeued状态。
apiVersion: scheduling.x-k8s.io/v1alpha1
kind: QueueUnit
metadata:
...
spec:
...
status:
admissionChecks:
- lastTransitionTime: "2025-01-17T01:47:58Z"
message: Succeeded
name: sample-prov
state: Ready
lastUpdateTime: "2025-01-17T01:50:45Z"
message: Dequeued
phase: Dequeued
podState:
pending: 1AdmissionCheck具体工作流程如下。
AdmissionCheck配置介绍
配置说明
管理员需要在集群中配置以下内容。
一个控制器:自定义的AdmissionCheckController(对应上图中的ACController)。
AdmissionCheckController是由您维护、用于完成自定义检查的控制器。通过监听QueueUnit的
status中的admissionChecks字段,控制器能感知需要进行自定义检查的QueueUnit。通过QueueUnit的status中admissionChecks字段中name对应的AdmissionCheck中的controllerName,控制器可以确定admissionChecks是否需要自身检查。完成检查后,控制器会根据结果是否成功修改QueueUnit的status中对应的admissionChecks的status为Ready或者Rejected。两个自定义资源CRD:
AdmissionCheck
ACK Kube Queue安装时自动安装的CRD资源,您只需要提交CR即可,用于处理自定义检查逻辑。其中包含了需要关注该检查的控制器名称,以及该自定义检查的自定义参数。
AdmissionCheck的示例以及可用字段如下。
apiVersion: kueue.x-k8s.io/v1beta1 kind: AdmissionCheck metadata: name: sample-prov spec: controllerName: provisioning-request-admission-controller parameters: apiGroup: kueue.x-k8s.io kind: ProvisioningRequestConfig name: prov-test-config参数
类型
描述
controllerNamestring
描述了需要关注该准入检查的控制器名称。
parametersstruct
由
apiGroup、kind、name三个string类型字段组成的结构体类型,描述该AdmissionCheck关联的参数。自定义检查参数
AdmissionCheck中通过Parameters字段关联一个自定义参数。控制器执行检查时会读取自定义检查参数,以执行特定的检查逻辑。自定义参数需要用户自行安装CRD并提交CR。同一个控制器可以执行多种不同的检查逻辑。通过为每种检查定义不同的参数,控制器可以根据参数的值来区分不同的检查行为。
一个队列中的配置项:
部署AdmissionCheckController、AdmissionCheck以及自定义检查参数后,集群已经具备了自定义检查的能力。您可以在目标队列中增加检查项,以在队列中启用该自定义检查。
配置示例
一个AdmissionCheck配置示例如下。下文以ProvisioningRequestAdmissionCheckController为例。
1、启用ProvisioningRequestAdmissionCheck Controller
ProvisioningRequestAdmissionCheckController是ACK Kube Queue提供的用于与ProvisioningRequest结合的控制器。您可以在安装ACK Kube Queue的Helm Chart时,设置.Values.admissionCheckController.enabled为true,启用ProvisioningRequestAdmissionCheck。启用后ProvisioningRequestAdmissionCheckController会自动部署。

2、在AdmissionCheck中使用Controller
为了使用ProvisioningRequestAdmissionCheckController,您需要参见下方示例,提交AdmissionCheck,并将AdmissionCheck的controllerName设置为provisioning-request-admission-controller。
apiVersion: kueue.x-k8s.io/v1beta1
kind: AdmissionCheck
metadata:
name: sample-prov
spec:
controllerName: provisioning-request-admission-controller
parameters:
apiGroup: kueue.x-k8s.io
kind: ProvisioningRequestConfig
name: prov-test-config3、通过ProvisioningRequestConfig自定义检查参数
provisioningRequestConfig是专用于provisioningRequestAdmissionCheck的参数类型。您可以通过provisioningRequestConfig自定义检查参数。其示例以及可用字段如下。
apiVersion: kueue.x-k8s.io/v1beta1
kind: ProvisioningRequestConfig
metadata:
name: prov-test-config
spec:
provisioningClassName: atomic-scale-up.kubernetes.io
parameters:
managedResources:
- nvidia.com/gpu参数 | 类型 | 描述 |
| string | 创建 |
| map[string]string | 在创建 |
| []string | 只有当QueueUnit包含该字段时,才会为QueueUnit创建 |
4、在队列中添加AdmissionCheck配置项
您可以在队列配置中通过admissionChecks字段添加需要执行的检查项。示例如下。
apiVersion: scheduling.x-k8s.io/v1alpha1
kind: Queue
metadata:
name: example-queue # 替换为需要开启AdmissionCheck的队列名
namespace: kube-queue
spec:
...
admissionChecks:
- name: sample-prov # 填写上文提交的AdmissionCheck的Name
selector: # metav1.LabelSelector类型,只有满足该selector的QueueUnit会进行自定义检查
matchLabels:
app: gpu