it-wiki:kubernetes:kubernetes-headless-service
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| it-wiki:kubernetes:kubernetes-headless-service [2025/04/27 06:33] – angelegt marko | it-wiki:kubernetes:kubernetes-headless-service [2025/04/27 07:18] (aktuell) – marko | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Kubernetes Headless-Service ====== | ====== Kubernetes Headless-Service ====== | ||
| ===== Übersicht ===== | ===== Übersicht ===== | ||
| - | Ein Service ist eine Kubernetes-Ressource, | + | Ein Service ist eine Kubernetes-Ressource, |
| In diesem Tutorial lernen wir eine spezialisierte Form von Service-Ressourcen kennen, den sogenannten Headless Service. Im Gegensatz zum herkömmlichen Service erlaubt uns ein Headless Service, die IP-Adressen der einzelnen unterstützenden Pods direkt zu erhalten. Diese Fähigkeit eröffnet interessante Anwendungsfälle, | In diesem Tutorial lernen wir eine spezialisierte Form von Service-Ressourcen kennen, den sogenannten Headless Service. Im Gegensatz zum herkömmlichen Service erlaubt uns ein Headless Service, die IP-Adressen der einzelnen unterstützenden Pods direkt zu erhalten. Diese Fähigkeit eröffnet interessante Anwendungsfälle, | ||
| Zeile 7: | Zeile 7: | ||
| Wir werden zunächst die grundlegende Konfiguration eines Headless Service behandeln und anschließend an einer praktischen Demonstration sehen, wie man ihn in der Praxis einsetzen kann. | Wir werden zunächst die grundlegende Konfiguration eines Headless Service behandeln und anschließend an einer praktischen Demonstration sehen, wie man ihn in der Praxis einsetzen kann. | ||
| + | \\ | ||
| ===== Headless Service ===== | ===== Headless Service ===== | ||
| In Kubernetes bezeichnet man einen Headless Service als eine Service-Ressource, | In Kubernetes bezeichnet man einen Headless Service als eine Service-Ressource, | ||
| - | Um einen solchen Headless Service zu definieren, setzt man im Ressourcen-Definition das Feld '' | + | Um einen solchen Headless Service zu definieren, setzt man in der Ressourcen-Definition das Feld '' |
| <code yaml> | <code yaml> | ||
| $ cat headless-svc.yaml | $ cat headless-svc.yaml | ||
| Zeile 34: | Zeile 35: | ||
| Dabei verwenden wir die Option -o go-template, | Dabei verwenden wir die Option -o go-template, | ||
| + | |||
| + | \\ | ||
| + | ===== Eigenschaften eines Headless Service ===== | ||
| + | Bei der Namensauflösung eines typischen Service liefert der DNS-Server eine einzelne IP-Adresse zurück – die sogenannte Cluster-IP, die von der Control Plane zugewiesen wurde. Anders verhält es sich bei einem Headless Service: Hier gibt eine DNS-Abfrage eine Liste von IP-Adressen zurück, die zu den einzelnen, unterstützenden Pods gehören. | ||
| + | |||
| + | Diese Funktionsweise ermöglicht Anwendungsfälle, | ||
| + | |||
| + | \\ | ||
| + | ===== Headless Service in Aktion ===== | ||
| + | In diesem Abschnitt richten wir die notwendigen Ressourcen ein, um die Funktionsweise eines Headless-Services zu demonstrieren. | ||
| + | |||
| + | Zunächst erstellen wir einen Headless-Service: | ||
| + | <code yaml> | ||
| + | $ kubectl apply -f - <<EOF | ||
| + | apiVersion: v1 | ||
| + | kind: Service | ||
| + | metadata: | ||
| + | name: headless-svc-stateful | ||
| + | spec: | ||
| + | clusterIP: None | ||
| + | selector: | ||
| + | app: web-stateful | ||
| + | ports: | ||
| + | - protocol: TCP | ||
| + | port: 80 | ||
| + | targetPort: 8080 | ||
| + | EOF | ||
| + | </ | ||
| + | |||
| + | Als Nächstes erstellen wir ein StatefulSet-Objekt, | ||
| + | <code yaml> | ||
| + | $ kubectl apply -f - <<EOF | ||
| + | apiVersion: apps/v1 | ||
| + | kind: StatefulSet | ||
| + | metadata: | ||
| + | name: app-stateful | ||
| + | labels: | ||
| + | app: server-stateful | ||
| + | spec: | ||
| + | replicas: 3 | ||
| + | selector: | ||
| + | matchLabels: | ||
| + | app: web-stateful | ||
| + | serviceName: | ||
| + | template: | ||
| + | metadata: | ||
| + | labels: | ||
| + | app: web-stateful | ||
| + | spec: | ||
| + | containers: | ||
| + | - name: nginx | ||
| + | image: nginx: | ||
| + | ports: | ||
| + | - containerPort: | ||
| + | EOF | ||
| + | </ | ||
| + | |||
| + | Wichtig ist hierbei, dass das StatefulSet einen Wert für das Feld '' | ||
| + | |||
| + | Nachdem das Manifest angewendet wurde, wird die Kubernetes Control Plane drei Pods erzeugen: | ||
| + | <code bash> | ||
| + | $ kubectl get pods -l app=web-stateful | ||
| + | NAME | ||
| + | app-stateful-0 | ||
| + | app-stateful-1 | ||
| + | app-stateful-2 | ||
| + | </ | ||
| + | |||
| + | ==== Erstellen eines Ephemeral Containers ==== | ||
| + | Ein [[https:// | ||
| + | |||
| + | Dazu verwenden wir den Befehl [[https:// | ||
| + | <code bash> | ||
| + | $ kubectl debug -it app-stateful-0 --image=slongstreet/ | ||
| + | Defaulting debug container name to debugger-2crmp. | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | Der oben gezeigte Befehl startet einen Ephemeral Container im Pod '' | ||
| + | \\ | ||
| + | |||
| + | ==== Auflösung der IP-Adresse des Headless-Services ==== | ||
| + | Innerhalb des flüchtigen Containers wollen wir die IP-Adresse des Headless-Services '' | ||
| + | <code bash> | ||
| + | $ nslookup headless-svc-stateful | ||
| + | Server: | ||
| + | Address: | ||
| + | |||
| + | Name: | ||
| + | Address: 10.244.0.11 | ||
| + | Name: | ||
| + | Address: 10.244.0.12 | ||
| + | Name: | ||
| + | Address: 10.244.0.10 | ||
| + | </ | ||
| + | |||
| + | Die Abfrage liefert eine Liste von drei IP-Adressen für diesen Domainnamen. Jede dieser Adressen gehört zu einem Pod, der durch den Service angesprochen wird. | ||
| + | |||
| + | Ein kleiner Haken an der Antwort ist, dass wir anhand der IP-Adressen nicht direkt erkennen können, zu welchen Pods sie jeweils gehören. Glücklicherweise ist es mit einem Headless-Service einfach, diese Zuordnung herauszufinden. | ||
| + | \\ | ||
| + | |||
| + | ==== Auflösung der IP-Adresse eines bestimmten Pods ==== | ||
| + | Möchten wir die IP-Adresse eines bestimmten Pods ermitteln, der dem Headless-Service zugeordnet ist, fügen wir den Namen des Pods als Subdomain zum Domainnamen des Headless-Services hinzu. | ||
| + | |||
| + | Konkret können wir so die IP-Adresse des Pods '' | ||
| + | <code bash> | ||
| + | $ nslookup app-stateful-1.headless-svc-stateful | ||
| + | Server: | ||
| + | Address: | ||
| + | |||
| + | Name: | ||
| + | Address: 10.244.0.11 | ||
| + | </ | ||
| + | |||
| + | Anstatt wie zuvor alle IP-Adressen der zugehörigen Pods zurückzugeben, | ||
| + | |||
| + | \\ | ||
| + | ===== Fazit ===== | ||
| + | In diesem Tutorial haben wir uns kurz mit dem Service-Objekt im Kubernetes-Umfeld beschäftigt und dabei erfahren, dass es sich bei einem Headless-Service im Grunde um einen Service ohne Cluster-IP handelt. Aufgrund des Fehlens einer Cluster-IP verhalten sich Headless-Services anders als reguläre Services. | ||
| + | |||
| + | Abschließend haben wir ein Beispiel durchgespielt, | ||
it-wiki/kubernetes/kubernetes-headless-service.1745735595.txt.gz · Zuletzt geändert: von marko