使用 K8s 进行作业调度实战分享( 二 )


1)Job Template Expansion 模式
根据 ZDTP Worker 运行方式 , 我们可以使用一个 Job 对像对应一个 Worker , 有多少个 worker 就创建多少个 Job , 除非 Pod 异常 , 才会重启该 Pod , 正常执行完后 Job 就退出 , 如下图表示:

使用 K8s 进行作业调度实战分享

文章插图
 
2)Queue with Pod Per Work Item 模式
这种模式将客户端生成的 worker 存放在一个队列中 , 然后只会创建一个 job 去消费队列中的 worker item , 通过设置 parallelism 参数可以同时启动多少个 worker Pod 同时处理 worker , 值得一体的是 , 这种模式下的 Worker 处理程序逻辑只会从队列拉取 worker 处理 , 处理完就立即退出 , completions 参数用于控制正常退出的 Pod 数量 , 当退出的 Pod 数量达到了 completions 后 , Job 结束 , 即 completions 参数可以控制 Job 的处理 Worker 的数量 。如下图所示:
使用 K8s 进行作业调度实战分享

文章插图
 
3)Queue with Variable Pod Count 模式
这种调度模式看起来跟 Queue with Pod Per Work Item 模式差不多 , 其实不然 , Queue with Variable Pod Count 模式的 Job 只要有一个 Pod 正常退出 , 即说明 Job 已经处理完数据 , 处于终止状态了 , 因为它的每个 Pod 都有查询队列是否还有 worker 的逻辑 , 一旦发现队列中没有了 worker , Pod 正常退出 , 因此 Queue with Variable Pod Count 模式 completions 参数只能设置 1 ,  parallelism 参数可以同时启动多少个 worker Pod 同时处理 worker 。
这种模式也要求队列能够让 Pod 感知是否还存在 worker , 像 RocketMQ/Kafka 之类的消息中间件并不能做到 , 只会让客户端一直等待 , 因此这种模式不能选用 RocketMQ/Kafka , 可以选择数据库或者 redis 来实现 。如下图所示:
使用 K8s 进行作业调度实战分享

文章插图
 
当然如果后面还有定时执行 Worker 的需求 , 使用 K8s 的 cronjob(定时任务调度)是一个非常好的选择 。
3、Pod(默认调度)
直接通过 kind=pod 的方式启动容器 , 这种方式不能设置容器的运行实例数 , 即 replicas = 1 , 通常生产应用集群都不会通过这个方式启动容器 , 因为这种方式启动容器不具备 Pod 自动扩缩容的特性 。
值得一提的是 , 即使你的 Pod 副本只有 1 个 , 官方也推荐使用 Replica Set 的方式进行部署 。
Pod 重启策略分析Pod 的重启策略包括 Always、onFailure、Never:
  • Always:当容器失效时 , k8s 自动重启该容器;
  • onFailure:当容器终止运行时并且退出码不为 0 时 , k8s 自动重启该容器;
  • Never:不论容器运行状态如何 , k8s 都不会重启该容器
Deployment/Replica Set 必须设置为 Always(因为它们都需要保持 Pod 期待的副本数) , 而 Job 只能设置为 onFailure 和 Never , 以确保容器执行完成后不再重启 , 直接 Pod 启动容器以上三个重启策略都可以设置 。
【使用 K8s 进行作业调度实战分享】这里需要说明一点 , 如果使用 Job , 情况可能稍微复杂些:
1)Pod 重启策略 RestartPolicy=Never
假设 Job 调度过程中 Pod 发生非正常退出 , 尽管此时容器不再重启 , 由于 Job 需要至少一个 Pod 执行完成(即 completions 最少等于 1) , Job 才算完成 。因此 , 虽然非正常退出的 Pod 不再重启 , 但 Job 会尝试重新启动一个 Pod 执行 , 直到 Pod 正常完成的数量为 completions 。
$ kubectl get pod --namespace zdtp-namespaceNAME                   READY   STATUS               RESTARTS   AGEzdtp-worker-hc6ld      0/1     ContainerCannotRun   0          64szdtp-worker-hfblk      0/1     ContainerCannotRun   0          60szdtp-worker-t9f6v      0/1     ContainerCreating    0          11szdtp-worker-v2g7s      0/1     ContainerCannotRun   0          31s


推荐阅读