
本文章介绍Kubernetes 中的 Jobs、Init Containers 和 CronJobs
Jobs 资源创建一个或多个 Pod,并确保所有 Pod 都成功终止。
有两种类型的Jobs
Cron Jobs创建一个作业对象,它们对于创建定期和重复任务很有用,例如运行备份或发送电子邮件。
Init containers 是 Pod 中的常规容器,在 App 容器之前运行,它们还满足以下语句:
作业创建的 Pod 不会自动删除。保留 Pod 允许您查看已完成作业的日志,以检查潜在错误。如果要删除它们,则需要手动执行此操作。
yaml文件如下
apiVersion: batch/v1
kind: Job
metadata:
name: countdown
spec:
template:
spec:
containers:
- name: countdown
image: bash
command: ["/bin/sh", "-c"]
args:
- for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ; done &&
echo Perfect!
restartPolicy: OnFailure restartPolicy只能设置为onfailure或者never
注意:在某些情况下,您希望在多次重试后使作业失败。为此,请使用 spec.backoffLimit,它实际上被设置为 6。你可以使用 spec.activeDeadlineSeconds 来限制执行时间,以防你想管理特定任务的持续时间。如果执行达到此截止时间,则 Job 及其所有 Pod 都将终止。
部署
kubectl apply -f /manifests/job.yaml查看日志
kubectl logs `kubectl get pods -o 'jsonpath={.items[0].metadata.name}'`要创建并行作业,我们可以使用 spec.parallelism 来设置我们想要并行运行的 Pod 数量,并使用 spec.completions 来设置我们想要实现的作业完成数量。
apiVersion: batch/v1
kind: Job
metadata:
name: countdown
spec:
completions: 8
parallelism: 2
template:
spec:
containers:
- name: countdown
image: bash
command: ["/bin/sh", "-c"]
args:
- for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ; done &&
echo Perfect!
restartPolicy: OnFailure该作业将并行运行 2 个 pod,直到成功达到 8 个完成
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure创建 cron 作业后,LAST-SCHEDULE 列将立即没有值 (<none>)。这表明 CronJob 尚未运行。
一旦 LAST-SCHEDULE 列获得值,它表示 CronJob 现在已计划运行
kubectl get cronjob helloInit Container 是在应用程序容器启动之前执行的容器。Init-containers 通常用于部署实用程序或执行未在应用程序容器镜像中加载和执行的脚本。
如下yaml
apiVersion: v1
kind: Pod
metadata:
name: happypanda
spec:
containers:
- name: busybox
image: busybox:latest
command: ["/bin/sh", "-c"]
args: ["cat /opt/workdir/helloworld && sleep 3600"]
volumeMounts:
- name: workdir
mountPath: /opt/workdir
initContainers:
- name: init-container
image: busybox
command:
- sh
- -c
- 'echo "The app is running" > /opt/workdir/helloworld'
volumeMounts:
- mountPath: /opt/workdir
name: workdir
volumes:
- name: workdir此示例运行一个 init-container,该容器在卷中创建一个 helloworld 文件。如果 helloworld 文件存在于特定路径上并且 Pod 可以访问它,则将调度应用程序 Pod。
kubectl apply -f /manifests/init-container.yaml如果 Pod 正在运行,则表示该文件已成功创建,并且 Pod 可以读取它。我们将手动检查文件是否位于指定路径,并且它是否具有正确的内容:
kubectl exec -ti happypanda -- cat /opt/workdir/helloworld
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。