运行 Kubernetes Job

在启用了 Kueue 的 Kubernetes 集群中运行 Job。

本页面向您展示如何在启用了 Kueue 的 Kubernetes 集群中运行 Job。

本页面的目标受众是批量用户

开始之前

确保满足以下条件:

下图显示了您在本教程中将要学习的所有概念:

Kueue Components

0. 识别命名空间中可用的队列

运行以下命令列出您命名空间中可用的 LocalQueues

kubectl -n default get localqueues
# 或使用 'queues' 别名。
kubectl -n default get queues

输出类似于以下内容:

NAME         CLUSTERQUEUE    PENDING WORKLOADS
user-queue   cluster-queue   3

ClusterQueue 定义了队列的配额。

1. 定义 Job

在 Kueue 中运行 Job 类似于在 Kubernetes 集群中运行 Job, 只是没有使用 Kueue。但是,您必须考虑以下差异:

  • 您应该在挂起状态下创建 Job, 因为 Kueue 将决定何时是启动 Job 的最佳时间。
  • 您必须设置要提交 Job 的队列。使用 kueue.x-k8s.io/queue-name 标签。
  • 您应该为每个 Job Pod 包含资源请求。

这是一个包含三个 Pod 的示例 Job,它们只是休眠几秒钟。

apiVersion: batch/v1
kind: Job
metadata:
  generateName: sample-job-
  namespace: default
  labels:
    kueue.x-k8s.io/queue-name: user-queue
spec:
  parallelism: 3
  completions: 3
  suspend: true
  template:
    spec:
      containers:
      - name: dummy-job
        image: registry.k8s.io/e2e-test-images/agnhost:2.53
        command: [ "/bin/sh" ]
        args: [ "-c", "sleep 60" ]
        resources:
          requests:
            cpu: "1"
            memory: "200Mi"
      restartPolicy: Never

2. 运行 Job

您可以使用以下命令运行 Job:

kubectl create -f sample-job.yaml

在内部,Kueue 将为此 Job 创建一个与名称匹配的相应Workload

kubectl -n default get workloads

输出将类似于以下内容:

NAME               QUEUE         RESERVED IN   ADMITTED   AGE
sample-job-sl4bm   user-queue                             1s

3. (可选)监控 Workload 的状态

您可以使用以下命令查看 Workload 状态:

kubectl -n default describe workload sample-job-sl4bm

如果 ClusterQueue 没有足够的配额来运行 Workload, 输出将类似于以下内容:

Name:         sample-job-sl4bm
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  kueue.x-k8s.io/v1beta1
Kind:         Workload
Metadata:
  ...
Spec:
  ...
Status:
  Conditions:
    Last Probe Time:       2022-03-28T19:43:03Z
    Last Transition Time:  2022-03-28T19:43:03Z
    Message:               workload didn't fit
    Reason:                Pending
    Status:                False
    Type:                  Admitted
Events:               <none>

当 ClusterQueue 有足够的配额来运行 Workload 时,它将让此 Workload 准入。 要查看 Workload 是否被准入,运行以下命令:

kubectl -n default get workloads

输出类似于以下内容:

NAME               QUEUE         RESERVED IN   ADMITTED   AGE
sample-job-sl4bm   user-queue    cluster-queue True       1s

要查看 Workload 准入的事件,运行以下命令:

kubectl -n default describe workload sample-job-sl4bm

输出类似于以下内容:

...
Events:
  Type    Reason    Age   From           Message
  ----    ------    ----  ----           -------
  Normal  Admitted  50s   kueue-manager  Admitted by ClusterQueue cluster-queue

要继续监控 Workload 进度,您可以运行以下命令:

kubectl -n default describe workload sample-job-sl4bm

一旦 Workload 完成运行,输出类似于以下内容:

...
Status:
  Conditions:
    ...
    Last Probe Time:       2022-03-28T19:43:37Z                                                                                                                      
    Last Transition Time:  2022-03-28T19:43:37Z                                                                                                                      
    Message:               Job finished successfully                                                                                                                 
    Reason:                JobFinished                                                                                                                               
    Status:                True                                                                                                                                      
    Type:                  Finished
...

要查看 Job 状态的更多详细信息,运行以下命令:

kubectl -n default describe job sample-job-sl4bm

输出类似于以下内容:

Name:             sample-job-sl4bm
Namespace:        default
...
Start Time:       Mon, 28 Mar 2022 15:45:17 -0400
Completed At:     Mon, 28 Mar 2022 15:45:49 -0400
Duration:         32s
Pods Statuses:    0 Active / 3 Succeeded / 0 Failed
Pod Template:
  ...
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  Suspended         22m   job-controller        Job suspended
  Normal  CreatedWorkload   22m   kueue-job-controller  Created Workload: default/sample-job-sl4bm
  Normal  SuccessfulCreate  19m   job-controller        Created pod: sample-job-sl4bm-7bqld
  Normal  Started           19m   kueue-job-controller  Admitted by clusterQueue cluster-queue
  Normal  SuccessfulCreate  19m   job-controller        Created pod: sample-job-sl4bm-7jw4z
  Normal  SuccessfulCreate  19m   job-controller        Created pod: sample-job-sl4bm-m7wgm
  Normal  Resumed           19m   job-controller        Job resumed
  Normal  Completed         18m   job-controller        Job completed

由于事件的时间戳精度为秒,事件可能与实际发生的顺序略有不同。

部分准入

Feature state beta since Kueue v0.5

Kueue 提供了批量用户创建 Job 的能力,这些 Job 理想情况下将以并行度 P0 运行, 但如果 Job 不适合可用配额,可以接受较小的并行度 Pn

Kueue 只有在准入过程中同时考虑了_借用_和_抢占_, 并且两者都不可行的情况下,才会尝试减少并行度。

要允许部分准入,您可以在 Job 的 kueue.x-k8s.io/job-min-parallelism 注解中提供最小可接受并行度 PminPn 应该大于 0 且小于 P0。 当 Job 被部分准入时,其并行度将设置为 PnPn 将设置为 PminP0 之间的最大可接受值。Job 的完成计数不会改变。

例如,由以下清单定义的 Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: sample-job-partial-admission
  namespace: default
  labels:
    kueue.x-k8s.io/queue-name: user-queue
  annotations:
    kueue.x-k8s.io/job-min-parallelism: "5"
spec:
  parallelism: 20
  completions: 20
  suspend: true
  template:
    spec:
      containers:
      - name: dummy-job
        image: registry.k8s.io/e2e-test-images/agnhost:2.53
        args: ["entrypoint-tester", "hello", "world"]
        resources:
          requests:
            cpu: 1
            memory: "200Mi"
      restartPolicy: Never

当在只有 9 个 CPU 可用的 ClusterQueue 中排队时,它将以 parallelism=9 被准入。请注意,完成次数不会改变。