Używanie zmiennych środowiskowych w specyfikacji wdrażania Kubernetes


18

Obecnie używam specyfikacji Kubernetes Deployment.yamldo wdrażania usługi. Specyfikacja zawiera dosłowne odniesienie do określonego adresu IP (oznaczonego jak <static-ip-address>poniżej):

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

Niepokoi mnie przekazywanie informacji, takich jak hasła lub adresy IP, do zdalnych repozytoriów Git. Czy mogę tego uniknąć, np. Wykorzystując zmienne środowiskowe, np. Ze specyfikacją wdrożenia i faktycznym wdrożeniem mniej więcej w następujący sposób:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

i

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

Oczywiście ta konkretna składnia jeszcze nie działa. Ale czy coś takiego jest możliwe, a jeśli tak, to w jaki sposób?

Wolałbym nie polegać na osobnym narzędziu do obsługi administracyjnej . Tajne s i ConfigMaps wydają się obiecujące, ale najwyraźniej nie mogą być spożywane w sposób, który pasuje do tego celu. Gdybym mógł bezpośrednio odwoływać się do statycznego adresu IP, który został zdefiniowany gcloud compute addresses create service-address, byłoby to najlepsze.

Odpowiedzi:


27

Znacznie łatwiejsze / czystsze rozwiązanie: envsubst

W deploy.yml:

LoadbalancerIP: $LBIP

Następnie po prostu stwórz swój env var i uruchom kubectl w następujący sposób:

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

Po prostu wstawiasz zwykłe zmienne Bash do dowolnego pliku, którego chcesz użyć, w tym przypadku manifest YAML, i zniewalasz odczytanie tego pliku. Wyśle plik z zmiennymi env zmienionymi na ich wartości. Możesz także użyć go do tworzenia nowych plików takich jak ten:

envsubst < input.yml > output.yml

envsubstjest dostępny np gettext. w pakiecie Ubuntu / Debian .


2
+1 dla envsubst. do tej pory o tym nie wiedziałem
11129682

1
To nie jest łatwiejsze / czystsze, ponieważ wymaga osobnego narzędzia, które nie jest domyślnie instalowane na wszystkich systemach (np. Mac)
Ivan

@ Ivan Jego pytanie brzmiało: „Ale czy coś takiego jest możliwe, a jeśli tak, to w jaki sposób?”, I to jest odpowiedź na jego pytanie. Pytanie nie brzmiało: „Jak mogę to zrobić za pomocą narzędzi dostępnych domyślnie w każdym systemie operacyjnym?”. I tak, to jest 1) łatwiejsze ORAZ 2) czystsze niż używanie sed. Z twojej definicji, proponowane rozwiązanie sedrównież nie byłoby łatwiejsze / czystsze, ponieważ seddomyślnie nie ma zainstalowanego systemu Windows.
Jan Grewe,

Nie jest wcale jasne, czy porównywałeś opcję „sed”.
Ivan

2

Nie było innego mile proste rozwiązanie: Mam Google Compute Adres my-addresszdefiniowane, a ja najwyraźniej go używać w specyfikacji usług tak: loadBalancerIP: my-address.

Ponieważ jest to „zewnętrzne” źródło adresów IP i kluczy tajnych dla haseł, nie ma już potrzeby korzystania z narzędzia (lub szablonów) do obsługi mojego prostego przypadku użycia (w środowisku GKE).

OBSOLETE NOW: W końcu zdecydowałem się użyć pewnego rodzaju narzędzia do udostępniania, a mianowicie „wbudowanego” sed.

Mój Deployment.yamlteraz zawiera „zmienną szablonu” np. W

loadBalancerIP: $$EXTERNAL_IP

i wdrażam usługę z, powiedzmy, 1.2.3.4 jako zewnętrzny adres IP za pomocą

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -

1
Podejście Jana Grewe jest bardziej ogólne i można je zastosować do dowolnej liczby zmiennych. Proponuję zaakceptować jego odpowiedź zamiast akceptować własną, która jest mniej ogólna i wymaga dostosowania dla każdej dodatkowej zmiennej.
TekTimmy

0

Możesz napisać prosty procesor wstępny, aby wykonać podstawienie zmiennych w plikach yaml (lub możesz użyć jsonnet, aby osiągnąć to samo w plikach konfiguracyjnych json).

Trwa dyskusja na temat dodawania szablonów bezpośrednio do konfiguracji Kubernetes, ale nie jest ona jeszcze zaimplementowana ani dostępna.


Tak, ale jsonnet jest narzędziem udostępniania, jak wspomniano w pytaniu.
Drux

1
Jeśli szukasz czegoś wbudowanego, to podążanie za problemem, z którym się połączyłem, jest w tej chwili najlepszym wyborem.
Robert Bailey,

0

Do czasu udostępnienia szablonów najłatwiejszym sposobem jest uruchomienie zadania, które korzysta z interfejsu API Kubernetes do aktualizacji usługi. Skrypt krótkiej powłoki na obrazie alpejskim, w połączeniu z kluczem tajnym (zawierającym adres IP) i mapą konfiguracji (zawierającą szablon), powinien być dość prosty. Trudnym bitem jest prawidłowe użycie funkcji uwierzytelniania i autoryzacji apiserver.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-withina-a-pod-container daje przykład dostępu do interfejsu API. Oczywiście w tym przykładzie będziesz chciał POST do / api / v1 / namespaces / default / services zamiast GET.


Brzmi interesująco, ale czy mógłbyś rozwinąć nieco więcej. Czy możesz podać lub wskazać przykład odpowiedniego skryptu powłoki.
Drux
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.