Каковы некоторые рекомендации по развертыванию нескольких контейнеров со связанными переменными среды?
Я пытаюсь развернуть параллельную задачу обработки данных, которая использует много контейнеров с одним и тем же образом докера, каждый из которых будет работать с разными инкрементными переменными среды. Изображение настроено для чтения переменных env, чтобы определить, какой сегмент большего списка обрабатывать.
Справочная информация: Первоначально я использовал скрипт bash, который передавал инкрементную команду env var командам запуска docker, но теперь я хотел бы получить лучший способ управлять / контролировать все контейнеры. У меня был только опыт использования Kubernetes для сервисов приложений, но кажется, что это может быть и лучший способ организовать мою задачу с несколькими контейнерами.
Интересно, возможна ли такая передача динамических переменных среды в конфигах YAML Kubernetes, так как я бы предпочел декларативную конфигурацию вместо сценария оболочки. Я также не уверен в лучшем подходе сделать это в Kubernetes, будь то несколько отдельных контейнеров, несколько контейнеров или использование каким-либо образом реплик.
Я открыт для предложений, я знаю, что другие инструменты, такие как Terraform, могут быть полезны и для такого рода программной инфраструктуры.
2 ответа
Как насчет использования параллельной обработки с использованием рабочей очереди для передачи различных переменных среды в ваши рабочие модули k8s с помощью.spec.parallelism. Хотя наличие отдельной службы для рабочей очереди может быть немного слишком много, в зависимости от того, что вы пытаетесь сделать.
Другой идеей может быть использование силы шаблонов шлема для создания файла манифеста k8s. Я создаю образец диаграммы руля, чтобы дать представление о шаблонной параллельной обработке. Смотрите https://github.com/jayrajput/helm-parallel-jobs. После того, как вы клонировали репозиторий git, вы можете установить график рулевого управления для параллельной обработки следующим образом. Шаблон для работы такой же, как и в документации k8s. Как видно из выходных данных ниже, предоставляются три разные переменные среды - яблоко, банан, вишня, которые создают 3 разных модуля с передаваемыми им переменными среды.
[root@jr]# helm install --set envs='{apple,banana,cherry}' --name jobs ./helm-parallel-jobs/example/parallel-jobs
NAME: jobs
LAST DEPLOYED: Sun Aug 26 16:29:23 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Job
NAME DESIRED SUCCESSFUL AGE
process-item-apple 1 0 0s
process-item-banana 1 0 0s
process-item-cherry 1 0 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
process-item-apple-dr6st 0/1 ContainerCreating 0 0s
process-item-banana-d2wwq 0/1 ContainerCreating 0 0s
process-item-cherry-wvlxz 0/1 ContainerCreating 0 0s
Насколько я понимаю, вы хотели бы сделать что-то вроде https://kubernetes.io/docs/tasks/job/parallel-processing-expansion/ где задания создаются из шаблона, по одному для каждого элемента данных в списке. Но вы не хотите, чтобы это было написано в оболочке.
Я полагаю, что helm можно использовать для замены Job, и у него есть функция range, поэтому можно настроить диаграмму для создания заданий для каждой записи в разделе values.yaml. Так что он может занимать место, похожее на то, что вы предложили для terraform. Ansible также может быть вариантом.
Однако направление этого вопроса, по-видимому, направлено на планирование партии. Мне интересно, будут ли ваши рабочие места развиваться, чтобы в конечном итоге возникли зависимости между ними и т. Д. Если это так, Хелм и Кубернетес: существует ли барьерный эквивалент для рабочих мест? и https://www.quora.com/Is-Kubernetes-suited-for-long-running-batch-jobs помогают здесь. В настоящее время в Kubernetes есть средства для запуска пакетных заданий и инструментарий, позволяющий запускать или строить систему пакетного планирования, но сама она не содержит встроенной системы пакетного планирования. Таким образом, люди в настоящее время используют различные подходы для удовлетворения своих потребностей.