关于云计算:KubernetesK8s之Job控制器

33次阅读

共计 4109 个字符,预计需要花费 11 分钟才能阅读完成。

Job 控制器介绍

Job 控制器用于 Pod 对象运行一次性工作,容器中的过程在失常运行完结后不会对其进行重启,而是将 Pod 对象置于 ”Completed”(实现)状态,若容器中的过程因谬误而终止,则须要依照重启策略配置确定是否重启,未运行实现的 Pod 对象因其所在的节点故障而意外终止后会被调度。
Job 控制器的 Pod 对象的状态转换如下图所示:

Job 控制器运行模式

有的作业可能须要运行不止一次,用户能够配置它们以串行或者并行的形式运行。

  • 单工作队列(work queue):串行式 Job,N 个作业须要串行运行 N 次,直至满足冀望的次数。如下图所示,这次 Job 也能够了解为并行度为 1 的作业执行形式,在某个时刻仅存在一个 Pod 资源对象。
  • 多工作队列:并行式 Job,这种形式能够设置工作队列数量,即为一次能够执行多个工作队列,每个队列负责一个运行作业,如下图所示,有五个作业,咱们就启动五个工作队列去并行执行,当然五个作业,咱们也能够只启动两个工作队列去串行执行,两个队列每次各执行一个作业,则一个队列须要执行三次,另一个执行两次。

创立 Job 对象

Job 控制器的 spec 字段内嵌的必要字段只有template,不须要定义标签选择器,控制器会主动关联,除了这一点与 Deployment 控制器不同,其它别无二致。

1. 创立 Job 控制器配置清单
应用 busybox 镜像,而后沉睡 120s,实现后即失常退出容器

cat busybox-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
spec:
  template:
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        command: ["/bin/sh", "-c", "sleep 120s"]
      restartPolicy: Never

Pod 模版中的 spec.restartPolicy 默认为 ”Always”,这对 Job 控制器来说十分不实用,”Never” 和 ”OnFeailure” 才比拟适合 Job 控制器

2. 创立 Job 控制器

kubectl apply -f busybox-job.yaml

3. 查看 Job 控制器及 Pod 状态

kubectl get job -o wide
NAME          COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES           SELECTOR
busybox-job   0/1           36s        36s   busybox      busybox:latest   controller-uid=8e85200f-43eb-4f24-ab6d-64c545287d51

kubectl get pods -o wide | grep busybox
busybox-job-wtdvf                                1/1     Running   0          45s    10.244.3.150   k8s-node01   <none>           <none>

120s 后,Job 控制器创立的 Pod 对象实现了工作

kubectl get pods -o wide | grep busybox
busybox-job-wtdvf                                0/1     Completed   0          3m38s   10.244.3.150   k8s-node01   <none>           <none>

查看 Job 控制器的详细信息
如下 SelectorLables都是 Job 控制器主动生成后主动关联,控制器主动生成的 controller-uid- 随机字符串,控制器携带了前面的字符串是为了避免所治理的 Pod 产生重合。
上面能够看到 Job 运行胜利后及实现了操作并没有过程重启,这得助于咱们设置的restartPolicy

串行式 Job

将并行度属性 job.spec.parallelism 的值设置为 1,并设置总任务数 job.spec.completions 属性便可能让 Job 控制器以串行形式运行多任务,上面是一个须要串行 5 此工作的 Job 控制器示例:

cat busybox-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
spec:
  parallelism: 1
  completions: 5
  template:
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        command: ["/bin/sh", "-c", "sleep 20s"]
      restartPolicy: OnFailure

创立 Job 控制器

kubectl apply -f busybox-job.yaml

动静监控 Pod 对象作业的变动

kubectl get pods -l job-name=busybox-job --watch

NAME                READY   STATUS    RESTARTS   AGE
busybox-job-q8wqr   0/1     Pending   0          0s
busybox-job-q8wqr   0/1     Pending   0          0s
busybox-job-q8wqr   0/1     ContainerCreating   0          0s
busybox-job-q8wqr   1/1     Running             0          20s
busybox-job-q8wqr   0/1     Completed           0          39s
busybox-job-lppcw   0/1     Pending             0          0s
busybox-job-lppcw   0/1     Pending             0          0s
busybox-job-lppcw   0/1     ContainerCreating   0          0s
busybox-job-lppcw   1/1     Running             0          19s
busybox-job-lppcw   0/1     Completed           0          39s
busybox-job-8jw2q   0/1     Pending             0          0s
busybox-job-8jw2q   0/1     Pending             0          0s
busybox-job-8jw2q   0/1     ContainerCreating   0          0s
busybox-job-8jw2q   1/1     Running             0          19s
busybox-job-8jw2q   0/1     Completed           0          40s
busybox-job-bcxpn   0/1     Pending             0          0s
busybox-job-bcxpn   0/1     Pending             0          0s
busybox-job-bcxpn   0/1     ContainerCreating   0          0s
busybox-job-bcxpn   1/1     Running             0          18s
busybox-job-bcxpn   0/1     Completed           0          38s
busybox-job-5t7xm   0/1     Pending             0          0s
busybox-job-5t7xm   0/1     Pending             0          0s
busybox-job-5t7xm   0/1     ContainerCreating   0          0s
busybox-job-5t7xm   1/1     Running             0          20s
busybox-job-5t7xm   0/1     Completed           0          41s

如上,Job 控制器须要执行五次工作,每次一个 Pod 执行一个工作,顺次执行,执行胜利后的 Pod 即为实现状态

kubectl get pods -l job-name=busybox-job
NAME                READY   STATUS      RESTARTS   AGE
busybox-job-5t7xm   0/1     Completed   0          4m22s
busybox-job-8jw2q   0/1     Completed   0          5m40s
busybox-job-bcxpn   0/1     Completed   0          5m
busybox-job-lppcw   0/1     Completed   0          6m19s
busybox-job-q8wqr   0/1     Completed   0          6m58s

并行式 Job

并行式 Job 咱们只须要批改 job.spec.parallelism 属性与 job.spec.completions 属性即可;
job.spec.parallelism属性示意了每次启动多少队列执行作业 (即为 Pod 数量)
job.spec.completions 属性示意了作业的总数量

如下示例一个 5 个作业,同时启动 5 个队列进行作业。

cat busybox-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
spec:
  parallelism: 5
  completions: 5
  template:
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        command: ["/bin/sh", "-c", "sleep 20s"]
      restartPolicy: OnFailure
kubectl apply -f busybox-job.yaml

查看 Job 控制器运行状态,如下 Job 控制器中的 Pod 对象创立工夫是统一的。

删除 Job

Job 控制器中的 Pod 运行实现后,将不再占用系统资源,用户能够依照需要保留或应用资源删除命令将 Pod 删除,不过如果某控制器的容器利用总是无奈失常完结运行,而其 restartPolicy 又设置为了重启,则它可能会始终处于不停地重启和谬误的循环当中。所幸的是,Job 控制器提供了两个属性用于克制这种状况的产生,具体如下:

  • backoffLimit:将作业标记为失败状态之前的重试次数,默认值为 6
  • activeDeadlineSeconds:Job 的 deadline,用于为其指定最大流动工夫长度,超出此时长的作业将被终止。

例如,上面的配置清单为,示意其失败重试次数为 5 此,并且如果超出 100 秒的工夫依然未运行实现,那么则将其终止:

cat busybox-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
spec:
  backoffLimit: 5
  activeDeadlineSeconds: 100
  parallelism: 1
  completions: 5
  template:
    spec:
      containers:
      - name: busybox
        image: busybox:latest
        command: ["/bin/sh", "-c", "sleep 30s"]
      restartPolicy: OnFailure

阿里云 K8s 实战手册 K8s
阿里云 CDN 排坑指南 CDN
ECS 运维指南 ECS
DevOps 实际手册 DevOps
Hadoop 大数据实战手册 Hadoop

正文完
 0