Files
notes_estom/kubenets/04-7.job.md
yinkanglong 7bf7c05181 k8s
2023-09-09 12:29:47 +08:00

7.9 KiB
Raw Blame History

简介

作用

Kubernetes jobs主要是针对短时和批量的工作负载。它是为了结束而运行的而不是像deployment、replicasets、replication controllers和DaemonSets等其他对象那样持续运行。

场景

1.批处理任务: 比如说你想每天运行一次批处理任务,或者在指定日程中运行。它可能是像从存储库或数据库中读取文件那样,将它们分配给一个服务来处理文件。

2.运维/ad-hoc任务 比如你想要运行一个脚本/代码,该脚本/代码会运行一个数据库清理活动甚至备份一个Kubernetes集群。

原理

当Job创建的pod执行成功结束时Job将记录成功结束的pod数量。当成功结束的pod达到指定的数量时Job将完成执行

示例

基本示例

  • .spec.completions完成该Job需要执行成功的Pod数
  • .spec.parallelism能够同时运行的Pod数
  • .spec.backoffLimit允许执行失败的Pod数默认值是60表示不允许Pod执行失败。如果Pod是restartPolicy为Nerver则失败后会创建新的Pod如果是OnFailed则会重启Pod不管是哪种情况只要Pod失败一次就计算一次而不是等整个Pod失败后再计算一个。当失败的次数达到该限制时整个Job随即结束所有正在运行中的Pod都会被删除
  • .spec.activeDeadlineSeconds: Job的超时时间一旦一个Job运行的时间超出该限制则Job失败所有运行中的Pod会被结束并删除。该配置指定的值必须是个正整数。不指定则不会超时
apiVersion: batch/v1 # 版本号
kind: Job # 类型       
metadata: # 元数据
  name: # rs名称 
  namespace: # 所属命名空间 
  labels: #标签
    controller: job
spec: # 详情描述
  completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
  parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
  activeDeadlineSeconds: 30 # 指定job可运行的时间期限超过时间还未结束系统将会尝试进行终止。
  backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
  manualSelector: true # 是否可以使用selector选择器选择pod默认是false
  selector: # 选择器通过它指定该控制器管理哪些pod
    matchLabels:      # Labels匹配规则
      app: counter-pod
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [counter-pod]}
  template: # 模板当副本数量不足时会根据下面的模板创建pod副本
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]

关于重启策略设置的说明:

  • 如果指定为OnFailure则job会在pod出现故障时重启容器而不是创建podfailed次数不变
  • 如果指定为Never则job会在pod出现故障时创建新的pod并且故障pod不会消失也不会重启failed次数加1
  • 如果指定为Always的话就意味着一直重启意味着job任务会重复去执行了当然不对所以不能设置为Always

实例1

创建pc-job.yaml内容如下

apiVersion: batch/v1
kind: Job      
metadata:
  name: pc-job
  namespace: dev
spec:
  manualSelector: true
  selector:
    matchLabels:
      app: counter-pod
  template:
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

效果:

# 创建job
[root@k8s-master ~]# kubectl apply -f pc-job.yaml
job.batch/pc-job created
 
# 查看job 可以发现 COMPLETIONS 完成状态 刚才是 0/1 总共1个任务0个未完成稍后会打印出1/1代表任务结束
[root@k8s-master ~]# kubectl get job -owide -n dev -w
NAME     COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES         SELECTOR
pc-job   0/1           28s        28s   counter      busybox:1.30   app=counter-pod
pc-job   0/1           47s        47s   counter      busybox:1.30   app=counter-pod
pc-job   0/1           48s        48s   counter      busybox:1.30   app=counter-pod
pc-job   1/1           48s        48s   counter      busybox:1.30   app=counter-pod
 
# 查看pod 状态 STATUS=Completed完成, READY=0/1 意思是总共1个pod有0个准备好了因为任务已经完成所以READY的变成0
[root@k8s-master ~]# kubectl get pods -n dev -w
NAME           READY   STATUS      RESTARTS   AGE
pc-job-9rd6l   0/1     Completed   0          2m3s
 
# 删除job
[root@k8s-master ~]# kubectl delete -f pc-job.yaml
job.batch "pc-job" deleted

实例2

接下来调整下pod运行的总数量和并行数量 即在spec下设置下面两个选项

completions: 6 # 指定job需要成功运行Pods的次数为6
parallelism: 3 # 指定job并发运行Pods的数量为3

调整后yaml

apiVersion: batch/v1
kind: Job      
metadata:
  name: pc-job
  namespace: dev
spec:
  completions: 6 # 指定job需要成功运行Pods的次数为6
  parallelism: 3 # 指定job并发运行Pods的数量为3
  manualSelector: true
  selector:
    matchLabels:
      app: counter-pod
  template:
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox:1.30
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 3;done"]

效果:

然后重新运行job观察效果此时会发现job会每次运行3个pod总共执行了6个pod

[root@k8s-master ~]# kubectl get pod -n dev -w
NAME           READY   STATUS    RESTARTS   AGE
pc-job-g26wm   1/1     Running   0          7s
pc-job-ggccq   1/1     Running   0          7s
pc-job-znz9q   1/1     Running   0          7s
pc-job-znz9q   0/1     Completed   0          30s
pc-job-g26wm   0/1     Completed   0          30s
pc-job-ggccq   0/1     Completed   0          30s
pc-job-g26wm   0/1     Completed   0          31s
pc-job-znz9q   0/1     Completed   0          31s
pc-job-ggccq   0/1     Completed   0          31s
pc-job-g26wm   0/1     Completed   0          32s
pc-job-znz9q   0/1     Completed   0          32s
pc-job-ggccq   0/1     Completed   0          32s
pc-job-dmn7x   0/1     Pending     0          0s
pc-job-wfgtr   0/1     Pending     0          0s
pc-job-dmn7x   0/1     Pending     0          0s
pc-job-cnz45   0/1     Pending     0          0s
pc-job-wfgtr   0/1     Pending     0          0s
pc-job-cnz45   0/1     Pending     0          0s
pc-job-dmn7x   0/1     ContainerCreating   0          0s
pc-job-znz9q   0/1     Completed           0          32s
pc-job-ggccq   0/1     Completed           0          32s
pc-job-g26wm   0/1     Completed           0          32s
pc-job-wfgtr   0/1     ContainerCreating   0          0s
pc-job-cnz45   0/1     ContainerCreating   0          1s
pc-job-cnz45   0/1     ContainerCreating   0          1s
pc-job-wfgtr   0/1     ContainerCreating   0          1s
pc-job-dmn7x   0/1     ContainerCreating   0          2s
pc-job-wfgtr   1/1     Running             0          2s
pc-job-cnz45   1/1     Running             0          2s
pc-job-dmn7x   1/1     Running             0          3s
pc-job-cnz45   0/1     Completed           0          28s
pc-job-dmn7x   0/1     Completed           0          29s
pc-job-wfgtr   0/1     Completed           0          29s
pc-job-cnz45   0/1     Completed           0          29s
pc-job-cnz45   0/1     Completed           0          30s
pc-job-dmn7x   0/1     Completed           0          30s
pc-job-wfgtr   0/1     Completed           0          30s
pc-job-cnz45   0/1     Completed           0          31s
pc-job-dmn7x   0/1     Completed           0          31s
pc-job-wfgtr   0/1     Completed           0          31s
pc-job-dmn7x   0/1     Completed           0          32s