全部產品
Search
文件中心

Container Service for Kubernetes:為ACK Kube Queue增加自訂准入檢查

更新時間:Mar 25, 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