Использование переменных среды в спецификации развертывания Kubernetes

18

В настоящее время я использую спецификацию Kubernetes Deployment.yamlдля развертывания службы. Спецификация включает дословную ссылку на конкретный IP-адрес (помечен как <static-ip-address>показано ниже):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

Я обеспокоен передачей информации, такой как пароли или IP-адреса, в удаленные репозитории Git. Можно ли избежать этого, например, используя переменные среды, например, со спецификацией развертывания и фактическим развертыванием примерно следующим образом:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

и

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

Очевидно, этот специфический синтаксис еще не работает. Но возможно ли что-то подобное, и если да, то как?

Я бы предпочел не полагаться на отдельный инструмент обеспечения . Секретные секреты ConfigMapкажутся многообещающими, но, очевидно, они не могут быть использованы таким образом, который подходит для этой цели. Если бы я мог напрямую ссылаться на статический IP-адрес, который был определен с gcloud compute addresses create service-addressэтим, было бы лучше.

Drux
источник

Ответы:

27

Гораздо проще / чище решение: envsubst

В deploy.yml:

LoadbalancerIP: $LBIP

Затем просто создайте свой env var и запустите kubectl следующим образом:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

Вы просто помещаете обычные переменные Bash в любой файл, который хотите использовать, в данном случае в манифест YAML, и начинаете читать этот файл. Он выведет файл с заменой переменных на их значения. Вы также можете использовать его для создания новых файлов, таких как:

envsubst < input.yml > output.yml

envsubstдоступно, например, в gettextпакете Ubuntu / Debian .

Ян Греве
источник
2
+1 за envsubst. не знал об этом до сих пор
user1129682
1
Это не проще / чище, так как это требует отдельного инструмента, который по умолчанию не установлен на всех системах (например , Mac)
Иван
@Ivan Его вопрос был «Но возможно ли что-то подобное, и если да, то как?», И это ответ на его вопрос. Вопрос был не «Как я могу сделать это с помощью инструментов, доступных в каждой ОС по умолчанию?». И да, это 1) легче и 2) чище, чем использовать sed. По вашему определению, предлагаемое решение sedтакже не будет проще / чище, так как sedпо умолчанию на компьютерах с Windows не установлено.
Ян
Совершенно не ясно, что вы сравнивали с опцией «sed».
Иван
2

Было еще приятно простое решение: у меня есть Google Compute Адрес my-addressопределен, и я могу по- видимому , использовать его в спецификации сервиса , как так: loadBalancerIP: my-address.

При этом в качестве «внешнего» источника для IP-адресов и секретов для паролей больше не требуется инструмент обеспечения (или шаблоны) для моего простого варианта использования (в среде GKE).

ОБЕСПЕЧИВАЙТЕ СЕЙЧАС: Я решил использовать своего рода инструмент обеспечения, а именно «встроенный» sed, в конце концов.

My Deployment.yamlтеперь содержит «переменную шаблона», например, в

loadBalancerIP: $$EXTERNAL_IP

и я развертываю службу с, скажем, 1.2.3.4 в качестве внешнего IP-адреса с

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
Drux
источник
1
Подход Яна Греве является более общим и может применяться к любому числу переменных. Я бы посоветовал принять его ответ вместо того, чтобы принять свой, который является менее общим и требует корректировки для каждой дополнительной переменной.
TekTimmy
0

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

Существует некоторая дискуссия о добавлении шаблонов непосредственно в конфигурацию Kubernetes, но она еще не реализована и не доступна.

Роберт Бейли
источник
Да, но jsonnet - инструмент обеспечения, как упомянуто в вопросе.
Друкс
1
Если вы ищете что-то встроенное, то решение проблемы, с которой я столкнулся, - ваш лучший выбор на данный момент.
Роберт Бейли,
0

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

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container приводит пример доступа к API. Очевидно, что вы захотите поместить POST в / api / v1 / namespaces / default / services вместо GET в этом примере.

aecolley
источник
Звучит интересно, но не могли бы вы рассказать подробнее? Не могли бы вы привести или указать на пример подходящего сценария оболочки.
Друкс