Wie arbeiten die drei Objekte zusammen?
Eine kleine App in Kubernetes besteht meist aus drei Objekten. Das Deployment hält die Pods, der Service gibt den Namen und die ConfigMap die Einstellungen. Jedes tut eine Sache, und erst zusammen ergeben sie eine App.
Die Kantine einer Fachhochschule in Stuttgart zeigt ihren Tagesplan auf einer Seite. Der Plan steht in einer ConfigMap. Zwei Pods liefern die Seite aus, und ein Service gibt ihnen einen Namen.
Am Ende dieser Lektion
Notiz
Ich kann eine kleine App aus Deployment, Service und ConfigMap bauen und ändern.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Deployment | hält eine Zahl gleicher Pods am Laufen | |
| Service | gibt einer Gruppe von Pods einen festen Namen | |
| ConfigMap | hält Einstellungen getrennt vom Programm | |
| Manifest | eine Beschreibung eines Objekts als Text | kind: Deployment |
| Selector | die Labels, an denen ein Service seine Pods erkennt | |
| Rollout | das Ersetzen der alten Pods durch neue |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jedes Objekt tut genau eine Sache
Das Deployment hält die Pods am Laufen und gibt ihnen Labels. Der Service sucht Pods mit diesen Labels und gibt ihnen einen Namen. Die ConfigMap liefert die Werte, die beim Start in die Pods kommen.
Sie hängen nur an zwei Stellen zusammen. Der Selector des Services muss zu den Labels der Pods passen. Das Deployment muss die ConfigMap beim Namen nennen.
Den Namespace kurs6 anlegen
kubectl create namespace kurs6Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die ConfigMap mit dem Speiseplan anlegen
kubectl create configmap speiseplan -n kurs6 --from-literal=GERICHT=Linsensuppe --from-literal=PREIS=4,20Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die App entsteht in drei Schritten
Erst das Deployment: zwei Pods, deren Programm eine Seite aus GERICHT, PREIS und dem eigenen Namen macht. Dann verbinden wir es mit der ConfigMap. Zuletzt legen wir den Service an.
Der Selector des Services wird dabei vom Deployment übernommen. Er passt also zu den Labels der Pods, ohne dass Sie ihn schreiben.
Das Deployment kantine mit zwei Pods anlegen
kubectl create deployment kantine -n kurs6 --image=busybox:1.37.0 --replicas=2 --port=8080 -- sh -c 'mkdir -p /www; echo "Heute: $GERICHT fuer $PREIS Euro (Pod $HOSTNAME)" > /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/kantine -n kurs6 --from=configmap/speiseplanHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Service für das Deployment anlegen
kubectl expose deployment kantine -n kurs6 --port=80 --target-port=8080Hier 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 der Pods warten
kubectl rollout status deployment/kantine -n kurs6 --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 drei Objekte der App auflisten
kubectl get deployment,service,configmap -n kurs6 -o nameHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die App antwortet über den Namen des Services
Wir fragen die App wie ein anderes Programm im Cluster. Ein kurzer Pod tmp stellt eine Anfrage an den Namen kantine und verschwindet danach.
Die Seite nennt Gericht, Preis und den Pod, der geantwortet hat. Bei der nächsten Anfrage kann es der andere Pod sein.
Die App über den Service anfragen
kubectl run -n kurs6 tmp --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://kantineHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Änderung braucht zwei Schritte
Jetzt wechselt das Gericht. Der erste Schritt ändert die ConfigMap. Der zweite ersetzt die Pods, damit sie die neuen Werte lesen. Danach wartet rollout status, bis die neuen Pods laufen.
Fragen Sie die App erst nach dem Warten. Kommt direkt nach dem Neustart eine Fehlermeldung zur Route, warten Sie einige Sekunden und drücken Sie erneut Ausführen.
Das Gericht in der ConfigMap ändern
kubectl patch configmap speiseplan -n kurs6 -p '{"data":{"GERICHT":"Gemuesecurry"}}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Pods ersetzen
kubectl rollout restart deployment/kantine -n kurs6Hier 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/kantine -n kurs6 --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 App noch einmal anfragen
kubectl run -n kurs6 tmp --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://kantineHier 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, eine App sei fertig, sobald alle drei Objekte da sind. Sie müssen aber zueinander passen. Ein Selector ohne Treffer, ein falscher Port oder eine ConfigMap mit anderem Namen: Jedes Objekt sieht gesund aus, und die App antwortet trotzdem nicht.
Den Namespace kurs6 wieder löschen
kubectl delete namespace kurs6Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.