VolcanoJob

最近更新于 Jul 31, 2021

定义

Volcano Job,简称vcjob,是Volcano自定义的Job资源类型。区别于Kubernetes Job,vcjob提供了更多高级功能,如可指定调度器、支持最小运行pod数、 支持task、支持生命周期管理、支持指定队列、支持优先级调度等。Volcano Job更加适用于机器学习、大数据、科学计算等高性能计算场景。

样例

  1. apiVersion: batch.volcano.sh/v1alpha1
  2. kind: Job
  3. metadata:
  4. name: test-job
  5. spec:
  6. minAvailable: 3
  7. schedulerName: volcano
  8. priorityClassName: high-priority
  9. policies:
  10. - event: PodEvicted
  11. action: RestartJob
  12. plugins:
  13. ssh: []
  14. env: []
  15. svc: []
  16. maxRetry: 5
  17. queue: default
  18. volumes:
  19. - mountPath: "/myinput"
  20. - mountPath: "/myoutput"
  21. volumeClaimName: "testvolumeclaimname"
  22. volumeClaim:
  23. accessModes: [ "ReadWriteOnce" ]
  24. storageClassName: "my-storage-class"
  25. resources:
  26. requests:
  27. storage: 1Gi
  28. tasks:
  29. - replicas: 6
  30. name: "default-nginx"
  31. template:
  32. metadata:
  33. name: web
  34. spec:
  35. containers:
  36. - image: nginx
  37. imagePullPolicy: IfNotPresent
  38. name: nginx
  39. resources:
  40. requests:
  41. cpu: "1"
  42. restartPolicy: OnFailure

关键字段

  • schedulerName

schedulerName表示该job的pod所使用的调度器,默认值为volcano,也可指定为default-scheduler。它也是tasks.template.spec.schedulerName的默认值。

  • minAvailable

minAvailable表示运行该job所要运行的最少pod数量。只有当job中处于running状态的pod数量不小于minAvailable时,才认为该job运行正常。

  • volumes

volumes表示该job的挂卷配置。volumes配置遵从kubernetes volumes配置要求。

  • tasks.replicas

tasks.replicas表示某个task pod的副本数。

  • tasks.template

tasks.template表示某个task pod的具体配置定义。

  • tasks.policies

tasks.policies表示某个task的生命周期策略。

  • policies

policies表示job中所有task的默认生命周期策略,在tasks.policies不配置时使用该策略。

  • plugins

plugins表示该job在调度过程中使用的插件。

  • queue

queue表示该job所属的队列。

  • priorityClassName

priorityClassName表示该job优先级,在抢占调度和优先级排序中生效。

  • maxRetry

maxRetry表示当该job可以进行的最大重启次数。

资源状态

  • pending

pending表示job还在等待调度中,处于排队的状态。

  • aborting

aborting表示job因为某种外界原因正处于中止状态,即将进入aborted状态。

  • aborted

aborted表示job因为某种外界原因已处于中止状态。

  • running

running表示job中至少有minAvailable个pod正在运行状态。

  • restarting

restarting表示job正处于重启状态,正在中止当前的job实例并重新创建新的实例。

  • completing

completing表示job中至少有minAvailable个数的task已经完成,该job正在进行最后的清理工作。

  • completed

completing表示job中至少有minAvailable个数的task已经完成,该job已经完成了最后的清理工作。

  • terminating

terminating表示job因为某种内部原因正处于终止状态,正在等到pod或task释放资源。

  • terminated

terminated表示job因为某种内部原因已经处于终止状态,job没有达到预期就结束了。

  • failed

failed表示job经过了maxRetry次重启,依然没有正常启动。

使用场景

  • TensorFlow workload

以tensorflow为例,创建一个具有1个ps和2个worker的工作负载。

  1. apiVersion: batch.volcano.sh/v1alpha1
  2. kind: Job
  3. metadata:
  4. name: tensorflow-dist-mnist
  5. spec:
  6. minAvailable: 3 // 该job的3个pod必须都可用
  7. schedulerName: volcano // 指定volcano为调度器
  8. plugins:
  9. env: []
  10. svc: []
  11. policies:
  12. - event: PodEvicted // 当pod被驱逐时,重启该job
  13. action: RestartJob
  14. tasks:
  15. - replicas: 1 // 指定1个ps pod
  16. name: ps
  17. template: // ps pod的具体定义
  18. spec:
  19. containers:
  20. - command:
  21. - sh
  22. - -c
  23. - |
  24. PS_HOST=`cat /etc/volcano/ps.host | sed 's/$/&:2222/g' | sed 's/^/"/;s/$/"/' | tr "\n" ","`;
  25. WORKER_HOST=`cat /etc/volcano/worker.host | sed 's/$/&:2222/g' | sed 's/^/"/;s/$/"/' | tr "\n" ","`;
  26. export TF_CONFIG={\"cluster\":{\"ps\":[${PS_HOST}],\"worker\":[${WORKER_HOST}]},\"task\":{\"type\":\"ps\",\"index\":${VK_TASK_INDEX}},\"environment\":\"cloud\"};
  27. python /var/tf_dist_mnist/dist_mnist.py
  28. image: volcanosh/dist-mnist-tf-example:0.0.1
  29. name: tensorflow
  30. ports:
  31. - containerPort: 2222
  32. name: tfjob-port
  33. resources: {}
  34. restartPolicy: Never
  35. - replicas: 2 // 指定2个worker pod
  36. name: worker
  37. policies:
  38. - event: TaskCompleted // 2个worker完成任务时认为该job完成任务
  39. action: CompleteJob
  40. template: // worker pod的具体定义
  41. spec:
  42. containers:
  43. - command:
  44. - sh
  45. - -c
  46. - |
  47. PS_HOST=`cat /etc/volcano/ps.host | sed 's/$/&:2222/g' | sed 's/^/"/;s/$/"/' | tr "\n" ","`;
  48. WORKER_HOST=`cat /etc/volcano/worker.host | sed 's/$/&:2222/g' | sed 's/^/"/;s/$/"/' | tr "\n" ","`;
  49. export TF_CONFIG={\"cluster\":{\"ps\":[${PS_HOST}],\"worker\":[${WORKER_HOST}]},\"task\":{\"type\":\"worker\",\"index\":${VK_TASK_INDEX}},\"environment\":\"cloud\"};
  50. python /var/tf_dist_mnist/dist_mnist.py
  51. image: volcanosh/dist-mnist-tf-example:0.0.1
  52. name: tensorflow
  53. ports:
  54. - containerPort: 2222
  55. name: tfjob-port
  56. resources: {}
  57. restartPolicy: Never
  • argo workload

以argo为例,创建一个具有2个pod副本的工作负载,要求1个可用即可。

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: Workflow
  3. metadata:
  4. generateName: volcano-step-job-
  5. spec:
  6. entrypoint: volcano-step-job
  7. serviceAccountName: argo
  8. templates:
  9. - name: volcano-step-job
  10. steps:
  11. - - name: hello-1
  12. template: hello-tmpl
  13. arguments:
  14. parameters: [{name: message, value: hello1}, {name: task, value: hello1}]
  15. - - name: hello-2a
  16. template: hello-tmpl
  17. arguments:
  18. parameters: [{name: message, value: hello2a}, {name: task, value: hello2a}]
  19. - name: hello-2b
  20. template: hello-tmpl
  21. arguments:
  22. parameters: [{name: message, value: hello2b}, {name: task, value: hello2b}]
  23. - name: hello-tmpl
  24. inputs:
  25. parameters:
  26. - name: message
  27. - name: task
  28. resource:
  29. action: create
  30. successCondition: status.state.phase = Completed
  31. failureCondition: status.state.phase = Failed
  32. manifest: | // Volcano Job的具体定义
  33. apiVersion: batch.volcano.sh/v1alpha1
  34. kind: Job
  35. metadata:
  36. generateName: step-job-{{inputs.parameters.task}}-
  37. ownerReferences:
  38. - apiVersion: argoproj.io/v1alpha1
  39. blockOwnerDeletion: true
  40. kind: Workflow
  41. name: "{{workflow.name}}"
  42. uid: "{{workflow.uid}}"
  43. spec:
  44. minAvailable: 1
  45. schedulerName: volcano
  46. policies:
  47. - event: PodEvicted
  48. action: RestartJob
  49. plugins:
  50. ssh: []
  51. env: []
  52. svc: []
  53. maxRetry: 1
  54. queue: default
  55. tasks:
  56. - replicas: 2
  57. name: "default-hello"
  58. template:
  59. metadata:
  60. name: helloworld
  61. spec:
  62. containers:
  63. - image: docker/whalesay
  64. imagePullPolicy: IfNotPresent
  65. command: [cowsay]
  66. args: ["{{inputs.parameters.message}}"]
  67. name: hello
  68. resources:
  69. requests:
  70. cpu: "100m"
  71. restartPolicy: OnFailure
  • MindSpore

以MindSpore为例,创建一个具有8个pod副本的工作负载,要求1个可用即可。

  1. apiVersion: batch.volcano.sh/v1alpha1
  2. kind: Job
  3. metadata:
  4. name: mindspore-cpu
  5. spec:
  6. minAvailable: 1
  7. schedulerName: volcano
  8. policies:
  9. - event: PodEvicted
  10. action: RestartJob
  11. plugins:
  12. ssh: []
  13. env: []
  14. svc: []
  15. maxRetry: 5
  16. queue: default
  17. tasks:
  18. - replicas: 8
  19. name: "pod"
  20. template:
  21. spec:
  22. containers:
  23. - command: ["/bin/bash", "-c", "python /tmp/lenet.py"]
  24. image: lyd911/mindspore-cpu-example:0.2.0
  25. imagePullPolicy: IfNotPresent
  26. name: mindspore-cpu-job
  27. resources:
  28. limits:
  29. cpu: "1"
  30. requests:
  31. cpu: "1"
  32. restartPolicy: OnFailure

说明事项

Volcano支持的计算框架

Volcano对当前主流的计算框架均能很好的支持,具体如下:

  1. TensorFlow
  2. Pytorch
  3. MindSpore
  4. PaddlePaddle
  5. Spark
  6. Flink
  7. OpenMPI
  8. Horovod
  9. MXNet
  10. Kubeflow
  11. Argo
  12. KubeGene

volcano和default-scheduler的选择

与default-scheduler相比,volcano在批处理方面进行了增强。它更适用于高性能计算场景,如机器学习、大数据应用和科学计算。