Verwenden von Umgebungsvariablen in der Kubernetes-Bereitstellungsspezifikation


18

Ich verwende derzeit eine Kubernetes-Spezifikation Deployment.yamlfür die Bereitstellung eines Dienstes. Die Spezifikation enthält einen wörtlichen Verweis auf eine bestimmte IP-Adresse (wie <static-ip-address>unten markiert ):

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

Ich mache mir Sorgen, Informationen wie Passwörter oder IP-Adressen in entfernte Git-Repositorys zu übertragen. Kann ich dies vermeiden, indem ich Umgebungsvariablen verwende, z. B. mit einer Implementierungsspezifikation und einer tatsächlichen Implementierung, ungefähr wie folgt:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

und

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

Offensichtlich funktioniert diese spezielle Syntax noch nicht. Aber ist so etwas möglich und wenn ja wie?

Ich würde es vorziehen, mich nicht auf ein separates Bereitstellungstool zu verlassen . Geheimnis s und ConfigMaps scheinen vielversprechend, aber offenbar können sie nicht , dass Klagen dieser Zweck in einer Art und Weise konsumiert werden. Wenn ich direkt auf eine statische IP-Adresse verweisen könnte, die damit definiert wurde gcloud compute addresses create service-address, wäre das am besten.

Antworten:


27

Eine viel einfachere / sauberere Lösung: envsubst

In deploy.yml:

LoadbalancerIP: $LBIP

Dann erstelle einfach deine env var und starte kubectl wie folgt:

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

Sie fügen einfach reguläre Bash-Variablen in die Datei ein, die Sie verwenden möchten, in diesem Fall das YAML-Manifest, und lassen diese Datei von ensubst lesen. Die Datei wird mit den durch ihre Werte ersetzten Umgebungsvariablen ausgegeben. Sie können es auch verwenden, um neue Dateien wie folgt zu erstellen:

envsubst < input.yml > output.yml

envsubstist zB im Ubuntu / Debian- gettextPaket verfügbar .


2
+1 für envsubst. Das wusste ich bis jetzt noch nicht
user1129682

1
Es ist nicht einfacher / sauberer, da es ein separates Tool erfordert, das nicht standardmäßig auf allen Systemen (z. B. Mac) installiert ist
Ivan

@Ivan Seine Frage war "Aber ist so etwas möglich und wenn ja wie?", Und das ist die Antwort auf seine Frage. Die Frage lautete nicht "Wie kann ich dies mit Tools tun, die standardmäßig auf jedem Betriebssystem verfügbar sind?". Und ja, es ist 1) einfacher UND 2) sauberer als die Verwendung sed. Nach Ihrer Definition wäre die vorgeschlagene Lösung mit sedauch nicht einfacher / sauberer, da sedauf Windows-Computern standardmäßig keine installiert ist.
Jan Grewe

Es ist überhaupt nicht klar, dass Sie mit der Option "sed" verglichen haben.
Ivan

2

Es gab eine weitere angenehm einfache Lösung: Ich habe eine Google Compute - Adresse my-addressdefiniert ist , und ich kann es offenbar wie so in dem Dienst spec benutzen loadBalancerIP: my-address.

Mit dieser Funktion als "externe" Quelle für IP-Adressen und Geheimnisse für Kennwörter ist für meinen einfachen Anwendungsfall (in einer GKE-Umgebung) kein Bereitstellungstool (oder keine Vorlagen) mehr erforderlich.

JETZT BEOBACHTEN: Ich habe mich schließlich für ein Provisioning-Tool entschieden, nämlich " Built -In" sed.

Meine Deployment.yamlenthält jetzt eine "Template Variable" zB in

loadBalancerIP: $$EXTERNAL_IP

und ich setze den Dienst mit zB 1.2.3.4 als externe IP-Adresse mit ein

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

1
Jan Grewes Ansatz ist allgemeiner und kann auf eine beliebige Anzahl von Variablen angewendet werden. Ich würde vorschlagen, seine Antwort zu akzeptieren, anstatt Ihre eigene zu akzeptieren, die weniger allgemein ist und für jede weitere Variable angepasst werden muss.
TekTimmy

0

Sie können einen einfachen Pre-Prozessor schreiben, um eine variable Substitution für Ihre yaml-Dateien durchzuführen (oder Sie können jsonnet verwenden , um dasselbe für json-Konfigurationsdateien zu erreichen).

Es wird diskutiert , Vorlagen direkt in die Kubernetes-Konfiguration einzufügen , diese ist jedoch noch nicht implementiert oder verfügbar.


Ja, aber jsonnet ist ein Bereitstellungstool, wie in der Frage erwähnt.
Drux

1
Wenn Sie auf der Suche nach etwas Eingebautem sind, ist es an dieser Stelle am besten, dem von mir verknüpften Problem zu folgen.
Robert Bailey

0

Bis Vorlagen zur Verfügung stehen, ist der einfachste Weg , es zu tun ist , einen Job zu starten, das das Kubernetes API verwendet , um den Dienst zu aktualisieren. Ein kurzes Shell-Skript in einem alpinen Image, das mit einem Geheimnis (das die IP-Adresse enthält) und einer Konfigurationsübersicht (das die Vorlage enthält) gekoppelt ist, sollte einfach genug sein. Das schwierige Bit verwendet die Authentifizierungs- und Autorisierungsfunktionen des Apiservers korrekt.

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container gibt ein Beispiel für den Zugriff auf die API. Offensichtlich möchten Sie in diesem Beispiel einen POST in / api / v1 / namespaces / default / services anstelle des GET durchführen.


Hört sich interessant an, aber können Sie bitte etwas näher darauf eingehen. Können Sie ein Beispiel für ein geeignetes Shell-Skript nennen oder darauf verweisen?
Drux
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.