准入检查

允许内部或外部组件影响工作负载准入的机制。

准入检查是一种机制,允许 Kueue 在准入工作负载之前考虑其他标准。在 Kueue 为工作负载预留配额后,Kueue 会同时运行 ClusterQueue 中配置的所有准入检查。只有当所有准入检查都为工作负载提供积极信号时,Kueue 才能准入工作负载。

API

准入检查是一个非命名空间 API 对象,用于定义有关准入检查的详细信息

  • controllerName - 标识处理准入检查的控制器,不一定是 Kubernetes Pod 或 Deployment 名称。不能留空。
  • retryDelayMinutes(已弃用) - 指定在检查失败后(在它变为 False 后)保持工作负载暂停多长时间。之后,检查状态变为“未知”。默认值为 15 分钟。
  • parameters - 标识具有检查附加参数的配置。

AdmissionCheck 对象如下所示

apiVersion: kueue.x-k8s.io/v1beta1
kind: AdmissionCheck
metadata:
  name: prov-test
spec:
  controllerName: kueue.x-k8s.io/provisioning-request
  parameters:
    apiGroup: kueue.x-k8s.io
    kind: ProvisioningRequestConfig
    name: prov-test-config

用法

定义后,可以在 ClusterQueue 的规范 中引用 AdmissionCheck。与队列关联的所有工作负载在被接纳之前需要由 AdmissionCheck 的控制器进行评估。与 ResourceFlavors 类似,如果未找到 AdmissionCheck 或其控制器未将其标记为 Active,则 ClusterQueue 将被标记为 Inactive。

有两种方法可以在 ClusterQueue 的规范中引用 AdmissionChecks

  • .spec.admissionChecks - 是将针对提交到 ClusterQueue 的所有工作负载运行的 AdmissionChecks 列表
  • .spec.admissionCheckStrategy - 封装了 admissionCheckStrategyRules 列表,它为您提供了更大的灵活性。它允许您为所有工作负载运行 AdmissionCheck,或将 AdmissionCheck 与特定的 ResourceFlavor 关联。要指定 AdmissionCheck 应针对其运行的 ResourceFlavors,请使用 admissionCheckStrategyRule.onFlavors 字段,如果您想为所有工作负载运行 AdmissionCheck,只需将该字段留空即可。

一次只能指定上述字段之一。

示例

使用 .spec.admissionChecks
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: "cluster-queue"
spec:
<...>
  admissionChecks:
  - sample-prov
使用 .spec.admissionCheckStrategy
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: "cluster-queue"
spec:
<...>
  admissionChecksStrategy:
    admissionChecks:
    - name: "sample-prov"           # Name of the AdmissionCheck to be run
      onFlavors: ["default-flavor"] # This AdmissionCheck will only run for Workloads that use default-flavor
    - name: "sample-prov-2"         # This AdmissionCheck will run for all Workloads regardless of a used ResourceFlavor

AdmissionCheckStates

AdmissionCheckState 是 AdmissionCheck 的状态对于特定工作负载的表示形式。AdmissionCheckStates 列在工作负载的 .status.admissionCheckStates 字段中。

AdmissionCheck 可以处于以下状态之一

  • Pending - 检查仍未执行/尚未完成
  • Ready - 检查已通过
  • Retry - 检查目前无法通过,它将退避(可能允许其他人尝试,取消配额阻止)并重试。
  • Rejected - 检查在不久的将来不会通过。不值得重试。

具有 Pending AdmissionChecks 的工作负载的状态类似于以下内容

status:
  admission:
    <...>
  admissionChecks:
  - lastTransitionTime: "2023-10-20T06:40:14Z"
    message: ""
    name: sample-prov
    podSetUpdates:
    - annotations:
        cluster-autoscaler.kubernetes.io/consume-provisioning-request: job-prov-job-9815b-sample-prov
      name: main
    state: Pending
  <...>

Kueue 确保工作负载的 AdmissionCheckStates 列表与工作负载的 ClusterQueue 列表同步。当用户添加新的 AdmissionCheck 时,Kueue 会将其添加到工作负载的 AdmissionCheckStates 中,状态为 Pending。如果工作负载被接纳,添加新的 AdmissionCheck 不会驱逐工作负载。

使用 AdmissionChecks 接纳工作负载

一旦工作负载的 QuotaReservation 条件设置为 True,并且其所有 AdmissionChecks 都处于 Ready 状态,工作负载将变为 Admitted

如果工作负载的任何 AdmissionCheck 处于 Retry 状态

  • 如果 Admitted,工作负载将被驱逐 - 工作负载将在 workload.Status.Condition 中具有 Evicted 条件,原因是 AdmissionCheck
  • 如果工作负载具有 QuotaReservation,它将被释放。
  • 事件 EvictedDueToAdmissionCheck 被触发

如果工作负载的任何 AdmissionCheck 处于 Rejected 状态

  • 工作负载被停用 - workload.Spec.Active 设置为 False
  • 如果Admitted,工作负载将被驱逐 - 工作负载在workload.Status.Condition中具有Evicted条件,其中InactiveWorkload作为Reason
  • 如果工作负载具有 QuotaReservation,它将被释放。
  • 事件AdmissionCheckRejected被发出

接下来做什么?



上次修改时间为 2024 年 6 月 19 日:改善 AdmissionCheck 文档(#2408)(d30c8556)