Kubernetes中Job与Deployment的区别有哪些?
1. Job与Deployment的Pod规范字段.spec.template是否存在差异?
二者的Pod模板核心配置没有强制区别,容器、存储、调度策略等通用字段都可以共用。唯一的硬性限制是Job的Pod模板不支持restartPolicy: Always,仅允许设置OnFailure或Never,符合一次性任务的运行逻辑;而Deployment为了保证服务常驻,通常会将restartPolicy设为默认值Always。
2. Job的completions字段与Deployment的replicas字段有什么区别?
两个字段的设计目标完全不同:
- Deployment的
replicas是期望长期常驻的可用Pod副本数,只要Deployment未被删除,控制器会始终维持replicas个存活的Pod对外提供服务,某个Pod异常退出后会立刻创建新的Pod补位。 - Job的
completions是期望成功执行完成的Pod实例数,只要累计有completions个Pod以0退出码正常结束,Job就算执行完成,不会再创建新的Pod。如果配置了并行任务参数parallelism,还可以控制同一时间运行的Pod数量,和Deployment的常驻副本逻辑完全无关。
3. 两种资源对应的Pod生命周期有何不同?
核心差异在于Pod退出后的处理逻辑:
- Deployment场景下,容器执行完成退出属于异常状态:控制器会按照重启策略反复重启Pod,多次重启失败后会触发
CrashLoopBackOff机制,持续尝试重建Pod,始终试图让Pod保持运行状态,直到Deployment被手动删除。 - Job场景下,容器执行完成退出属于预期状态:如果退出码为0,该Pod会被标记为成功,Job累计成功数直到达到
completions阈值就结束运行;如果退出码非0,会按照重启策略判断是在当前Pod内重启容器,还是销毁当前Pod创建新实例重试。所有任务完成后不会再产生新的Pod,已结束的Pod会默认保留在集群中方便排查日志,直到被手动删除或自动清理策略回收。
内容的提问来源于stack exchange,提问作者Mukund Jalan
相关产品推荐
相关产品推荐

