k8s工作负载-Job和CronJob

发布时间:2026/7/10 0:06:11

k8s工作负载-Job和CronJob 一、Job控制器Job主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束任务。Job特点当Job创建的pod执行成功结束时Job将记录成功结束的pod数量当成功结束的pod达到指定的数量时Job将完成执行Job的资源清单文件apiVersion: batch/v1 # 版本号 kind: Job # 类型 metadata: # 元数据 name: # job名称 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案例创建pc-job.yaml内容如下apiVersion: batch/v1 kind: Job metadata: name: pc-job namespace: test 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/home/1.txt;sleep 3;done]创建job# 创建job [rootmaster ~]# kubectl create -f pc-job.yaml job.batch/pc-job created # 查看job [rootmaster ~]# kubectl get job -n test -o wide -w NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR pc-job 0/1 21s 21s counter busybox:1.30 appcounter-pod pc-job 1/1 31s 79s counter busybox:1.30 appcounter-pod ​ # 通过观察pod状态可以看到pod在运行完毕任务后就会变成Completed状态 [rootmaster ~]# kubectl get pods -n test -w NAME READY STATUS RESTARTS AGE pc-job-rxg96 1/1 Running 0 29s pc-job-rxg96 0/1 Completed 0 33s ​ # 可以进入pod中查看相关运行状态 kubectl exec pc-job-rxg96 -n test -it -c counter /bin/sh调整job# 接下来调整下pod运行的总数量和并行数量 即在spec下设置下面两个选项 # completions: 6 # 指定job需要成功运行Pods的次数为6 # parallelism: 3 # 指定job并发运行Pods的数量为3 # 然后重新运行job观察效果此时会发现job会每次运行3个pod总共执行了6个pod [rootmaster ~]# kubectl get pods -n test -w NAME READY STATUS RESTARTS AGE pc-job-684ft 1/1 Running 0 5s pc-job-jhj49 1/1 Running 0 5s pc-job-pfcvh 1/1 Running 0 5s pc-job-684ft 0/1 Completed 0 11s pc-job-v7rhr 0/1 Pending 0 0s pc-job-v7rhr 0/1 Pending 0 0s pc-job-v7rhr 0/1 ContainerCreating 0 0s pc-job-jhj49 0/1 Completed 0 11s pc-job-fhwf7 0/1 Pending 0 0s pc-job-fhwf7 0/1 Pending 0 0s pc-job-pfcvh 0/1 Completed 0 11s pc-job-5vg2j 0/1 Pending 0 0s pc-job-fhwf7 0/1 ContainerCreating 0 0s pc-job-5vg2j 0/1 Pending 0 0s pc-job-5vg2j 0/1 ContainerCreating 0 0s pc-job-fhwf7 1/1 Running 0 2s pc-job-v7rhr 1/1 Running 0 2s pc-job-5vg2j 1/1 Running 0 3s pc-job-fhwf7 0/1 Completed 0 12s pc-job-v7rhr 0/1 Completed 0 12s pc-job-5vg2j 0/1 Completed 0 12s删除job# 删除job [rootmaster ~]# kubectl delete -f pc-job.yaml job.batch pc-job deleted二、CronJob控制器CronJob控制器以Job控制器资源为其管控对象并借助它管理pod资源对象Job控制器定义的作业任务在其控制器资源创建之后便会立即执行但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说CronJob可以在特定的时间点(反复的)去运行job任务CronJob的资源清单文件apiVersion: batch/v1beta1 # 版本号 kind: CronJob # 类型 metadata: # 元数据 name: # cj名称 namespace: # 所属命名空间 labels: #标签 controller: cronjob spec: # 详情描述 schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行 concurrencyPolicy: # 并发执行策略用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业 failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数默认为1 successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数默认为3 startingDeadlineSeconds: # 启动作业错误的超时时长 jobTemplate: # job控制器模板用于为cronjob控制器生成job对象;下面其实就是job的定义 metadata: spec: completions: 1 parallelism: 1 activeDeadlineSeconds: 30 backoffLimit: 6 manualSelector: true selector: matchLabels: app: counter-pod matchExpressions: 规则 - { key: app, operator: In, values: [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 20;done]需要重点解释的几个选项schedule: cron表达式用于指定任务的执行时间* * * * *分钟 小时 日 月份 星期分钟 值从 0 到 59.小时 值从 0 到 23.日 值从 1 到 31.月 值从 1 到 12.星期 值从 0 到 6, 0 代表星期日多个时间可以用逗号隔开 范围可以用连字符给出*可以作为通配符 /表示每...*/1 * * * *表示​每分钟运行一次concurrencyPolicy:Allow: 允许Jobs并发运行(默认)Forbid: 禁止并发运行如果上一次运行尚未完成则跳过下一次运行Replace: 替换取消当前正在运行的作业并用新作业替换它案例创建pc-cronjob.yaml内容如下apiVersion: batch/v1beta1 kind: CronJob metadata: name: pc-cronjob namespace: test labels: controller: cronjob spec: schedule: */1 * * * * jobTemplate: metadata: spec: template: 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]创建CronJob# 创建cronjob [rootmaster ~]# kubectl create -f pc-cronjob.yaml cronjob.batch/pc-cronjob created # 查看cronjob [rootmaster ~]# kubectl get cronjobs -n test NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE pc-cronjob */1 * * * * False 0 none 6s # 查看job [rootmaster ~]# kubectl get jobs -n test NAME COMPLETIONS DURATION AGE pc-cronjob-1592587800 1/1 28s 3m26s pc-cronjob-1592587860 1/1 28s 2m26s pc-cronjob-1592587920 1/1 28s 86s # 查看pod [rootmaster ~]# kubectl get pods -n test pc-cronjob-1592587800-x4tsm 0/1 Completed 0 2m24s pc-cronjob-1592587860-r5gv4 0/1 Completed 0 84s pc-cronjob-1592587920-9dxxq 1/1 Running 0 24s删除CronJob# 删除cronjob [rootmaster ~]# kubectl delete -f pc-cronjob.yaml cronjob.batch pc-cronjob deleted

相关新闻