38 Services and Pod Networking

38.1 Einführung

In Kubernetes sind Services und das Pod-Netzwerk grundlegende Konzepte, die die Kommunikation innerhalb eines Clusters ermöglichen. Services abstrahieren den Zugang zu Pods und ermöglichen eine stabile und belastbare Verbindung zwischen den Komponenten einer Anwendung. Diese Übersicht behandelt die verschiedenen Service-Typen und deren Konfiguration sowie die zugrunde liegende Pod-Netzwerkstruktur.

38.2 Pod-Netzwerk

Jeder Pod in Kubernetes erhält eine eigene IP-Adresse und kann über diese IP-Adresse kommunizieren. Das Kubernetes-Netzwerkmodell stellt sicher, dass:

  1. Jeder Pod hat eine einzigartige IP-Adresse: Pods können direkt miteinander kommunizieren, ohne NAT (Network Address Translation) verwenden zu müssen.
  2. Alle Pods können sich gegenseitig erreichen: Jeder Pod kann mit jedem anderen Pod im Cluster kommunizieren, unabhängig davon, auf welchem Knoten (Node) er sich befindet.
  3. Kommunikation erfolgt direkt über IP-Adressen: Anwendungen müssen keine speziellen Netzwerkproxies oder Übersetzungsdienste verwenden, um miteinander zu kommunizieren.

38.3 Services

Services abstrahieren den Zugang zu einer Gruppe von Pods und bieten eine stabile IP-Adresse und DNS-Namen. Dies ermöglicht es Anwendungen, Pods nahtlos zu erreichen, auch wenn sich deren zugrunde liegende IP-Adressen ändern.

38.3.1 Service-Typen

  1. ClusterIP: Der Standardtyp eines Services. Er stellt eine interne IP-Adresse im Cluster bereit, die nur innerhalb des Clusters zugänglich ist.

    Beispiel:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-clusterip-service
      namespace: default
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
  2. NodePort: Dieser Service-Typ macht einen Service über eine bestimmte Portnummer auf jeder Node im Cluster zugänglich. Dies ermöglicht den externen Zugriff auf den Service.

    Beispiel:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nodeport-service
      namespace: default
    spec:
      type: NodePort
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          nodePort: 30001
  3. LoadBalancer: Dieser Service-Typ konfiguriert einen externen Load Balancer (z. B. von einem Cloud-Provider bereitgestellt), um den Traffic zu den Pods zu verteilen.

    Beispiel:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-loadbalancer-service
      namespace: default
    spec:
      type: LoadBalancer
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
  4. ExternalName: Dieser Service-Typ leitet Anfragen durch einen DNS-Namen an einen externen Dienst weiter.

    Beispiel:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-externalname-service
      namespace: default
    spec:
      type: ExternalName
      externalName: my.database.example.com

38.4 Service Discovery

Kubernetes bietet integrierte Mechanismen zur Service-Discovery, die es Pods ermöglichen, andere Services im Cluster zu finden. Jeder Service erhält einen DNS-Namen, den Pods verwenden können, um darauf zuzugreifen.

DNS-Namensschema:

<service_name>.<namespace>.svc.cluster.local

38.5 Endpoint Management

Services in Kubernetes verwalten eine dynamische Liste von Endpunkten (Endpoints), die die IP-Adressen der Pods enthalten, die zum Service gehören. Diese Endpunkte werden automatisch aktualisiert, wenn Pods erstellt oder entfernt werden.

38.6 Beispiele für Networking

Erstellen eines ClusterIP-Services:

apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
  namespace: default
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Erstellen eines NodePort-Services:

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30001

Erstellen eines LoadBalancer-Services:

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
  namespace: default
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Kubernetes-Services und das zugrunde liegende Pod-Netzwerkmodell bieten eine leistungsstarke und flexible Architektur zur Verwaltung der Kommunikation innerhalb eines Clusters. Durch die Verwendung von Services können Anwendungen stabil und effizient miteinander kommunizieren, unabhängig von der dynamischen Natur der Pods. Ein tiefes Verständnis dieser Konzepte ist entscheidend für den erfolgreichen Betrieb und die Skalierung von Kubernetes-Anwendungen.