Wie finden sich Pods in Kubernetes?
Ein Service gibt einer Gruppe von Pods in Kubernetes einen festen Namen und eine feste Adresse. Andere Pods erreichen sie über diesen Namen, auch wenn die Pods wechseln.
Der Shop einer Buchhandlung in Hamburg läuft in zwei Pods. Das Kassenprogramm will den Shop erreichen. Die Adressen der Pods ändern sich aber bei jedem Neustart, der Name des Services bleibt.
Am Ende dieser Lektion
Notiz
Ich kann Pods einen gemeinsamen Namen geben und ihn von einem anderen Pod aus finden.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Service | ein fester Name und eine feste Adresse für eine Gruppe von Pods | |
| Selector | die Labels, an denen ein Service seine Pods erkennt | app=laden |
| Port | die Nummer der Tür, an der ein Programm Anfragen annimmt | 8080 |
| Cluster-DNS | der Namensdienst, der Servicenamen in Adressen übersetzt | |
| ClusterIP | die Adresse eines Services, die nur im Cluster gilt | |
| Endpoint | die Adresse eines Pods hinter einem Service |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Warum Pods keine feste Adresse haben
Jeder Pod bekommt beim Start eine eigene Adresse im Cluster. Wird er ersetzt, bekommt der neue Pod eine andere. Ein Programm, das sich eine Adresse merkt, findet seinen Pod nach dem Ersetzen nicht mehr.
Die Befehle unten legen den Namespace kurs3 an und darin das Deployment laden mit zwei Pods. Jeder Pod liefert mit httpd eine Seite auf Port 8080 aus, und die Seite nennt den Namen des Pods.
Den Namespace kurs3 anlegen
kubectl create namespace kurs3Hier 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 laden mit zwei Pods anlegen
kubectl create deployment laden -n kurs3 --image=busybox:1.37.0 --replicas=2 --port=8080 -- sh -c 'mkdir -p /www; echo "Willkommen im Laden, antwortet $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.
Die laufenden Pods zählen
kubectl get pods -n kurs3 --no-headers | grep -c RunningHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Service wählt seine Pods mit einem Selector
Ein Service hat einen festen Namen und eine feste Adresse, die ClusterIP. Sie gilt nur im Cluster.
Der Selector sagt dem Service, welche Pods dahinterstehen: alle mit den passenden Labels. Fällt ein Pod aus oder kommt einer hinzu, ändert der Service seine Liste von selbst. Die Befehle legen einen Service für laden an. Er nimmt Anfragen auf Port 80 an und leitet sie an Port 8080 der Pods weiter.
Einen Service für das Deployment anlegen
kubectl expose deployment laden -n kurs3 --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.
Den Service anzeigen
kubectl get service laden -n kurs3Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Selector des Services abfragen
kubectl get service laden -n kurs3 -o jsonpath='{.spec.selector}'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 mit dem Label app=laden zählen
kubectl get pods -n kurs3 -l app=laden --no-headers | wc -lHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Ports, zwei Aufgaben
| Angabe | Wert hier | Bedeutung |
|---|---|---|
| --port | 80 | Auf diesem Port nimmt der Service Anfragen an |
| --target-port | 8080 | An diesen Port des Pods leitet er weiter |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Der Name des Services ist eine Adresse
Sie müssen sich keine Adresse merken. Das Cluster-DNS übersetzt den Namen eines Services in seine ClusterIP. Der volle Name lautet dienst.namespace.svc.cluster.local.
Im selben Namespace genügt der kurze Name laden. Aus einem anderen Namespace schreiben Sie laden.kurs3. Die Befehle starten einen kurzen Pod tmp im Namespace kurs3, der eine Anfrage stellt und danach verschwindet.
Den Service aus einem Pod anfragen
kubectl run -n kurs3 tmp --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://ladenHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den vollen Namen im Cluster-DNS nachschlagen
kubectl run -n kurs3 tmp --rm -i --restart=Never --image=busybox:1.37.0 -- nslookup laden.kurs3.svc.cluster.localHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den kurzen Namen aus dem Namespace default versuchen
kubectl run tmp --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- -T 3 http://ladenHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Namen mit Namespace aus default versuchen
kubectl run tmp --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- -T 3 http://laden.kurs3Hier 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 Service gehöre zu einem Deployment. Er kennt aber nur Labels. Passt der Selector zu keinem Pod, ist die Liste leer, und jede Anfrage läuft ins Leere. Prüfen Sie bei einem Service ohne Antwort zuerst, ob der Selector zu den Labels der Pods passt.
Den Namespace kurs3 wieder löschen
kubectl delete namespace kurs3Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.