设置作业准入策略

实施验证准入策略以防止在没有队列名称的情况下创建作业。

此页面展示了如何使用基于 通用表达式语言 (CEL) 的 Kubernetes 验证准入策略 为 Kueue 设置作业准入策略。

开始之前

确保满足以下条件

  • Kubernetes 集群正在运行。
  • kubectl 命令行工具可以与你的集群通信。
  • 已安装 Kueue.

示例

以下示例展示了如何设置作业准入策略,以拒绝发送到标记为 kueue-managed 命名空间的、没有队列名称的早期所有作业或作业集。

您应该在 Kueue 配置中将 manageJobsWithoutQueueName 设置为 false,以允许管理员在未标记为 kueue-managed 的任何命名空间中执行作业。发送到未标记命名空间的作业不会被拒绝,也不会被 Kueue 管理。

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
  name: sample-validating-admission-policy
spec:
  failurePolicy: Fail
  matchConstraints:
    resourceRules:
    - apiGroups:   ["batch"]
      apiVersions: ["v1"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["jobs"]
    - apiGroups:   ["jobset.x-k8s.io"]
      apiVersions: ["v1alpha2"]
      operations:  ["CREATE", "UPDATE"]
      resources:   ["jobsets"]
  validations:
    - expression: "has(object.metadata.labels) && 'kueue.x-k8s.io/queue-name' in object.metadata.labels && object.metadata.labels['kueue.x-k8s.io/queue-name'] != ''"
      message: "The label 'kueue.x-k8s.io/queue-name' is either missing or does not have a value set."

要创建该策略,请下载上述文件并运行以下命令

kubectl create -f sample-validating-policy.yaml

然后,通过创建 ValidatingAdmissionPolicyBinding 将验证准入策略应用到命名空间。策略绑定将命名空间链接到已定义的准入策略,并指示 Kubernetes 如何响应验证结果。

以下是策略绑定的示例

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: sample-validating-admission-policy-binding
spec:
  policyName: sample-validating-admission-policy
  validationActions: [Deny]
  matchResources:
    namespaceSelector:
      matchLabels:
        kueue-managed: "true"

要创建绑定,请下载上述文件并运行以下命令

kubectl create -f sample-validating-policy-binding.yaml

运行以下命令来标记您希望强制执行此策略的每个命名空间

kubectl label namespace my-user-namespace 'kueue-managed=true'

现在,当您尝试在标记为 kueue-managed 的任何命名空间中创建没有 kueue.x-k8s.io/queue-name 标签或值的 作业作业集 时,错误消息将类似于以下内容

ValidatingAdmissionPolicy 'sample-validating-admission-policy' with binding 'sample-validating-admission-policy-binding' denied request: The label 'kueue.x-k8s.io/queue-name' is either missing or does not have a value set.