在 Kubernetes 中,Job 是一种用来运行一次或多次任务的控制器对象。Job 对象的主要作用是保证任务的完成,当任务完成后,Job 对象会将任务的状态记录在 Pod 中,并且可以让用户查询任务的执行状态。
Job 对象与 Deployment 对象有些类似,但 Job 对象的一个主要特点是,它可以保证任务的完成,而 Deployment 对象则是保证 Pod 的数量符合用户的需求。
本文将通过一个简单的示例来介绍如何创建一个 Kubernetes Job,并对 Job 的执行状态进行查询。
示例
首先,我们需要一个任务。在这个示例中,我们将创建一个简单的 Bash 脚本,该脚本会在执行时输出一些信息,然后睡眠 5 秒钟,最后退出。以下是脚本的内容:
代码语言:javascript复制#!/bin/bash
echo "Start running the job..."
sleep 5
echo "The job is completed."
exit 0
将脚本保存为 job.sh
文件。
接下来,我们需要创建一个 Job 对象,用来运行这个脚本。以下是 Job 对象的定义:
代码语言:javascript复制apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 1
template:
metadata:
name: myjob
spec:
containers:
- name: myjob
image: ubuntu:latest
command: ["/bin/bash", "-c"]
args:
- "./job.sh"
restartPolicy: Never
可以看到,该 Job 对象的定义中,指定了一个 Pod 模板,Pod 中运行的容器是使用 ubuntu:latest
镜像,命令是 ./job.sh
。Job 对象中的 completions
字段指定了这个任务需要执行的次数,这里我们只需要执行一次任务。
将以上 YAML 文件保存为 job.yaml
。
接下来,我们可以使用 kubectl 命令来创建 Job 对象:
代码语言:javascript复制$ kubectl apply -f job.yaml
job.batch/myjob created
可以使用以下命令查询 Job 对象的状态:
代码语言:javascript复制$ kubectl get job
NAME COMPLETIONS DURATION AGE
myjob 0/1 0s 4s
可以看到,Job 对象还没有完成,COMPLETIONS
字段的值是 0/1。
我们可以使用以下命令来查看 Job 对象的详细信息::
代码语言:javascript复制$ kubectl describe job myjob
Name: myjob
Namespace: default
Selector: controller-uid=19e2915a-9065-4d71-8c22-3cb27d545267
Labels: controller-uid=19e2915a-9065-4d71-8c22-3cb27d545267
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Sat, 02 Apr 2022 17:30:17 0800
Pods Statuses: 0 Running / 0 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=19e2915a-9065-4d71-8c22-3cb27d545267
job-name=myjob
Containers:
myjob:
Image: ubuntu:latest
Port: <none>
Host Port: <none>
Command:
/bin/bash
-c
Args:
./job.sh
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m2s job-controller Created pod: myjob-x8spq
可以看到,Job 对象已经成功创建,它创建了一个 Pod,Pod 的名称是 myjob-x8spq
。可以使用以下命令查看 Pod 的详细信息:
$ kubectl describe pod myjob-x8spq
Name: myjob-x8spq
Namespace: default
Priority: 0
Node: minikube/192.168.49.2
Start Time: Sat, 02 Apr 2022 17:30:18 0800
Labels: controller-uid=19e2915a-9065-4d71-8c22-3cb27d545267
job-name=myjob
Annotations: <none>
Status: Succeeded
...
可以看到,Pod 的状态是 Succeeded
,任务已经完成。在 Pod 的日志中可以看到任务的输出:
$ kubectl logs myjob-x8spq
Start running the job...
The job is completed.
我们还可以通过以下命令删除 Job 对象:
代码语言:javascript复制$ kubectl delete job myjob
job.batch "myjob" deleted
以上就是一个简单的 Kubernetes Job 的示例,通过这个示例可以了解 Job 对象的基本用法,包括如何创建和删除 Job 对象,以及如何查询 Job 对象和任务的执行状态。
另外,Job 还有一些常用的参数和选项,可以根据具体的需求进行设置。下面是一些常用的选项:
backoffLimit
:表示任务失败后的重试次数,默认是 6,可以通过修改spec.backoffLimit
字段来修改重试次数。activeDeadlineSeconds
:表示任务的最长执行时间,超过这个时间会自动终止任务。completions
和parallelism
:这两个字段用来控制任务的并发执行数和完成次数,可以指定多个 Pod 并发执行同一个任务,也可以通过指定完成次数来限制任务的执行次数。template
:用来指定 Pod 的模板,包括容器镜像、命令、参数等。
下面是一个使用了一些常用选项的 Job 示例:
代码语言:javascript复制apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 2
parallelism: 2
backoffLimit: 3
activeDeadlineSeconds: 3600
template:
metadata:
name: myjob
spec:
containers:
- name: myjob
image: ubuntu:latest
command: ["/bin/bash"]
args: ["-c", "echo 'Hello Kubernetes' && sleep 10"]
restartPolicy: Never
这个示例中,completions
和 parallelism
分别设置为 2,表示任务需要执行 2 次才算完成,同时可以并发执行 2 个任务。backoffLimit
设置为 3,表示任务最多会重试 3 次。activeDeadlineSeconds
设置为 3600 秒,表示任务的最长执行时间为 1 小时。template
字段中定义了一个容器,容器的命令是 echo 'Hello Kubernetes' && sleep 10
,这个命令会输出一条信息并睡眠 10 秒钟。任务完成后,可以在 Pod 的日志中看到这个信息:
$ kubectl logs myjob-4s4td
Hello Kubernetes
可以使用以下命令查询任务的执行状态:
代码语言:javascript复制$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
myjob 2/2 21s 6m15s
可以看到,任务已经执行了 2 次,耗时 21 秒,完成时间为 6 分钟 15 秒。如果想要查询任务的详细信息,可以使用以下命令:
代码语言:javascript复制$ kubectl describe job myjob
Name: myjob
Namespace: default
Selector: controller-uid=3e3e0d0e-83c9-46d1-85df-1cced08e939e
Labels: controller-uid=3e3e0d0e-83c9-46d1-85df-1cced08e939e
Annotations: <none>
Parallelism: 2
Completions: 2
Start Time: Sat, 02 Apr 2022 18:10:36 0800
...
另外,如果想要终止任务的执行,可以使用以下命令:
代码语言:javascript复制$ kubectl delete job myjob
这个命令会删除 Job 对象,同时也会删除所有相关的 Pod。如果想要保留 Pod,可以使用以下命令:
代码语言:javascript复制$ kubectl delete job myjob --cascade=false
这个命令会删除 Job 对象,但是不会删除相关的 Pod,需要手动删除。
Job 对象还有一些高级用法,比如使用 CronJob 对象来定期执行 Job,使用 Init Containers 在任务执行前执行一些初始化操作,使用 ServiceAccount 为任务提供身份验证等。在实际应用中,可以根据具体的需求选择合适的选项和参数来配置 Job 对象。