Begriff
Service (K8s)
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Pods sind sterblich. Ihre IP-Adressen ändern sich ständig (Neustart = neue IP).
Wie soll das Frontend das Backend finden, wenn die IP, die ich in die Config schreibe, morgen falsch ist?
Der Service ist die stabile Adresse (der Anker).
Er bekommt eine feste IP (ClusterIP) und einen DNS-Namen (my-backend).
Er leitet Anrufe an einen der gerade lebenden Pods weiter ("Load Balancing").
Auch wenn alle Backend-Pods sterben und neu aufstehen (neue IPs), bleibt die Service-IP gleich.
Das Frontend ruft immer nur den Service an.
Merksatz: Eine Abstraktionsschicht in Kubernetes, die eine logische Gruppe von Pods definiert und eine stabile Netzwerk-Vorschrift (IP und DNS) bereitstellt, um auf sie zuzugreifen.
Du definierst einen Service "my-service", der auf Port 80 lauscht und zu Pods mit Label app: backend auf Port 8080 weiterleitet.
selector:
app: backend
ports:
- port: 80
targetPort: 8080
Andere Pods im Cluster können jetzt curl http://my-service machen.
K8s DNS löst das auf die Service-IP auf.
Praxisroutine
In der Praxis lernst du Service (K8s), indem du mit einem kleinen, kontrollierten Beispiel beginnst. Baue zuerst einen Minimalfall, prüfe das Ergebnis, veraendere genau eine Sache und beobachte, was sich ändert. Notiere dir Eingabe, Aktion, Ausgabe und typischen Fehler.
Übung: Erstelle ein Beispiel aus deinem Alltag, fuehre den Ablauf gedanklich Schritt für Schritt durch und markiere die Stelle, an der du Feedback oder ein Log brauchst. Wenn du diese Stelle benennen kannst, verstehst du den Begriff praktisch.
1. Kube-Proxy & Iptables
Der Service ist kein "Prozess". ps aux zeigt keinen "Service".
Es ist nur eine Iptables-Regel auf jedem Node!
Der kube-proxy schreibt Regeln:
"Wenn Paket an Service-IP geht -> Würfel zufällig einen Pod aus der Liste -> DNAT zur Pod-IP."
Das ist extrem schnell (Kernel-Space), aber schwer zu debuggen.
Modern: IPVS (IP Virtual Server) statt Iptables für große Cluster (>1000 Services), weil Iptables bei vielen Regeln langsam wird (O(n)).
2. Endpoints Objekt
Der Service speichert nicht selbst, welche Pods dazu gehören.
Dafür gibt es das Endpoints Objekt.
Service Name -> Endpoints Name -> Liste von IPs (10.1.0.5, 10.1.2.3).
Wenn ein Pod Ready ist, fügt der Endpoint-Controller die IP zur Liste hinzu.
Wenn er crasht, nimmt er sie raus.
Experten-Hack: Du kannst einen Service ohne Selector bauen und das Endpoints-Objekt manuell füllen (z. B. um auf eine externe DB außerhalb des Clusters zu zeigen).
3. Headless Services
Manchmal will der Client kein LoadBalancing.
Er will alle Pod-IPs wissen (z. B. Cassandra Cluster, wo jeder Node wichtig ist).
Setze clusterIP: None im YAML.
DNS my-service liefert jetzt nicht eine Service-IP, sondern eine Liste ("A Records") von allen Pod-IPs.
Client kann sich verbinden ("Client-Side Load Balancing").
1. IPVS Mode vs. Iptables Mode
Wie oben erwähnt, wird die Magie meist durch iptables gelöst. Dort ist die Performance jedoch O(n) – je mehr Regeln, desto länger sucht das Paket nach dem Ausgang.
Im IPVS Mode (IP Virtual Server) nutzt Kubernetes einen echten Layer-4 Load Balancer im Kernel.
Vorteil: Er nutzt Hash-Tabellen (O(1) Performance). Egal ob 10 oder 10.000 Services, die Geschwindigkeit bleibt fast identisch. Zudem unterstützt IPVS komplexere Load-Balancing Algorithmen wie Least-Connection (schicke das Paket an den Pod, der gerade am wenigsten zu tun hat), während Iptables meist nur stures Round-Robin (Zufall) kann.
2. Hairpin Mode & Local Traffic Policy
Ein klassisches Problem: Pod A möchte über den Service auf sich selbst zugreifen (Loopback).
In manchen Netzwerk-Setups blockt die Firewall das, weil das Paket "raus" geht und sofort wieder "rein" will. Kubernetes aktiviert dafür den Hairpin Mode (oder Promiscuous Mode am Bridge-Interface), damit Pakete die Kurve kriegen.
Ein weiteres wichtiges Feature ist externalTrafficPolicy: Local.
Normalerweise schickt die Service-IP das Paket an irgendeinen Pod im ganzen Cluster (ggf. über das Netzwerk auf einen anderen Node). Bei Local verwirft der Node das Paket, wenn auf ihm selbst kein passender Pod läuft. Das erhält die Quell-IP des Nutzers (Source IP Preservation), die sonst durch das SNAT des Clusters verloren ginge.
3. Service Discovery via Environment Variables
Bevor K8s DNS (CoreDNS) zum Standard wurde, war die einzige Art, einen Service zu finden, über Umgebungsvariablen.
Kubernetes injiziert in jeden Pod beim Start Variablen wie MY_BACKEND_SERVICE_HOST und MY_BACKEND_SERVICE_PORT.
Problem: Das funktioniert nur, wenn der Service vor dem Pod erstellt wurde. Wenn du den Service löschst und neu erstellst, hat der laufende Pod veraltete Variablen. Deshalb ist heute DNS der de-facto Standard, aber du findest diese "Geister-Variablen" immer noch in fast jedem Pod-Log, wenn du env tippst.
Quick-Check
Service vs Ingress?
Service ist Layer 4 (TCP/UDP). Er versteht keine URLs. Ingress ist Layer 7 (HTTP) und sitzt vor den Services. Ingress routet nach Hostname, Service routet nach Label.Session Affinity?
Standardmäßig ist Round-Robin (Zufall). MitsessionAffinity: ClientIPkannst du erzwingen, dass User X immer beim gleichen Pod landet ("Sticky Session"). Wichtig für alte Apps mit lokalem Session Storage.Service Mesh?
Ersetzt den klassischenkube-proxyService oft durch intelligente Sidecars (Envoy). Damit gehen Canary Releases ("5% Traffic an v2") und Retries, was normale Services nicht können.