Как сделать переменную среды разной для двух модулей одного и того же развертывания в kubernetes?
Исходя из этого, можно создавать переменные среды, которые будут одинаковыми для всех определенных вами модулей развертывания.
Есть ли способ поручить развертыванию Kubernetes создавать модули, которые имеют различные переменные среды?
Случай использования:
Допустим, у меня есть контейнер мониторинга, и я хочу создать 4 его копии. Этот контейнер имеет службу, которая отправляет почтовые сообщения, если переменные среды определяют это. Например, если env var IS_MASTER имеет значение true, то служба переходит к отправке этих электронных писем.
apiVersion: v1
kind: Deployment
metadata:
...
spec:
...
replicas: 4
...
template:
...
spec:
containers:
-env:
-name: IS_MASTER
value: <------------- True only in one of the replicas
(В моем случае я использую шлем, но то же самое можно сделать и без шлема)
3 ответа
Насколько я знаю, вы ищете скорее анти-паттерн, чем невозможный.
Из того, что я понимаю, вы, похоже, хотите развернуть масштабируемую платформу / платформу для мониторинга высокой доступности, которая не будет отправлять X раз по оповещениям, поэтому вы можете либо создать контейнер с коляской, который будет общаться с его братьями и сестрами, и "выбрать" мастер-почтовик (StatefulSet облегчит в этом случае), или просто отделите почтовую программу от мониторинга и заставьте их общаться друг с другом через Сервис. Это позволит вам балансировать нагрузку как по мониторингу, так и по почте отдельно.
monitoring-1 \ / mailer-1
monitoring-2 --- > mailer.svc -- mailer-2
monitoring-3 / \ mailer-3
Любой почтовый запрос будет обрабатываться одним и только одним почтовым агентом из пула, но это при условии, что ваши модули мониторинга не все срабатывают вместе при оповещениях... Если это не так, то независимо от вашего "главного" выбора для почтового сервера, вам придется заняться этим в первую очередь.
И, решая эту первую задачу, я имею в виду добавление логики основных выборов в вашу платформу мониторинга для организации основных отказов при сбое в событиях, и есть несколько способов сделать это, но это действительно зависит от того, что ваша платформа мониторинга может делать...
Хотя, если ваши реплики только для того, чтобы как-то увеличить вычислительную мощность, а ваш мастер должен быть статичным, просто используйте StatefulSet и добавьте один слой во время выполнения if hostname == $statefulset-name-0 then MASTER
Но я чувствую, что это не лучшая идея.
По определению каждый модуль в развертывании идентичен другим его репликам. Это невозможно в определении yaml.
Дополнительным решением будет переопределить стручок command
и обработайте и вычислите значение переменной, установите переменную (export IS_MASTER=${resolved_value}
) и вызвать точку входа по умолчанию для контейнера.
Это означает, что вам придется придумать логику для реализации этого (то есть откуда модуль знает, что это должно быть IS_MASTER=true?). Это деталь реализации, которую можно выполнить с БД или другим общим общим ресурсом, используемым в качестве флага или семафора.
Все реплики Pod в развертывании будут иметь одинаковые переменные среды и не иметь уникального значения для идентификации конкретного Pod. Создание нескольких развертываний является лучшим решением.
Не уверен, почему, OP предназначен только для одного развертывания. Одним из решений является использование StatefulSets. Имена узлов будут выглядеть как web-0, web1, web-2 и так далее. В коде проверьте имя хоста, если это web-0, отправьте электронные письма или сделайте что-нибудь еще.
Это грязное решение, но я не могу придумать лучшего решения, чем создание нескольких развертываний.
Еще одно решение состоит в том, чтобы использовать одну и ту же диаграмму управления рулем для обоих случаев и запустить одно развертывание руля для каждого случая. Вы можете переписать переменные env с помощью helm (используя --set .Values.foo.deployment.isFirst=
"0"
или же "1"
)
Пожалуйста, обратите внимание, что Helm/K8s не позволит вам выставить одну и ту же конфигурацию дважды.
Таким образом, вам придется условно применить некоторые конкретные конфигурации Kubernetes (Secrets, ConfigMaps, Secrets и т. Д.) Только для первого развертывания.
{{- if eq .Values.foo.deployment.isFirst "1" }}
...
...
{{- end }}