Hintergrund:
Derzeit verwenden wir Docker und Docker Compose für unsere Dienste. Wir haben die Konfiguration für verschiedene Umgebungen in Dateien ausgelagert, die Umgebungsvariablen definieren, die von der Anwendung gelesen werden. Zum Beispiel eine prod.env
Datei:
ENV_VAR_ONE=Something Prod
ENV_VAR_TWO=Something else Prod
und eine test.env
Datei:
ENV_VAR_ONE=Something Test
ENV_VAR_TWO=Something else Test
Daher können wir beim Starten des Containers einfach die Datei prod.env
oder test.env
verwenden:
docker run --env-file prod.env <image>
Unsere Anwendung übernimmt dann ihre Konfiguration basierend auf den in definierten Umgebungsvariablen prod.env
.
Fragen:
- Gibt es eine Möglichkeit, Umgebungsvariablen aus einer Datei in Kubernetes bereitzustellen (z. B. beim Definieren eines Pods), anstatt sie wie folgt fest zu codieren:
apiVersion: v1 Art: Pod Metadaten: Etiketten: Kontext: Docker-K8s-Labor Name: MySQL-Pod Name: MySQL-Pod spec: Behälter: - - env: - - Name: MYSQL_USER Wert: MySQL - - Name: MYSQL_PASSWORD Wert: MySQL - - Name: MYSQL_DATABASE Wert: Probe - - Name: MYSQL_ROOT_PASSWORD Wert: Supersekret Bild: "MySQL: Neueste" Name: MySQL Häfen: - - containerPort: 3306
- Wenn dies nicht möglich ist, welcher Ansatz wird vorgeschlagen?
Secret
oder keineConfigMap
Ressource erstellen, da dies nur vorübergehend ist und zum Testen verwendet wird. Ich habe eingeschränkte Berechtigungen im k8s-Cluster. Ich kann möglicherweise eineSecret
Ressource erstellen , aber ich kann sie nicht löschen, sobald sie bereits erstellt wurde.Antworten:
Sie können die Umgebungsvariablen eines Containers mithilfe von Secrets oder ConfigMaps füllen . Verwenden Sie Secrets, wenn die Daten, mit denen Sie arbeiten, vertraulich sind (z. B. Kennwörter), und ConfigMaps, wenn dies nicht der Fall ist.
Geben Sie in Ihrer Pod-Definition an, dass der Container Werte aus einem Geheimnis abrufen soll:
Beachten Sie, dass diese Syntax nur in Kubernetes 1.6 oder höher verfügbar ist. In einer früheren Version von Kubernetes müssen Sie jeden Wert manuell angeben, z.
(Beachten Sie, dass
env
ein Array als Wert verwendet wird.)Und für jeden Wert wiederholen.
Unabhängig davon, welchen Ansatz Sie verwenden, können Sie jetzt zwei verschiedene Geheimnisse definieren, eines für die Produktion und eines für den Entwickler.
dev-secret.yaml:
prod-secret.yaml:
Und stellen Sie das richtige Geheimnis für den richtigen Kubernetes-Cluster bereit:
Wenn ein Pod gestartet wird, werden seine Umgebungsvariablen mit den im Secret angegebenen Werten gefüllt.
quelle
Ein neues Update für Kubernetes (v1.6) ermöglicht das, wonach Sie gefragt haben (vor Jahren).
Sie können jetzt
envFrom
Folgendes in Ihrer Yaml-Datei verwenden:Wo Entwicklungsgeheimnisse Ihr Geheimnis sind, können Sie es erstellen durch:
Wo der Inhalt der txt-Datei ein Schlüsselwert ist:
Die Dokumente sind immer noch Seen von Beispielen, ich musste wirklich hart an diesen Orten suchen:
envFrom
- zeigt an, dass diese Option verfügbar ist.ConfigMap
Dokumente zeigen ein Beispiel für die Verwendung.quelle
--from-env-file
? Verwenden von--from-file
Ergebnissen in einem Schlüssel (benannt nach der Eingabedatei) mit dem Inhalt der Datei. Mit--from-env-file
erweitert werden die Schlüssel in der Datei ins Geheimnis. Weitere Informationen finden Sie in dieser Google-Dokumentation .Wenn Sie einen Pod für Kubernetes mithilfe einer YAML-Datei definieren, gibt es keine direkte Möglichkeit, eine andere Datei anzugeben, die Umgebungsvariablen für einen Container enthält. Das Kubernetes-Projekt sagt, dass sie diesen Bereich in Zukunft verbessern werden (siehe Kubernetes-Dokumente ).
In der Zwischenzeit schlage ich vor, ein Bereitstellungstool zu verwenden und den Pod YAML zu einer Vorlage zu machen. Wenn Sie beispielsweise Ansible verwenden, sieht Ihre Pod-YAML-Datei folgendermaßen aus:
Datei
my-pod.yaml.template
:Dann kann Ihr Ansible-Playbook die Variable an einer
mysql_root_password
geeigneten Stelle angeben und beim Erstellen der Ressource ersetzen, zum Beispiel:Datei
my-playbook.yaml
:Datei
my-env-vars-prod.yaml
:Datei
my-env-vars-test.yaml
:Jetzt erstellen Sie die Pod-Ressource, indem Sie beispielsweise Folgendes ausführen:
quelle
kubectl-run
20 env-Variablen übergeben möchte ? warum dann nicht 12factor einfacher machen ??Das funktioniert bei mir:
Datei
env-secret.yaml
und in die
deployment.yaml
oderpod.yaml
quelle
Dies ist eine alte Frage, aber sie hat viele Zuschauer, deshalb füge ich meine Antwort hinzu. Der beste Weg, um die Konfiguration von der K8-Implementierung zu trennen, ist die Verwendung von Helm. Jedes Helm-Paket kann eine
values.yaml
Datei enthalten, und wir können diese Werte problemlos im Helm-Diagramm verwenden. Wenn wir eine Mehrkomponententopologie haben, können wir ein Umbrella-Helm-Paket erstellen und das übergeordnete Wertepaket kann auch die untergeordneten Wertedateien überschreiben.quelle
Dies ist eine alte Frage, aber lassen Sie mich meine Antwort für zukünftige Anfänger beschreiben.
Sie können kustomize configMapGenerator verwenden.
und verweisen Sie auf diese configMap / dieses Beispiel in der Pod-Definition
quelle