【K8S】基于Job实现一次性任务

容器按照持续运行的时间可分为两类:服务类容器工作类容器

  • 服务类容器:通常持续提供服务,需要一直运行,比如 http server,daemon 等。Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器。
  • 工作类容器:一次性任务,比如批处理程序,完成后容器就退出。对于工作类容器,我们用 Job 来实现。

在Kubernetes(K8S)中,要让Pod运行一次并完成一次性任务,可以使用Job资源。Job是Kubernetes中用于运行一次性任务的工作负载API对象。它创建一个或多个Pod,并确保指定数量的Pod成功终止。当Pod成功完成后,Job将跟踪成功完成的情况。当达到指定的成功完成次数时,任务(即Job)就完成了。

以下是如何使用Job来运行一次性任务的步骤:

1. 创建Job资源配置文件

创建一个YAML文件(例如job.yaml),其中包含Job的配置信息。指定apiVersion为batch/v1kind为Job,并定义Job的元数据(metadata)和规格(spec)。

python 复制代码
	apiVersion: batch/v1
	kind: Job
	metadata:
	  name: my-one-time-job
	spec:
	  completions: 1 # 指定需要成功完成的任务数量,默认为1
	  parallelism: 1 # 指定并发运行的任务数量,默认也为1,即一次仅运行一个Pod
	  backoffLimit: 4 # 在Pod重试失败后放弃任务前的最大重试次数,默认为6
	  template:
	    spec:
	      restartPolicy: OnFailure # 对于一次性任务,推荐设置为OnFailure,这样只有任务失败时才会重试
	      containers:
	      - name: my-container
	        image: my-image:latest
	        command: ["./run-my-task.sh"] # 执行脚本或命令,这里假设有一个运行一次性任务的脚本

注意:

  • batch/v1 是当前 Job 的 apiVersion
  • 指明当前资源的类型为 Job
  • restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure。对于其他 controller(比如 Deployment)可以设置为 Always 。

2. 应用Job资源配置

来创建Job:

python 复制代码
kubectl apply -f job.yaml

这将创建一个Job资源,Kubernetes将启动一个或多个Pod来执行该Job。

3. 检查Job状态:、

查看Job的状态:

python 复制代码
kubectl get jobs

当Job成功完成时,你将看到类似于COMPLETIONSSUCCESSFUL都为1的状态。

4. 清理

一旦Job成功完成,你可以选择删除Job资源以清理它:

python 复制代码
kubectl delete job my-once-off-job

如果你不希望手动删除Job,也可以设置TTL(Time-To-Live)策略,让Job在一定时间后自动删除。

5. 总结

综上所述,一旦Job创建成功,Kubernetes会根据parallelismcompletions设置创建并运行Pod。当Pod完成任务并退出(正常退出码0)时,Job会被视为已完成。

如果Pod因为某种原因未能成功完成任务(非零退出码),Job控制器将会根据backoffLimit设置重试Pod,直到达到最大重试次数或者任务成功完成。若只需要运行单个Pod完成一次性任务,以上配置即可满足需求。如果需要并行运行多个Pod来加速任务执行,只需适当调整parallelism值即可。

相关推荐
福大大架构师每日一题1 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
weixin_453965002 小时前
[单master节点k8s部署]30.ceph分布式存储(一)
分布式·ceph·kubernetes
weixin_453965002 小时前
[单master节点k8s部署]32.ceph分布式存储(三)
分布式·ceph·kubernetes
tangdou3690986552 小时前
1分钟搞懂K8S中的NodeSelector
云原生·容器·kubernetes
Lansonli3 小时前
云原生(四十一) | 阿里云ECS服务器介绍
服务器·阿里云·云原生
Dylanioucn5 小时前
【分布式微服务云原生】掌握分布式缓存:Redis与Memcached的深入解析与实战指南
分布式·缓存·云原生
tangdou3690986555 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
later_rql5 小时前
k8s-集群部署1
云原生·容器·kubernetes
weixin_453965008 小时前
[单master节点k8s部署]31.ceph分布式存储(二)
分布式·ceph·kubernetes