Kubernetes jobs 次要是针对短时和批量的工作负载。它是为了完结而运行的,而不是像 deployment、replicasets、replication controllers 和 DaemonSets 等其余对象那样继续运行。
本文将介绍如何创立 Kubernetes jobs 和 cronjobs,以及一些小技巧。
Kubernetes Jobs 会始终运行到 Job 中指定的工作实现。也就是说,如果 pods 给出退出代码 0,那么 Job 就会退出。而在失常的 Kubernetes 中,无论退出代码是什么,deployment 对象在终止或呈现谬误时都会创立新的 pod,以放弃 deployment 的现实状态。
在 job 运行过程中,如果托管 pod 的节点产生故障,Job pod 将被主动重新安排到另一个节点。
Kubernetes Jobs 用例
对于 Kubernetes Jobs 最好的用例实际是:
- 批处理工作:比如说你想每天运行一次批处理工作,或者在指定日程中运行。它可能是像从存储库或数据库中读取文件那样,将它们调配给一个服务来解决文件。
- 运维 /ad-hoc 工作:比方你想要运行一个脚本 / 代码,该脚本 / 代码会运行一个数据库清理流动,甚至备份一个 Kubernetes 集群。
如何创立 Kubernetes Job
在本例中,咱们将应用 Ubuntu 容器来运行一个带有 for 循环的 shell 脚本,并依据你传递给容器的参数来响应音讯。这个参数是一个数字,决定 shell 脚本循环应该运行多少次。
例如,如果你传递了参数 100,那么 shell 脚本将响应音讯 100 次而后容器将会退出。
你能够拜访以下链接查看 Dockerfile 和 shell 脚本:
https://github.com/devopscube…
咱们先从一个简略设置的 job 开始。
Step1:应用自定义的 Docker 镜像创立一个 job.yaml 文件,命令参数为 100。100 将会作为参数传递给 docker ENTRYPOINT 脚本。
apiVersion: batch/v1 kind: Job metadata: name: kubernetes-job-example labels:
jobgroup: jobexample spec: template:
metadata:
name: kubejob
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
restartPolicy: OnFailure
Step2:应用 kubectl 创立一个 job.yaml 文件的 job
kubectl apply -f job.yam
Step3:应用 kubectl 查看 job 的状态
kubectl get jobs
Step4:应用 kubectl 获取 pod 列表
kubectl get po
Step5:应用 kubectl 获取 job pod 日志。应用你在输入中看到的 Pod 名称替换本来的 Pod 名称。
kubectl logs kubernetes-job-example-bc7s9 -f
并行运行多 Job pods
当一个 job 被部署后,你能够让它在多个 Pod 上并行运行。例如,在一个 job 中如果你想要运行 6 个 pods,同时并行运行 2 个 pods,你须要增加以下 2 个参数到你的 job manifets 中:
completions: 6
parallelism: 2
以下是带有那些参数的 manifest:
apiVersion: batch/v1
kind: Job
metadata:
name: kubernetes-parallel-job
labels:
jobgroup: jobexample
spec:
completions: 5
parallelism: 2
template:
metadata:
name: kubernetes-parallel-job
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
restartPolicy: OnFailure
为 Kubernetes Job 生成随机名称
你不能从一个 job manifest 文件中创立多个 job,因为 Kubernetes 会报错,说存在一个同名的 job。为了躲避这个问题,你能够在元数据中增加 generateName 名称参数。
例如:
apiVersion: batch/v1
kind: Job
metadata:
generateName: kube-job-
labels:
jobgroup: jobexample
在上方示例中,每次你运行该 manifest,job 将以 kube-job- 作为前缀,前面跟着一个随机字符串来创立。
如何创立 Kubernetes CronJob
如果你想依照特定的时间表运行批处理 job,例如,每 2 个小时运行一次。你能够用 cron 表达式创立一个Kubernetes cronjob。Job 会依照你在 job 中提到的时间表主动启动。
上面咱们将介绍如何指定一个 cron 打算,你能够应用 crontab 生成器(https://crontab-generator.org/)来生成本人的工夫打算。
schedule: "0,15,30,45 * * * *"
下图显示了 Kubernetes cronjob schedule 语法。
如果咱们以 cronjob 的模式每 15 分钟运行一次咱们之前的 job,manifest 应该如下所示。创立一个名为 cron-job.yaml 的文件,并复制以下 manifest:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: kubernetes-cron-job
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: cron-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: kube-cron-job
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
让咱们应用 kubectl 部署 cronjob。kubectl create -f cron-job.yaml
列出 cronjobs:
kubectl get cronjobs
你能够列出 cronjob pod 并从处于运行状态或实现状态的 pods 中获取日志来查看 Cronjob 日志。
手动运行 Kubernetes CronJob
在某些状况下,你可能心愿以长期的形式执行 cronjob。你能够通过从现有的 cronjob 创立一个 job 来实现。
例如,如果你想手动触发一个 cronjob,咱们应该这样做:
kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
–from=cronjob/kubernetes-cron-job将复制 cronjob 模板并创立一个名为 manual-cron-job 的 job。
Kubernetes Job 的要害参数
依据你的需要,你还能够应用 kubernetes jobs/cronjobs 的几个要害参数:
- failedJobHistoryLimit &
successfulJobsHistoryLimit:依据你提供的保留数量删除失败和胜利的 job 历史记录。当你尝试列出 job 时,这对于缩小所有失败的条目十分有用。例如: - backoffLimit:如果你的 Pod 失败,重试的总次数。
- activeDeadlineSeconds:如果你想对 cronjob 的运行工夫进行硬性限度,能够应用此参数。例如,如果你想只运行 1 分钟的 cronjob,你能够将其设置为 60。
通过本文咱们理解了创立 Job 以及 Cron Job 的步骤并且一些具体的配置过程和要害参数,心愿藉由本文能够帮忙你开始上手理解 K8S Job 和 Cron Job,轻松搞定批处理工作!
原文链接:
https://devopscube.com/create…