Как последовательно запускать контейнеры как задание Kubernetes?

Я пытаюсь заменить свой старый планировщик заданий заданием Kubernetes и задаюсь вопросом, как писать последовательные задания в качестве заданий Kubernetes.

Сначала я написал следующий скрипт для выполнения job1 а также job2 в письменном порядке, но это не сработало, как я ожидал.

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

Описанная выше работа, кажется, выполняется job1 а также job2 в параллели. Есть ли хороший способ бежать job1 а также job2 в письменном порядке?

Добавив.

Недавно я нашел https://github.com/argoproj/argo очень хорошим для моего использования.

6 ответов

После нескольких попыток я сделал это, и это решило основную проблему (аналогично тому, что опубликовал ОП). Эта конфигурация гарантирует, что 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

Рабочий процесс Argo подойдет для вашего случая использования. Argo будет поддерживать последовательную, параллельную обработку заданий DAG. https://github.com/argoproj/argo

# 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}}"]

Вы смотрели на бригаду - https://brigade.sh/. Скрипт простых и сложных рабочих процессов с использованием JavaScript. Цепные контейнеры вместе, запустив их параллельно или последовательно. Запускайте сценарии, основанные на времени, событиях GitHub, нажатиях Docker или любом другом триггере. Бригада это инструмент для создания трубопроводов для Kubernetes.

В общих чертах, в настройках Kubernetes нет понятия последовательности и захвата зависимостей между контейнерами / модулями.

В вашем случае, если у вас есть 2 контейнера в спецификации задания (или даже в спецификации под), последовательность для этих двух контейнеров отсутствует. Точно так же, если вы запускаете 2 задания одно за другим, для этих заданий также нет последовательности.

В идеале, если что-то требует последовательности, вы должны захватить это в пределах одного блока (контейнера).


Немного касательно вашего вопроса, еще одна распространенная картина, которую я видел, когда задание зависит от другого существующего сервиса (скажем, от развертывания, предоставляемого сервисом k8s):

Контейнер в задании отправляет запрос службе k8s и завершается сбоем, если служба не отвечает должным образом. Таким образом, задание продолжает перезапускаться, и, в конце концов, когда служба работает, задание выполняется и успешно завершается.

Эта функция предоставляется 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

Просто наткнулся на это. Как указывалось выше, насколько я знаю, в Kubernetes отсутствует понятие рабочих зависимостей, но я работаю с коммерческой организацией (Univa), у которой есть надстройка, обеспечивающая эти (и другие) возможности.

Предложение называется Navops Command и позволяет комментировать задания Kubernetes с помощью простой записи зависимостей. Здесь есть блог с кратким объяснением и примером - http://blogs.univa.com/2017/06/navops-command-1-2-delivers-new-advanced-capabilities-for-managing-resources-on-kubernetes/. По сути, Navops устанавливается в виде набора контейнеров в Kubernetes, предоставляет собственный пользовательский интерфейс и интерфейс командной строки и дополняет планировщик Kubernetes дополнительными возможностями. Вы можете скачать его по адресу http://navops.io/.

Технология основана на планировщике Grid Engine, используемом в HPC, где распространены сложные рабочие процессы, задания массивов и тому подобное.

Другие вопросы по тегам