运行 Kubernetes Job
本页面向您展示如何在启用了 Kueue 的 Kubernetes 集群中运行 Job。
本页面的目标受众是批量用户。
开始之前
确保满足以下条件:
下图显示了您在本教程中将要学习的所有概念:
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/v1beta2
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
由于事件的时间戳精度为秒,事件可能与实际发生的顺序略有不同。
部分准入
Kueue 提供了批量用户创建 Job 的能力,这些 Job 理想情况下将以并行度 P0 运行,
但如果 Job 不适合可用配额,可以接受较小的并行度 Pn。
Kueue 只有在准入过程中同时考虑了_借用_和_抢占_, 并且两者都不可行的情况下,才会尝试减少并行度。
要允许部分准入,您可以在 Job 的 kueue.x-k8s.io/job-min-parallelism
注解中提供最小可接受并行度 Pmin,Pn 应该大于 0 且小于 P0。
当 Job 被部分准入时,其并行度将设置为 Pn,Pn 将设置为 Pmin 和 P0
之间的最大可接受值。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
被准入。请注意,完成次数不会改变。
反馈
这个页面有帮助吗?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.