一个 kubernetes 作业可以包含多个 pods 具有不同的并行定义吗?
Can a single kubernetes job contain multiple pods with different parallelism definitions?
我有一个批处理作业,它分为 3 个任务,每个任务都依赖于之前完成的任务才能开始:
- 运行 单个 pod
- 运行Npods并联(
.spec.completions
=.spec.parallelism
=N)
- 运行Mpods并联(
.spec.completions
=.spec.parallelism
=M)
每个任务都有不同的资源需求 (CPU/MEM/STORAGE)。目前,我开始作业 #1,当它完成时,它运行一个 kubectl
命令来启动作业 #2,依此类推到作业 #3。我有 3 个不同的工作。
我可以为这 3 个任务定义一个作业吗?
也许是这样的:
- 运行 任务 #1 的单个 pod
- 在任务 #2 上定义初始化容器以等待任务 #1 完成
- 运行 N pods 任务 #2 使用
.spec.completions
- 在任务 # 上定义初始化容器以等待任务 #2 完成
- 运行 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
我有一个批处理作业,它分为 3 个任务,每个任务都依赖于之前完成的任务才能开始:
- 运行 单个 pod
- 运行Npods并联(
.spec.completions
=.spec.parallelism
=N) - 运行Mpods并联(
.spec.completions
=.spec.parallelism
=M)
每个任务都有不同的资源需求 (CPU/MEM/STORAGE)。目前,我开始作业 #1,当它完成时,它运行一个 kubectl
命令来启动作业 #2,依此类推到作业 #3。我有 3 个不同的工作。
我可以为这 3 个任务定义一个作业吗?
也许是这样的:
- 运行 任务 #1 的单个 pod
- 在任务 #2 上定义初始化容器以等待任务 #1 完成
- 运行 N pods 任务 #2 使用
.spec.completions
- 在任务 # 上定义初始化容器以等待任务 #2 完成
- 运行 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