В настоящее время я использую спецификацию 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
, это было бы лучше всего.
Существовало еще одно приятное простое решение: У меня есть заданный 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 -
Пока не будут доступны шаблоны , самый простой способ сделать это - запустить задание, которое использует 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 в этом примере.
Вы можете написать простой препроцессор для подстановки переменных в ваших файлах yaml (или вы можете использовать jsonnet для выполнения того же самого в файлах конфигурации json).
Существует некоторое обсуждение добавления шаблонов непосредственно в конфигурацию Kubernetes , но это еще не реализовано или недоступно.
Гораздо более простое / более чистое решение: 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
.