Einführung
In vorherigen Labs haben Sie gelernt, dass Pods kommen und gehen. Wenn ein Pod ausfällt und durch einen neuen ersetzt wird, erhält der neue Pod eine vollständig andere IP-Adresse. Stellen Sie sich vor, Sie möchten einen Freund anrufen, aber dessen Telefonnummer ändert sich jedes Mal, wenn er auflegt!
Um dieses Problem zu lösen, verwendet Kubernetes einen Service.
Ein Service gibt einer Anwendung eine stabile Netzwerkidentität, auch wenn sich die zugrunde liegenden Pods ändern. Diese Trennung zwischen dem Lebenszyklus eines Pods und dem Service-Endpunkt ist ein grundlegendes Konzept der Kubernetes-Netzwerkfunktion.
Dies ist eines der wichtigsten Denkmodelle für Kubernetes-Netzwerke: Pods sollen austauschbar sein, aber Clients benötigen weiterhin eine verlässliche Adresse. Ein Service löst diesen Widerspruch, indem er vor den sich ändernden Pods liegt und einen stabilen Namen sowie eine virtuelle IP-Adresse bereitstellt.
In diesem Lab werden Sie:
- einen Service erstellen, um Ihrer Anwendung eine stabile Adresse zu geben;
- lernen, wie der Service weiß, an welche Pods er Anfragen senden soll (mithilfe von Selektoren);
- über einen bestimmten Servicetyp namens NodePort von außerhalb des Clusters auf Ihre Anwendung zugreifen.
Service-YAML erstellen
In diesem Schritt erstellen Sie eine Konfigurationsdatei für einen Service. Wir verwenden dabei den speziellen Typ NodePort.
Ein NodePort-Service öffnet an jedem Node (Server) im Cluster einen bestimmten Port. Das ist so, als würden Sie eine bestimmte Tür an Ihrem Haus öffnen, damit die Außenwelt hereinkommen kann.
NodePort ist leicht verständlich, weil der Service direkt einem Port auf jedem Node zugeordnet wird. Für öffentlichen Datenverkehr ist dies jedoch normalerweise nicht das endgültige Produktionsdesign. In größeren Umgebungen wird NodePort häufig hinter einem Cloud-Load-Balancer oder einer Ingress-Schicht eingesetzt. In diesem Lab ist NodePort hilfreich, weil der Netzwerkpfad für Anfänger sichtbar wird.
Erstellen Sie in Ihrem Projektverzeichnis eine Datei namens service.yaml:
nano service.yaml
Fügen Sie den folgenden Inhalt ein. Beachten Sie den Abschnitt selector: Wir lassen ihn absichtlich zunächst auf app: unknown gesetzt, um zu zeigen, wie er funktioniert.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
ports:
- port: 80 ## The port the Service exposes internally
targetPort: 80 ## The port the container is listening on
nodePort: 30008 ## The static door we are opening to the outside
selector:
app: unknown ## This needs to match your Pod's label
Speichern Sie die Datei und beenden Sie den Editor (Ctrl+X, Y, Enter).
Diese Datei definiert einen Service namens my-service. Er lauscht am Port 30008 (nodePort). Jeder Datenverkehr, der diesen Port erreicht, wird an Pods mit dem Label app: unknown weitergeleitet. Solche Pods gibt es derzeit jedoch nicht!
Selektor korrigieren
Ein Service verwendet einen Selektor, um die Pods zu finden, an die er Datenverkehr weiterleiten soll. Der Selektor funktioniert wie eine Adressangabe. Wenn die Adresse auf dem Umschlag (der Service-Selektor) nicht mit der Adresse am Haus (dem Pod-Label) übereinstimmt, kommt die Post nicht an.
Labels und Selektoren werden in Kubernetes nicht nur bei Services verwendet. Sie gehören zu den wichtigsten Mechanismen der Plattform, um Objekte zu gruppieren. Statt feste Pod-Namen zu hinterlegen, finden Kubernetes-Ressourcen zugehörige Objekte normalerweise durch den Abgleich von Labels. Dadurch bleibt das System flexibel, wenn Pods neu erstellt werden.
Im Einrichtungsschritt wurde automatisch eine Webanwendung für Sie gestartet. Suchen wir ihr „Adresslabel“.
Führen Sie diesen Befehl aus, um die Labels Ihrer laufenden Pods anzuzeigen:
kubectl get pods --show-labels
Sie sollten etwas Ähnliches sehen wie: web-app-xxxxx ... app=web-app
Das Label lautet app=web-app. Unser Service sucht jedoch nach app: unknown. Korrigieren wir das.
Bearbeiten Sie die Datei service.yaml:
nano service.yaml
Ändern Sie den Abschnitt selector, sodass er mit dem Label Ihres Pods übereinstimmt:
selector:
app: web-app
Speichern Sie die Datei und beenden Sie den Editor. Nun weiß der Service genau, wohin er den Datenverkehr senden soll.
Anwenden und überprüfen
Nachdem die Adresse korrigiert ist, aktivieren wir den Service.
Wenn Sie dieses Manifest anwenden, erstellt Kubernetes ein Service-Objekt und richtet interne Netzwerkregeln ein. Dadurch können Anfragen, die den Service erreichen, an passende Pod-Endpunkte weitergeleitet werden. Wichtig ist: Der Service selbst führt Ihre Anwendung nicht aus. Er ist eine Netzwerkabstraktion vor den Anwendungspods.
Wenden Sie die Konfiguration auf den Cluster an:
kubectl apply -f service.yaml
Sie sollten folgende Ausgabe sehen: service/my-service created.
Um zu bestätigen, dass der Service aktiv ist, zeigen Sie die Liste der Services an:
kubectl get svc my-service
Sie sehen:
- NAME: my-service
- TYPE: NodePort
- PORT(S): 80:30008/TCP
Damit ist bestätigt, dass Ihre „Telefonnummer“ aktiv ist und am Port 30008 auf Anfragen wartet.
Auf die Anwendung zugreifen
Jetzt kommt der entscheidende Moment. Können wir von „außen“, also über Ihr Terminal, auf die Anwendung zugreifen?
Die Anwendung ist am Port 30008 des Kubernetes-Nodes verfügbar.
Hier spielen drei Ports eine Rolle, die Anfänger häufig verwechseln. Der nodePort ist der nach außen geöffnete Port am Node. Der port ist der Port, den die Service-Abstraktion bereitstellt. Der targetPort ist der Port innerhalb des Containers, an dem die Anwendung tatsächlich Anfragen entgegennimmt. Wenn Sie diese drei Aufgabenbereiche auseinanderhalten, vermeiden Sie spätere Verwirrung.
Ermitteln Sie zuerst die IP-Adresse des Minikube-Nodes:
minikube ip
Nehmen wir an, die Ausgabe lautet 192.168.49.2. Die vollständige Adresse Ihrer Anwendung lautet dann http://192.168.49.2:30008.
Mit curl können Sie diese Adresse aufrufen und überprüfen, ob die Anwendung antwortet:
curl http://$(minikube ip):30008
Sie sollten den HTML-Code der Seite „Welcome to nginx!“ sehen.
Damit ist der vollständige Weg der Anfrage bestätigt:
- Sie haben den externen Port des Nodes (
30008) aufgerufen. - Der Service hat die Anfrage entgegengenommen.
- Er hat seinen Selektor (
app: web-app) geprüft. - Er hat die Anfrage an einen der Pods weitergeleitet, die diesem Label entsprechen.
- Der Pod hat mit der Webseite geantwortet.
Zusammenfassung
In diesem Lab haben Sie das Problem wechselnder Pod-IP-Adressen mithilfe eines Services gelöst.
Sie haben erfolgreich:
- einen NodePort-Service (
service.yaml) erstellt, um ein Gateway zu Ihrer Anwendung zu öffnen; - einen Selektor konfiguriert, der dem Service mitteilt, welche Pods er verwalten soll;
- von außerhalb des Clusters über eine stabile Adresse auf Ihre laufende Anwendung zugegriffen.
Services verbinden die verschiedenen Teile von Kubernetes-Anwendungen miteinander und ermöglichen eine zuverlässige Kommunikation zwischen ihnen.


