设置并发准入

配置 Kueue,将已准入的工作负载迁移到更优先的 ResourceFlavor,并发运行按规格划分的准入检查。
Feature state alpha since Kueue v0.18

本文介绍如何为 ClusterQueue 设置并发准入

准备工作

确保满足以下条件:

  • Kubernetes 集群正在运行。
  • kubectl 命令行工具可以访问集群。
  • 已安装 0.18 或更高版本的 Kueue

启用特性门控

ConcurrentAdmission 是 alpha 特性,默认关闭。

请按照特性门控配置说明, 在 Kueue controller manager 中启用 ConcurrentAdmission 特性门控。

配置规格和队列

创建一个定义了 .spec.concurrentAdmissionPolicyClusterQueue, 并在同一个 ResourceGroup 中配置多个 ResourceFlavor。规格顺序很重要: 请按照从最高优先级到最低优先级的顺序列出规格。

apiVersion: kueue.x-k8s.io/v1beta2
kind: ResourceFlavor
metadata:
  name: reservation
---
apiVersion: kueue.x-k8s.io/v1beta2
kind: ResourceFlavor
metadata:
  name: on-demand
---
apiVersion: kueue.x-k8s.io/v1beta2
kind: ResourceFlavor
metadata:
  name: spot
---
apiVersion: kueue.x-k8s.io/v1beta2
kind: ClusterQueue
metadata:
  name: team-cluster-queue
spec:
  namespaceSelector: {}
  concurrentAdmissionPolicy:
    migration:
      mode: TryPreferredFlavors
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    # Flavors are ordered from the most preferred to the least preferred.
    - name: reservation
      resources:
      - name: cpu
        nominalQuota: 4
      - name: memory
        nominalQuota: 16Gi
    - name: on-demand
      resources:
      - name: cpu
        nominalQuota: 8
      - name: memory
        nominalQuota: 32Gi
    - name: spot
      resources:
      - name: cpu
        nominalQuota: 16
      - name: memory
        nominalQuota: 64Gi
---
apiVersion: kueue.x-k8s.io/v1beta2
kind: LocalQueue
metadata:
  namespace: default
  name: team-queue
spec:
  clusterQueue: team-cluster-queue

创建上述配置:

kubectl apply -f https://kueue.sigs.k8s.io/examples/admin/concurrent-admission-setup.yaml

使用此配置时,Kueue 可以为每个规格创建一个准入尝试:

  • reservation 是最高优先级规格。
  • on-demand 的优先级低于 reservation
  • spot 是最低优先级规格。

当前唯一支持的迁移模式是 TryPreferredFlavors。在该模式下,如果 Workload 先在 spot 上启动,说明 reservationon-demand 当时没有准入该 Workload, 原因可能是配额不可用,也可能是所需的准入检查仍在等待。Kueue 会继续尝试 reservationon-demand。如果之后某个更高优先级规格对应的 Variant 被准入, Kueue 会将 Workload 迁移到该规格。

将迁移限制到最后可接受规格

如果希望将迁移限制到某个规格偏好阈值以上,请使用 lastAcceptableFlavorName API。 该字段用于定义 Workload 可以迁移到的最低可接受规格。

例如,使用以下策略时,Workload 可以从 spot 迁移到 reservation, 也可以从 on-demand 迁移到 reservation,但不能从 spot 迁移到 on-demand

concurrentAdmissionPolicy:
  migration:
    mode: TryPreferredFlavors
    constraints:
      lastAcceptableFlavorName: reservation

设置预留规格和同质规格

当你有一个优先的预留规格,以及多个优先级较低且同质的规格时,可以使用 lastAcceptableFlavorName。这样,如果预留规格可用,Workload 可以迁移到该规格; 但不会在同质的兜底规格之间迁移。

例如,运行在 zone-b 上的 Workload 可以迁移到 reservation,但不会迁移到 zone-a

apiVersion: kueue.x-k8s.io/v1beta2
kind: ClusterQueue
metadata:
  name: cluster-queue
spec:
  namespaceSelector: {}
  concurrentAdmissionPolicy:
    migration:
      mode: TryPreferredFlavors
      constraints:
        lastAcceptableFlavorName: reservation
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: reservation
      resources:
      - name: cpu
        nominalQuota: 4
      - name: memory
        nominalQuota: 16Gi
    - name: zone-a
      resources:
      - name: cpu
        nominalQuota: 8
      - name: memory
        nominalQuota: 32Gi
    - name: zone-b
      resources:
      - name: cpu
        nominalQuota: 8
      - name: memory
        nominalQuota: 32Gi
    - name: zone-c
      resources:
      - name: cpu
        nominalQuota: 8
      - name: memory
        nominalQuota: 32Gi
  admissionChecksStrategy:
    admissionChecks:
    - name: capacity-check
      onFlavors: [zone-a, zone-b, zone-c]

观察并发准入

向指向该 ClusterQueueLocalQueue 提交工作负载。 当 ClusterQueue 启用并发准入时,Kueue 会将原始 Workload 标记为 Parent, 并创建由该 Parent 拥有的 Variant Workload。每个 Variant 都被限制到一个 ResourceFlavor。

列出 Workload:

kubectl get workloads

查看 Parent Workload:

kubectl describe workload WORKLOAD_NAME

通过 Parent 标签 kueue.x-k8s.io/concurrent-admission-parent 查找 Parent Workload:

kubectl get workloads -l kueue.x-k8s.io/concurrent-admission-parent=true

Parent Workload 的元数据可以如下所示:

metadata:
  name: sample-job
  labels:
    kueue.x-k8s.io/concurrent-admission-parent: "true"

查看 Variant 元数据,并确认它通过 ownerReferences 引用 Parent Workload:

kubectl get workload VARIANT_WORKLOAD_NAME -o yaml

Variant Workload 的元数据可以如下所示:

metadata:
  name: sample-job-variant-spot-a2342
  ownerReferences:
  - apiVersion: kueue.x-k8s.io/v1beta2
    kind: Workload
    name: sample-job
    uid: 7a9a0d5e-2c9c-4b3a-9c62-2b64a72f6a3f
    controller: true
    blockOwnerDeletion: true

Parent Workload 是作业集成观察准入状态的对象。Variant Workload 是内部准入尝试。 不要手动创建或编辑 Parent 标签,也不要手动编辑 Variant 注解。

接下来