准入检查
准入检查是一种机制,允许 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
被发出
接下来做什么?
- 阅读API 参考,了解
AdmissionCheck