Как последовательно запускать контейнеры как задание 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 очень хорошо для моего использования.
Ответы
Ответ 1
После нескольких попыток я сделал это и решил основную проблему (похожую на то, что опубликовал ОП). Эта конфигурация обеспечивает завершение job-1
до начала job-2
. Если сбой job-1
job-2
контейнер 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
Ответ 2
В широком смысле нет понятия последовательности и захвата зависимостей между контейнерами/контейнерами в настройке Kubernetes.
В вашем случае, если у вас есть 2 контейнера в спецификации задания (или даже спецификации пакета), для этих 2 контейнеров нет последовательности. Точно так же, если вы запускаете 2 задания один за другим, нет никакого понятия о последовательности для этих заданий.
В идеале, если что-то требует последовательности, вы должны захватить его в одном устройстве (контейнере).
Чуть тангенциальный к вашему вопросу, еще один общий шаблон, который я видел, когда работа зависит от другой существующей службы (скажем, развертывание с помощью службы k8s):
Контейнер в задании делает запрос к службе k8s и терпит неудачу, если служба не отвечает так, как ожидалось. Таким образом, Job продолжает перезагрузку и, в конце концов, когда служба завершается, задание выполняется и завершается успешно.
Ответ 3
Вы смотрели бригаду - https://brigade.sh. Скрипт простых и сложных рабочих процессов с использованием JavaScript. Соединяйте контейнеры, запуская их параллельно или последовательно. Пожарные сценарии, основанные на времени, события GitHub, Docker push или любой другой триггер. Бригада - это инструмент для создания трубопроводов для Кубернетов.
Ответ 4
Рабочий процесс 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}}"]
Ответ 5
Просто наткнулся на это. Как указывалось выше, насколько я знаю, в Kubernetes отсутствует понятие рабочих зависимостей, но я работал с коммерческой организацией (Univa), у которой есть надстройка, которая предоставляет эти (и другие) возможности.
Предложение называется Navops Command и позволяет аннотировать задания Kubernetes с помощью простой записи зависимостей. Здесь есть блог с кратким объяснением и примером здесь. По сути, Navops устанавливается как набор контейнеров в Kubernetes, предоставляет собственный интерфейс пользователя и интерфейс командной строки и дополняет планировщик Kubernetes дополнительными возможностями. Вы можете скачать его на http://navops.io.
Технология основана на планировщике Grid Engine, используемом в HPC, где распространены сложные рабочие процессы, задания массивов и тому подобное.