全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:为ACK Kube Queue增加自定义准入检查

更新时间:Mar 24, 2026

默认情况下,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: 1

AdmissionCheck具体工作流程如下。

image

AdmissionCheck配置介绍

配置说明

管理员需要在集群中配置以下内容。

  • 一个控制器:自定义的AdmissionCheckController(对应上图中的ACController)。

    AdmissionCheckController是由您维护、用于完成自定义检查的控制器。通过监听QueueUnit的status中的admissionChecks字段,控制器能感知需要进行自定义检查的QueueUnit。通过QueueUnit的statusadmissionChecks字段中name对应的AdmissionCheck中的controllerName,控制器可以确定admissionChecks是否需要自身检查。完成检查后,控制器会根据结果是否成功修改QueueUnit的status中对应的admissionChecksstatusReady或者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

      参数

      类型

      描述

      controllerName

      string

      描述了需要关注该准入检查的控制器名称。

      parameters

      struct

      apiGroupkindname三个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.enabledtrue,启用ProvisioningRequestAdmissionCheck。启用后ProvisioningRequestAdmissionCheckController会自动部署。

image

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-config

3、通过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

参数

类型

描述

provisioningClassName

string

创建provisioningRequest时会被复制到provisioningRequestProvisioningClass字段中。

parameters

map[string]string

在创建provisioningRequest时会被复制到provisioningRequestParameters字段中。

managedResources

[]string

只有当QueueUnit包含该字段时,才会为QueueUnit创建provisioningRequest,否则直接将state置为Ready

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