一个 kubernetes 作业可以包含多个 pods 具有不同的并行定义吗?

Can a single kubernetes job contain multiple pods with different parallelism definitions?

我有一个批处理作业,它分为 3 个任务,每个任务都依赖于之前完成的任务才能开始:

  1. 运行 单个 pod
  2. 运行Npods并联(.spec.completions=.spec.parallelism=N)
  3. 运行Mpods并联(.spec.completions=.spec.parallelism=M)

每个任务都有不同的资源需求 (CPU/MEM/STORAGE)。目前,我开始作业 #1,当它完成时,它运行一个 kubectl 命令来启动作业 #2,依此类推到作业 #3。我有 3 个不同的工作。

我可以为这 3 个任务定义一个作业吗?

也许是这样的:

  1. 运行 任务 #1 的单个 pod
  2. 在任务 #2 上定义初始化容器以等待任务 #1 完成
  3. 运行 N pods 任务 #2 使用 .spec.completions
  4. 在任务 # 上定义初始化容器以等待任务 #2 完成
  5. 运行 M pods 用于任务 #3 使用不同的 .spec.completions 适用于任务 #3

我不清楚是否可以在同一作业下为不同的 pods 定义单独的 .spec.parallelism.spec.completions。而如果我可以定义单独的init容器来延迟后面任务的启动。

这可能都需要像 Argo 这样更完整的工作流引擎(我们还没有)。

Kubernetes Job Controller 根据 Job 规范中的单个 pod 模板创建 pod。 所以不,你不能在一个工作中有多个 pods

但是 kubernetes 是一个可扩展的系统,您可以定义自己的 Custom Resource 并编写一个像 Job 控制器这样的控制器,它支持具有不同并行度的多个 pod 模板。

我刚刚想出了一个办法。

yaml文件支持多文件。因此,您可以在单个 yaml 文件下附加多个作业定义,使用 --- 作为分隔符。

这是一个例子:

apiVersion: batch/v1
kind: Job
metadata:
  name: ge-test-job
spec:
  template:
    spec:
      containers:
      - name: ge-test-1
        image: improbableailab/model-free
        command: ["perl", "-Mbignum=bpi", "-wle", "print 1"]
        resources:
          limits:
            memory: 200Mi
            cpu: 1000m
          requests:
            memory: 50Mi
            cpu: 500m
        volumeMounts:
        - mountPath: /jaynes-mounts
          name: ge-pvc
      restartPolicy: Never
      volumes:
        - name: ge-pvc
          persistentVolumeClaim:
            claimName: ge-pvc
  backoffLimit: 4
  ttlSecondsAfterFinished: 10
---
apiVersion: batch/v1
kind: Job
metadata:
  name: ge-test-job-2
spec:
  template:
    spec:
      containers:
        - name: ge-test-2
          image: improbableailab/model-free
          command: ["perl", "-Mbignum=bpi", "-wle", "print 1"]
          resources:
            limits:
              memory: 200Mi
              cpu: 1000m
            requests:
              memory: 50Mi
              cpu: 500m
          volumeMounts:
            - mountPath: /jaynes-mounts
              name: ge-pvc
      restartPolicy: Never
      volumes:
        - name: ge-pvc
          persistentVolumeClaim:
            claimName: ge-pvc
  backoffLimit: 4
  ttlSecondsAfterFinished: 10

现在如果你运行

❯ kubectl apply -f job.yaml
job.batch/ge-test-job created
job.batch/ge-test-job-2 created