预置准入检查控制器

一个准入检查控制器,提供 kueue 与集群自动扩缩的集成。

Provisioning AdmissionCheck 控制器是专为将 Kueue 与 Kubernetes cluster-autoscaler 集成而设计的 AdmissionCheck 控制器。其主要功能是为持有 配额预留 的工作负载创建 ProvisioningRequests,并保持 AdmissionCheckState 同步。

该控制器是 Kueue 的一部分。它默认启用。您可以通过编辑 ProvisioningACC 特性门禁来禁用它。有关特性门禁配置的详细信息,请查看 安装 指南。

Provisioning Admission Check 控制器在 Kubernetes cluster-autoscaler 1.29 及更高版本中受支持。但是,某些云提供商可能没有针对它的实现。

ClusterAutoscaler 文档 中查看受支持的 Provisioning Class 以及它们的先决条件的列表。

用法

要使用 Provisioning AdmissionCheck,请使用 kueue.x-k8s.io/provisioning-request 作为 .spec.controllerName 创建一个 AdmissionCheck,并使用 ProvisioningRequestConfig 对象创建 ProvisioningRequest 配置。

接下来,您需要从 ClusterQueue 引用 AdmissionCheck,如 Admission Check 用法 中所述。

有关完整设置,请参见 以下内容

ProvisioningRequest 配置

有两种方法可以配置 Kueue 为你的作业创建的 ProvisioningRequests。

  • ProvisioningRequestConfig:此配置中的 AdmissionCheck 适用于通过此检查的所有作业。它使你可以设置 provisioningClassNamemanagedResourcesparameters
  • 作业注释:此配置使你可以为特定作业设置 parameters。如果注释和 ProvisioningRequestConfig 引用同一个参数,则注释值优先。

ProvisioningRequestConfig

ProvisioningRequestConfig 如下所示

apiVersion: kueue.x-k8s.io/v1beta1
kind: ProvisioningRequestConfig
metadata:
  name: prov-test-config
spec:
  provisioningClassName: check-capacity.autoscaling.x-k8s.io
  managedResources:
  - nvidia.com/gpu

其中

  • provisioningClassName - 描述了配置资源的不同模式。支持的 ProvisioningClasses 列在 ClusterAutoscaler 文档 中,还可以查看你的云提供商的文档以了解他们支持的其他 ProvisioningRequest 类。
  • managedResources - 包含自动缩放管理的资源列表。

请查看 API 定义 了解更多详情。

作业注释

传递 ProvisioningRequest 的另一种方法 parameters 是使用作业注释。每个带有前缀 provreq.kueue.x-k8s.io/ 的注释都将直接传递到创建的 ProvisioningRequest。例如,provreq.kueue.x-k8s.io/ValidUntilSeconds: "60" 将传递 ValidUntilSeconds 参数,其值为 60。请参阅以下更多示例。

一旦 Kueue 为你提交的作业创建了 ProvisioningRequest,修改作业中注释的值将不会对 ProvisioningRequest 产生影响。

示例

设置

apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: "default-flavor"
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: "cluster-queue"
spec:
  namespaceSelector: {} # match all.
  resourceGroups:
  - coveredResources: ["cpu", "memory", "nvidia.com/gpu"]
    flavors:
    - name: "default-flavor"
      resources:
      - name: "cpu"
        nominalQuota: 9
      - name: "memory"
        nominalQuota: 36Gi
      - name: "nvidia.com/gpu"
        nominalQuota: 9
  admissionChecksStrategy:
    admissionChecks:
      - name: "sample-prov"
        onFlavors: [default-flavor] # optional if the admission check targets all flavors.
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
  namespace: "default"
  name: "user-queue"
spec:
  clusterQueue: "cluster-queue"
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: AdmissionCheck
metadata:
  name: sample-prov
spec:
  controllerName: kueue.x-k8s.io/provisioning-request
  parameters:
    apiGroup: kueue.x-k8s.io
    kind: ProvisioningRequestConfig
    name: prov-test-config
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ProvisioningRequestConfig
metadata:
  name: prov-test-config
spec:
  provisioningClassName: queued-provisioning.gke.io
  managedResources:
  - nvidia.com/gpu

使用 ProvisioningRequest 的作业

apiVersion: batch/v1
kind: Job
metadata:
  generateName: sample-job-
  namespace: default
  labels:
    kueue.x-k8s.io/queue-name: user-queue
  annotations:
    provreq.kueue.x-k8s.io/maxRunDurationSeconds: "600"
spec:
  parallelism: 3
  completions: 3
  suspend: true
  template:
    spec:
      tolerations:
      - key: "nvidia.com/gpu"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: dummy-job
        image: gcr.io/k8s-staging-perf-tests/sleep:v0.1.0
        args: ["120s"]
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
            nvidia.com/gpu: 1
          limits:
            nvidia.com/gpu: 1
      restartPolicy: Never