Как последовательно запускать контейнеры как задание 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, где распространены сложные рабочие процессы, задания массивов и тому подобное.