前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes中的job

kubernetes中的job

原创
作者头像
堕落飞鸟
发布2023-04-03 08:03:01
5660
发布2023-04-03 08:03:01
举报
文章被收录于专栏:飞鸟的专栏

在 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 对象。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档