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

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

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

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

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

17
задан 23 May 2017 в 15:41
4 ответа

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

С этим "внешним" источником для IP адресов и секретов для паролей больше нет необходимости в инструменте провижининга (или шаблонах) для моего простого варианта использования (в среде GKE).

OBSOLETE NOW: Я все-таки решил использовать инструмент провижининга, а именно "встроенный" sed, в конце концов.

Мой Deployment.yaml теперь содержит "шаблонную переменную", например, в

loadBalancerIP: $$EXTERNAL_IP

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

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
2
ответ дан 2 December 2019 в 20:30

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

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

0
ответ дан 2 December 2019 в 20:30

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

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

0
ответ дан 2 December 2019 в 20:30

Гораздо более простое / более чистое решение: envsubst

В deploy.yml:

LoadbalancerIP: $LBIP

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

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

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

envsubst < input.yml > output.yml

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

26
ответ дан 2 December 2019 в 20:30

Теги

Похожие вопросы