运行 Kubernetes 作业

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

此页面展示了如何在启用了 Kueue 的 Kubernetes 集群中运行作业。

此页面的目标受众是 批处理用户

开始之前

确保满足以下条件

下图显示了您将在本教程中交互的所有概念

Kueue Components

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

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

kubectl -n default get localqueues
# Or use the 'queues' alias.
kubectl -n default get queues

输出类似于以下内容

NAME         CLUSTERQUEUE    PENDING WORKLOADS
user-queue   cluster-queue   3

ClusterQueue 定义队列的配额。

1. 定义作业

在 Kueue 中运行作业类似于 在没有 Kueue 的 Kubernetes 集群中运行作业。但是,您必须考虑以下区别

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

这是一个包含三个 Pod 的作业示例,这些 Pod 仅休眠几秒钟。

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: gcr.io/k8s-staging-perf-tests/sleep:v0.1.0
        args: ["30s"]
        resources:
          requests:
            cpu: 1
            memory: "200Mi"
      restartPolicy: Never

2. 运行作业

您可以使用以下命令运行作业

kubectl create -f sample-job.yaml

在内部,Kueue 将为此作业创建一个具有匹配名称的相应 工作负载

kubectl -n default get workloads

输出类似于以下内容

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

3.(可选)监控工作负载状态

您可以使用以下命令查看工作负载状态

kubectl -n default describe workload sample-job-sl4bm

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

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 有足够的配额来运行工作负载时,它将允许工作负载。要查看工作负载是否已允许,请运行以下命令

kubectl -n default get workloads

输出类似于以下内容

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

要查看工作负载允许的事件,请运行以下命令

kubectl -n default describe workload sample-job-sl4bm

输出类似于以下内容

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

要继续监控工作负载进度,您可以运行以下命令

kubectl -n default describe workload sample-job-sl4bm

工作负载运行完成后,输出类似于以下内容

...
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
...

要查看有关作业状态的更多详细信息,请运行以下命令

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

由于事件的时间戳具有秒的分辨率,因此事件可能以与实际发生顺序略有不同的顺序列出。

部分允许

从 v0.4.0 版本开始,Kueue 为批处理用户提供了创建作业的功能,这些作业理想情况下将以并行度 P0 运行,但如果作业不符合可用配额,则可以接受较小的并行度 Pn

在允许过程中考虑了借用抢占后,Kueue 才会尝试降低并行度,并且两者均不可行。

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

例如,由以下清单定义的作业

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: gcr.io/k8s-staging-perf-tests/sleep:v0.1.0
        args: ["30s"]
        resources:
          requests:
            cpu: 1
            memory: "200Mi"
      restartPolicy: Never

当在仅有 9 个可用 CPU 的 ClusterQueue 中排队时,它将以 parallelism=9 允许。请注意,完成数不会更改。

注意:PartialAdmission 是一项默认禁用的Alpha 功能,有关详细信息,请查看更改功能门配置部分的安装