kubernetes中的job

2023-04-03 08:03:01 浏览数 (1)

在 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 的详细信息:

代码语言:javascript复制
$ 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 的日志中可以看到任务的输出:

代码语言:javascript复制
$ 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:表示任务的最长执行时间,超过这个时间会自动终止任务。
  • completionsparallelism:这两个字段用来控制任务的并发执行数和完成次数,可以指定多个 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

这个示例中,completionsparallelism 分别设置为 2,表示任务需要执行 2 次才算完成,同时可以并发执行 2 个任务。backoffLimit 设置为 3,表示任务最多会重试 3 次。activeDeadlineSeconds 设置为 3600 秒,表示任务的最长执行时间为 1 小时。template 字段中定义了一个容器,容器的命令是 echo 'Hello Kubernetes' && sleep 10,这个命令会输出一条信息并睡眠 10 秒钟。任务完成后,可以在 Pod 的日志中看到这个信息:

代码语言:javascript复制
$ 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 对象。

0 人点赞