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: 2025/04/27 06:33 von marko