57

我正在尝试用 Kubernetes 作业替换我的旧作业调度程序,并想知道如何将顺序作业编写为 Kubernetes 作业。

首先,我编写了以下脚本以按书面顺序执行job1job2但它没有按我预期的那样工作。

apiVersion: batch/v1
kind: Job
metadata:
  name: sequential
spec:
  activeDeadlineSeconds: 100
  template:
    metadata:
      name: sequential_jobs
    spec:
      containers:
      - name: job1
        image: image1
      - name: job2
        image: image2
      restartPolicy: Never

上面描述的工作似乎是并行运行job1job2。有没有什么好的方法可以按书面顺序job1运行?job2

附加。

我最近发现https://github.com/argoproj/argo非常适合我的用例。

4

6 回答 6

73

经过几次尝试,我做到了这一点并且解决了基本问题(类似于OP发布的内容)。此配置确保在开始job-1之前完成job-2。如果job-1失败,job-2容器不会启动。我仍然需要处理重试和故障处理,但基础工作。希望这会帮助其他人:

apiVersion: v1
kind: Pod
metadata:
  name: sequential-job
spec:
  initContainers:
  - name: job-1
    image: busybox
    # runs for 15 seconds; echoes job name and timestamp
    command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;']
  - name: job-2
    image: busybox
    # runs for 15 seconds; echoes job name and timestamp
    command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;']
  # I don't really need the 'containers', but syntax requires 
  # it so, I'm using it as a place where I can report the 
  # completion status
  containers:
  - name: job-done
    image: busybox
    command: ['sh', '-c', 'echo "job-1 and job-2 completed"']
  restartPolicy: Never

更新

与上述相同的配置也适用于 Job 规范:

apiVersion: batch/v1
kind: Job
metadata:
  name: sequential-jobs
spec:
  template:
    metadata:
      name: sequential-job
    spec:
      initContainers:
      - name: job-1
        image: busybox
        command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;']
      - name: job-2
        image: busybox
        command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;']
      containers:
      - name: job-done
        image: busybox
        command: ['sh', '-c', 'echo "job-1 and job-2 completed"']
      restartPolicy: Never
于 2017-10-23T01:04:07.877 回答
7

Argo 工作流程将适合您的用例。Argo将支持顺序、并行、DAG 作业处理。

# This template demonstrates a steps template and how to control sequential vs. parallel steps.
# In this example, the hello1 completes before the hello2a, and hello2b steps, which run in parallel.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: steps-
spec:
  entrypoint: hello-hello-hello

  templates:
  - name: hello-hello-hello
    steps:
    - - name: hello1
        template: whalesay
        arguments:
          parameters: [{name: message, value: "hello1"}]
    - - name: hello2a
        template: whalesay
        arguments:
          parameters: [{name: message, value: "hello2a"}]
      - name: hello2b
        template: whalesay
        arguments:
          parameters: [{name: message, value: "hello2b"}]

  - name: whalesay
    inputs:
      parameters:
      - name: message
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["{{inputs.parameters.message}}"]

于 2019-05-06T02:29:59.840 回答
4

你看过 Brigade - https://brigade.sh。使用 JavaScript 编写简单和复杂的工作流程。将容器链接在一起,并行或串行运行它们。根据时间、GitHub 事件、Docker 推送或任何其他触发器触发脚本。Brigade 是为 Kubernetes 创建管道的工具。

于 2018-01-27T14:11:01.447 回答
3

广义上讲,在 Kubernetes 设置中没有跨容器/pod 的序列和捕获依赖关系的概念。

在您的情况下,如果您在作业规范(甚至是 pod 规范)中有 2 个容器,则这 2 个容器没有排序。同样,如果您一个接一个地解雇 2 个工作,那么这些工作也没有排序的概念。

理想情况下,如果有任何事情需要排序,您应该单个单元(容器)中捕获它。


与您的问题有点相切,当 Job 依赖于现有的另一个服务时我看到的另一种常见模式(例如由 k8s 服务引导的部署):

作业中的容器向 k8s 服务发出请求,如果服务没有按预期响应则失败。这样,作业会不断重启,最终当服务启动时,作业会成功执行并完成。

于 2016-11-21T06:32:10.307 回答
3

此功能由 Kubernetes 提供,用于使用该字段并行或顺序运行作业,Parallelism它还有助于限制一次运行的作业数量

这是文档:Kubernetes 文档

apiVersion: batch/v1
kind: Job
metadata:
 name: job-wq-2
spec:
 parallelism: 1
 template:
  metadata:
   name: job-wq-2
spec:
  containers:
  - name: c
    image: gcr.io/myproject/job-wq-2
  restartPolicy: OnFailure
于 2021-01-05T20:19:31.960 回答
0

刚遇到这个。如上所述,据我所知,Kubernetes 中没有工作依赖的概念,但我一直在与一个商业实体 (Univa) 合作,该实体具有提供此(和其他)功能的附加组件。

该产品称为 Navops Command,它允许您使用简单的依赖表示法来注释 Kubernetes 作业。这里有一个带有简要解释和示例的博客。基本上,Navops 作为一组容器安装在 Kubernetes 上,公开它自己的 UI 和 CLI,并为 Kubernetes 调度程序补充额外的功能。您可以在http://navops.io下载它。

该技术来自 HPC 中使用的 Grid Engine 调度程序,其中复杂的工作流、阵列作业等很常见。

于 2017-08-03T19:12:46.080 回答