Використання змінних середовища в специфікації розгортання 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

Очевидно, цей специфічний синтаксис ще не працює. Але чи можливо щось подібне і якщо так, то як?

Я вважаю за краще не покладатися на окремий інструмент забезпечення . Секретні s і ConfigMaps видаються багатообіцяючими, але, очевидно, їх не можна вживати так, як це відповідає цій меті. Якби я міг безпосередньо посилатися на статичну IP-адресу, яка була визначена з gcloud compute addresses create service-addressцим, було б найкраще.

Відповіді:


27

Набагато простіше / чистіше рішення: envsubst

У implemen.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. до цього часу не знав про це
користувач1129682

1
Це не простіше / чистіше, оскільки для цього потрібен окремий інструмент, який не встановлений за замовчуванням у всіх системах (наприклад, Mac)
Іван

@Ivan Його питання було "Але чи можливо щось подібне і якщо так, як?", І це відповідь на його запитання. Питання не було "Як я можу це зробити за допомогою інструментів, доступних для кожної ОС за замовчуванням?". І так, це 1) простіше І 2) чистіше, ніж використовувати sed. За вашим визначенням, запропоноване рішення з sedтакож не було б легшим / чистішим, оскільки sedна комп'ютерах Windows за замовчуванням не встановлено.
Ян Греве

Зовсім не зрозуміло, що ви порівнювали з варіантом "sed".
Іван

2

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

Оскільки це "зовнішнє" джерело для IP-адрес та секретів паролів, більше немає потреби в інструменті (або шаблонах) для мого простого використання (у середовищі GKE).

ЗАБЕЗПЕЧЕННЯ. Зрештою, я вирішив використовувати інструмент забезпечення сортування, а саме "вбудований" 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 -

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 у цьому прикладі.


Звучить цікаво, але ви можете, будь ласка, детальніше розглянути детальніше. Чи можете ви навести або вказати на приклад відповідного сценарію оболонки.
Друкс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.