Wie ändert man eine Einstellung in Kubernetes?
Eine ConfigMap ist in Kubernetes ein Objekt, das Einstellungen als Paare aus Name und Wert speichert, getrennt vom Programm. So ändern Sie eine Einstellung, ohne das Programm neu zu bauen.
Die Mensa einer Hochschule in Köln zeigt auf ihrer Webseite die Öffnungszeit. Sie ändert sich im Semester. Steht die Zeit in einer ConfigMap, ändern Sie einen Wert und müssen das Programm nicht anfassen.
Am Ende dieser Lektion
Notiz
Ich kann eine Einstellung in einer ConfigMap ändern und sagen, wann ein Pod sie sieht.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| ConfigMap | ein Objekt mit Einstellungen als Paaren aus Name und Wert | |
| Umgebungsvariable | ein Wert, den ein Programm beim Start von außen erhält | GRUSS |
| Schlüssel | der Name eines Wertes in der ConfigMap | |
| Rollout | das Ersetzen der alten Pods durch neue | |
| Patch | eine kleine Änderung an einem vorhandenen Objekt | |
| Image | das fertige Paket, aus dem ein Container entsteht | busybox:1.37.0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einstellungen gehören nicht ins Image
Steht die Öffnungszeit im Programm selbst, müssen Sie es für jede Änderung neu bauen und neu ausliefern. Das ist langsam und fehleranfällig.
Eine ConfigMap hält die Werte getrennt. Ein Schlüssel nennt den Wert, hier GRUSS und OEFFNUNG. Der Befehl unten legt sie im Namespace kurs4 an. Zuerst brauchen Sie den Namespace.
Den Namespace kurs4 anlegen
kubectl create namespace kurs4Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine ConfigMap mit zwei Schlüsseln anlegen
kubectl create configmap begruessung -n kurs4 --from-literal=GRUSS=Willkommen --from-literal=OEFFNUNG=9Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Werte der ConfigMap lesen
kubectl get configmap begruessung -n kurs4 -o jsonpath='{.data}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Pod bekommt die Werte als Umgebungsvariablen
Ein Programm liest die Werte als Umgebungsvariablen. Kubernetes setzt sie beim Start des Pods aus der ConfigMap.
Der erste Befehl legt ein Deployment seite an. Sein Programm macht beim Start aus GRUSS und OEFFNUNG eine Seite. Der zweite verbindet das Deployment mit der ConfigMap. Das ersetzt den Pod, und rollout status wartet, bis der neue läuft.
Ein Deployment anlegen, das die Seite baut
kubectl create deployment seite -n kurs4 --image=busybox:1.37.0 --port=8080 -- sh -c 'mkdir -p /www; echo "$GRUSS, wir oeffnen um $OEFFNUNG Uhr" > /www/index.html; trap "exit 0" TERM; httpd -f -p 8080 -h /www & wait'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Deployment mit der ConfigMap verbinden
kubectl set env deployment/seite -n kurs4 --from=configmap/begruessungHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Auf den neuen Pod warten
kubectl rollout status deployment/seite -n kurs4 --timeout=90sHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Variable im Pod lesen
kubectl exec -n kurs4 deployment/seite -- printenv GRUSSHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein laufender Pod sieht eine Änderung nicht
Jetzt ändern wir den Gruß in der ConfigMap. patch ändert nur das, was Sie angeben.
Prüfen Sie danach zweimal. Die ConfigMap enthält den neuen Wert. Der laufende Pod gibt aber weiter den alten aus, denn Kubernetes setzt Umgebungsvariablen nur beim Start. Seine Seite zeigt den alten Gruß ebenfalls.
Den Gruß in der ConfigMap ändern
kubectl patch configmap begruessung -n kurs4 -p '{"data":{"GRUSS":"Guten Tag"}}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den neuen Wert in der ConfigMap lesen
kubectl get configmap begruessung -n kurs4 -o jsonpath='{.data.GRUSS}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Denselben Wert im laufenden Pod lesen
kubectl exec -n kurs4 deployment/seite -- printenv GRUSSHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein Pod bemerke eine geänderte ConfigMap sofort. Kubernetes liest die Werte aber nur beim Start des Pods. Der Pod muss ersetzt werden, bevor er den neuen Wert sieht. Wer die ConfigMap ändert und die Seite alt bleibt, hat nichts falsch gemacht.
Ein Neustart ersetzt die Pods und lädt neu
kubectl rollout restart ersetzt alle Pods eines Deployments durch neue. Die neuen lesen die ConfigMap beim Start und sehen den neuen Wert.
Warten Sie mit rollout status, bis der Austausch fertig ist. Läuft ein Befehl direkt nach dem Neustart in eine Fehlermeldung zur Route, warten Sie einige Sekunden und drücken Sie erneut Ausführen.
Die Pods des Deployments ersetzen
kubectl rollout restart deployment/seite -n kurs4Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Auf den Austausch warten
kubectl rollout status deployment/seite -n kurs4 --timeout=90sHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Variable im neuen Pod lesen
kubectl exec -n kurs4 deployment/seite -- printenv GRUSSHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Namespace kurs4 wieder löschen
kubectl delete namespace kurs4Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.