BroadcastJob

这个控制器将 Pod 分发到集群中每个 node 上,类似于 DaemonSet, 但是 BroadcastJob 管理的 Pod 并不是长期运行的 daemon 服务,而是类似于 Job 的任务类型 Pod。

最终在每个 node 上的 Pod 都执行完成退出后,BroadcastJob 和这些 Pod 并不会占用集群资源。 这个控制器非常有利于做升级基础软件、巡检等过一段时间需要在整个集群中跑一次的工作。

此外,BroadcastJob 还可以维持每个 node 跑成功一个 Pod 任务。如果采取这种模式,当后续集群中新增 node 时 BroadcastJob 也会分发 Pod 任务上去执行。

Spec 定义

Template

Template 描述了 Pod 模板,用于创建任务 Pod。 注意,由于是任务类型的 Pod,其中的 restart policy 只能设置为 NeverOnFailure,不允许设为 Always

Parallelism

Parallelism 指定了最多能允许多少个 Pod 同时在执行任务,默认不做限制。

比如,一个集群里有 10 个 node、并设置了 Parallelism 为 3,那么 BroadcastJob 会保证同时只会有 3 个 node 上的 Pod 在执行。每当一个 Pod 执行完成,BroadcastJob 才会创建一个新 Pod 执行。

CompletionPolicy

CompletionPolicy 支持指定 BroadcastJob 控制器的 reconciling 行为,可以设置为 AlwaysNever

Always

Always 策略意味着 job 最终会完成,不管是执行成功还是失败了。在 Always 策略下还可以设置以下参数:

  • ActiveDeadlineSeconds:指定一个超时时间,如果 BroadcastJob 开始运行超过了这个时间,所有还在跑着的 job 都会被停止、并标记为失败。

  • TTLSecondsAfterFinished 限制了 BroadcastJob 在完成之后的存活时间,默认没有限制。比如设置了 TTLSecondsAfterFinished 为 10s,那么当 job 结束后超过了 10s,控制器就会把 job 和下面的所有 Pod 删掉。

Never

Never 策略意味着 BroadcastJob 永远都不会结束(标记为 Succeeded 或 Failed),即使当前 job 下面的 Pod 都已经执行成功了。 这也意味着 ActiveDeadlineSecondsTTLSecondsAfterFinishedFailurePolicy.RestartLimit 这三个参数是不能使用的。

比如说,用户希望对集群中每个 node 都下发一个配置,包括后续新增的 node 都需要做,那么就可以创建一个 Never 策略的 BroadcastJob。

FailurePolicy

类型

Type 表示的 FailurePolicyType 类型。

  • Continue”(继续)表示当发现失败的 pod 时,作业仍在运行。
  • FailFast”(快速失败)表示当发现失败的 pod 时,作业将失败。
  • Pause”(暂停)表示当发现失败的 pod 时,作业将被暂停。

重启限制

  • RestartLimit(重启限制)指定标记 pod 失败前的重试次数。 目前,重试次数定义为由 Pod 内所有容器的重启次数 ContainerStatus.RestartCount之和。 如果该值超过 RestartLimit(重启限制),该任务将被标记为为失败,所有正在运行的 Pod 将被删除。如果未设置 RestartLimit 未设置,则不执行限制。

例子

监控 BroadcastJob status

在一个单 node 集群中创建一个 BroadcastJob,执行 kubectl get bcj (BroadcastJob 的 short name)看到以下状态:

  1. NAME DESIRED ACTIVE SUCCEEDED FAILED
  2. broadcastjob-sample 1 0 1 0
  • Desired : 期望的 Pod 数量(等同于当前集群中匹配的 node 数量)
  • Active: 运行中的 Pod 数量
  • SUCCEEDED: 执行成功的 Pod 数量
  • FAILED: 执行失败的 Pod 数量

ttlSecondsAfterFinished

创建 BroadcastJob 配置 ttlSecondsAfterFinished 为 30。 这个 job 会在执行结束后 30s 被删除。

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: BroadcastJob
  3. metadata:
  4. name: broadcastjob-ttl
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: pi
  10. image: perl
  11. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  12. restartPolicy: Never
  13. completionPolicy:
  14. type: Always
  15. ttlSecondsAfterFinished: 30

activeDeadlineSeconds

创建 BroadcastJob 配置 activeDeadlineSeconds 为 10。 这个 job 会在运行超过 10s 之后被标记为失败,并把下面还在运行的 Pod 删除掉。

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: BroadcastJob
  3. metadata:
  4. name: broadcastjob-active-deadline
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: sleep
  10. image: busybox
  11. command: ["sleep", "50000"]
  12. restartPolicy: Never
  13. completionPolicy:
  14. type: Always
  15. activeDeadlineSeconds: 10

completionPolicy

创建 BroadcastJob 配置 completionPolicyNever。 这个 job 会持续运行即使当前所有 node 上的 Pod 都执行完成了。

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: BroadcastJob
  3. metadata:
  4. name: broadcastjob-never-complete
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: sleep
  10. image: busybox
  11. command: ["sleep", "5"]
  12. restartPolicy: Never
  13. completionPolicy:
  14. type: Never

failurePolicy

restartLimit

创建 BroadcastJob 配置 failurePolicyFailFast。 当找到失败的pod时,job将失败。

  1. apiVersion: apps.kruise.io/v1alpha1
  2. kind: BroadcastJob
  3. metadata:
  4. name: broadcastjob-restart-limit
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: sleep
  10. image: busybox
  11. command: ["cat", "/path/not/exist"]
  12. restartPolicy: Never
  13. completionPolicy:
  14. type: Never
  15. failurePolicy:
  16. type: FailFast
  17. restartLimit: 3