Files
it-know-how/web und cloud gedoens/Kubernetes Endpoints finden und erreichen - Anleitung für Einsteiger.md
T
2026-03-27 12:58:01 +01:00

12 KiB
Executable File

Inhaltsverzeichnis


Grundkonzepte

Was ist ein Endpoint?

Ein Endpoint ist eine URL, über die Sie auf eine Anwendung in Kubernetes zugreifen können (z.B. https://jupyterhub.example.com oder http://localhost:8080).

Wichtige Kubernetes-Komponenten

1. Pod

  • Ein Pod ist die kleinste Einheit in Kubernetes
  • Enthält einen oder mehrere Container (z.B. Ihre Anwendung)
  • Hat eine interne IP-Adresse im Cluster
  • Befehl: kubectl get pods -n <namespace>

2. Service

  • Ein Service ist eine stabile Zugangsadresse zu einem oder mehreren Pods
  • Macht Pods innerhalb des Clusters erreichbar
  • Typen:
    • ClusterIP: Nur innerhalb des Clusters erreichbar
    • NodePort: Von außen über Port am Node erreichbar
    • LoadBalancer: Erstellt einen externen Load Balancer (z.B. bei AWS)
  • Befehl: kubectl get svc -n <namespace>

3. Ingress

  • Ein Ingress ist die "Haustür" zu Ihren Services von außerhalb des Clusters
  • Ermöglicht HTTP/HTTPS-Zugriff über Domainnamen (z.B. app.example.com)
  • Benötigt einen Ingress Controller (z.B. Nginx)
  • Befehl: kubectl get ingress -n <namespace>

4. Namespace

  • Ein Namespace ist wie ein Ordner in Kubernetes
  • Trennt verschiedene Anwendungen oder Teams
  • Beispiele: openmetadata, jupyterhub, default

Schritt 1: Welche Endpoints gibt es?

1.1 Alle Namespaces auflisten

kubectl get namespaces

Erklärung: Zeigt alle Namespaces in Ihrem Cluster. Hier finden Sie, wo Ihre Anwendungen laufen.

Beispiel-Output:

NAME                STATUS   AGE
default             Active   30d
jupyterhub          Active   20d
openmetadata        Active   5d
argocd              Active   25d

1.2 Anwendungen in einem Namespace finden

# Pods (laufende Anwendungen)
kubectl get pods -n openmetadata

# Services (Zugriffspunkte)
kubectl get svc -n openmetadata

# Ingress (externe Zugänge)
kubectl get ingress -n openmetadata

Wichtig: Ersetzen Sie openmetadata mit Ihrem Namespace!

Beispiel-Output:

# Pods
NAME                            READY   STATUS    RESTARTS   AGE
openmetadata-559bf987f6-gxkdk   1/1     Running   0          4d20h

# Services
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
openmetadata   ClusterIP   172.20.25.201   <none>        8585/TCP,8586/TCP   4d20h

# Ingress
NAME           CLASS   HOSTS                           ADDRESS                  PORTS     AGE
openmetadata   nginx   openmetadata.dma.aai-dfine.de   xxx.elb.amazonaws.com   80, 443   4d20h

1.3 Alle Ingress-Endpoints im Cluster

kubectl get ingress --all-namespaces

Erklärung: Zeigt ALLE konfigurierten externen Zugänge über alle Namespaces hinweg.


Schritt 2: Endpoint-Konfiguration prüfen

2.1 Detaillierte Ingress-Informationen

kubectl describe ingress <ingress-name> -n <namespace>

Beispiel:

kubectl describe ingress openmetadata -n openmetadata

Was Sie hier sehen:

  • Hosts: Der Domainname (z.B. openmetadata.dma.aai-dfine.de)
  • TLS: Ob HTTPS konfiguriert ist und welches Zertifikat verwendet wird
  • Backends: Zu welchem Service und Port der Ingress weiterleitet
  • Address: Der tatsächliche Load Balancer

Beispiel-Output:

Name:             openmetadata
Namespace:        openmetadata
Address:          aa83990c7ad3548c4b0e28680b0952ba-1924426268.eu-central-1.elb.amazonaws.com
Ingress Class:    nginx
TLS:
  aai-dfine-certificate-tls terminates openmetadata.dma.aai-dfine.de
Rules:
  Host                           Path  Backends
  ----                           ----  --------
  openmetadata.dma.aai-dfine.de  /     openmetadata:8585 (10.10.1.86:8585)

2.2 Pod-Status überprüfen

kubectl get pods -n <namespace>

Status-Bedeutungen:

  • Running: Pod läuft normal
  • Pending: Pod startet gerade
  • CrashLoopBackOff: Pod startet immer wieder neu (Fehler!)
  • Error: Pod hat einen Fehler

2.3 Service-Details

kubectl get svc <service-name> -n <namespace> -o wide

Zeigt: ClusterIP, Ports, Selectors (welche Pods werden angesprochen)


Schritt 3: Endpoint erreichbar machen

Es gibt drei Methoden, um auf einen Kubernetes-Endpoint zuzugreifen:

Methode 1: Port-Forwarding (Empfohlen für Tests)

Wann nutzen?

  • Schneller Zugriff für Tests
  • DNS ist nicht konfiguriert
  • Lokale Entwicklung

Vorteile:

  • Keine Cluster-Änderungen
  • Sicher (nur für Sie erreichbar)
  • Sofort verfügbar
  • Keine DNS-Konfiguration nötig

Nachteile:

  • Terminal muss offen bleiben
  • Nur von Ihrem PC erreichbar

Befehl:

kubectl port-forward -n <namespace> svc/<service-name> <lokaler-port>:<service-port>

Beispiel für OpenMetadata:

kubectl port-forward -n openmetadata svc/openmetadata 8585:8585

Was passiert:

  1. Kubernetes erstellt einen Tunnel von Ihrem PC zum Service
  2. Sie können nun auf http://localhost:8585 zugreifen
  3. Der Tunnel leitet alle Anfragen an den Service im Cluster weiter

Zugriff:

http://localhost:8585

Beenden: Ctrl + C im Terminal

Tipp: Im Hintergrund laufen lassen:

# Windows PowerShell
Start-Process kubectl -ArgumentList "port-forward -n openmetadata svc/openmetadata 8585:8585" -WindowStyle Hidden

Methode 2: Über Ingress mit DNS (Produktiv-Umgebung)

Wann nutzen?

  • Produktiv-Zugriff
  • Mehrere Nutzer
  • HTTPS/TLS erforderlich

Voraussetzungen:

  1. Ingress ist konfiguriert (siehe Schritt 2.1)
  2. DNS-Eintrag existiert
  3. TLS-Zertifikat ist vorhanden

2.1 DNS-Auflösung testen

# Windows PowerShell
nslookup openmetadata.dma.aai-dfine.de

# Alternative
Resolve-DnsName openmetadata.dma.aai-dfine.de

Wenn DNS funktioniert:

Server:  dns.google
Address:  8.8.8.8

Name:    openmetadata.dma.aai-dfine.de
Address:  54.xxx.xxx.xxx

Wenn DNS NICHT funktioniert:

*** dns.google kann openmetadata.dma.aai-dfine.de nicht finden: Non-existent domain

2.2 Problem: DNS funktioniert nicht

Lösung A: Lokale Hosts-Datei (temporär für Tests)

  1. Load Balancer IP/Hostname finden:
kubectl get ingress <ingress-name> -n <namespace>

Notieren Sie die ADDRESS (z.B. xxx.elb.amazonaws.com)

  1. Load Balancer IP auflösen:
nslookup xxx.elb.amazonaws.com
  1. Windows Hosts-Datei bearbeiten:

    • Datei öffnen als Administrator: C:\Windows\System32\drivers\etc\hosts
    • Zeile hinzufügen:
    <IP-Adresse>    openmetadata.dma.aai-dfine.de
    
    • Speichern
  2. Im Browser öffnen:

    https://openmetadata.dma.aai-dfine.de
    

Lösung B: DNS-Eintrag erstellen lassen (dauerhaft)

Jemand mit AWS Route53-Zugriff muss einen DNS-Eintrag erstellen:

  • Typ: CNAME oder A-Record
  • Name: openmetadata.dma.aai-dfine.de
  • Ziel: Load Balancer Hostname/IP

Methode 3: Direkt zum Load Balancer (ohne DNS)

Wenn vorhanden:

  1. Load Balancer URL finden:
kubectl get ingress <ingress-name> -n <namespace>
  1. Direkt mit curl testen:
curl -H "Host: openmetadata.dma.aai-dfine.de" http://<load-balancer-url>

Hinweis: Funktioniert nicht immer im Browser (Host-Header erforderlich)


Troubleshooting

Problem: "Hmmm... can't reach this page" / ERR_NAME_NOT_RESOLVED

Ursache: DNS-Name kann nicht aufgelöst werden

Lösung:

  1. DNS testen: nslookup <hostname>
  2. Falls DNS fehlt → Port-Forwarding verwenden (Methode 1)
  3. Oder: Hosts-Datei editieren (Methode 2, Lösung A)

Problem: Port-Forwarding schlägt fehl

Fehlermeldung: Unable to listen on port 8585

Ursache: Port ist bereits belegt

Lösung:

# Anderen lokalen Port verwenden
kubectl port-forward -n openmetadata svc/openmetadata 9999:8585

# Dann öffnen: http://localhost:9999

Problem: Pod läuft nicht (Status: CrashLoopBackOff)

Logs anschauen:

kubectl logs <pod-name> -n <namespace>

# Letzte 100 Zeilen
kubectl logs <pod-name> -n <namespace> --tail=100

# Vorheriger Container (wenn Pod neu gestartet wurde)
kubectl logs <pod-name> -n <namespace> --previous

Problem: 502 Bad Gateway / 503 Service Unavailable

Ursache: Service erreicht den Pod nicht

Prüfen:

# 1. Läuft der Pod?
kubectl get pods -n <namespace>

# 2. Sind Endpoints vorhanden?
kubectl get endpoints <service-name> -n <namespace>

# 3. Service-Details
kubectl describe svc <service-name> -n <namespace>

Problem: Authentifizierung erforderlich

Wenn Login-Seite erscheint:

Standard-Credentials suchen:

# Secrets auflisten
kubectl get secrets -n <namespace>

# Secret anschauen (Werte sind base64-kodiert)
kubectl get secret <secret-name> -n <namespace> -o yaml

# Secret dekodieren
kubectl get secret <secret-name> -n <namespace> -o jsonpath='{.data.password}' | base64 -d

Beispiel OpenMetadata:

  • Standard-User: admin
  • Standard-Password: admin

Nützliche Befehle - Cheat Sheet

Übersicht verschaffen

# Alle Namespaces
kubectl get namespaces

# Alles in einem Namespace
kubectl get all -n <namespace>

# Alle Ingress-Endpoints
kubectl get ingress --all-namespaces

Status prüfen

# Pods mit mehr Details
kubectl get pods -n <namespace> -o wide

# Pod-Logs live verfolgen
kubectl logs -f <pod-name> -n <namespace>

# In Pod einloggen (für Debugging)
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash

Konfiguration anschauen

# YAML eines Ingress
kubectl get ingress <name> -n <namespace> -o yaml

# Service-Details
kubectl describe svc <name> -n <namespace>

# ConfigMap auslesen
kubectl get configmap <name> -n <namespace> -o yaml

Port-Forwarding

# Standard
kubectl port-forward -n <namespace> svc/<service-name> <local-port>:<service-port>

# Zu einem Pod (falls Service nicht existiert)
kubectl port-forward -n <namespace> <pod-name> <local-port>:<container-port>

# Alle Interfaces binden (auch im Netzwerk erreichbar)
kubectl port-forward --address 0.0.0.0 -n <namespace> svc/<service> 8585:8585

Best Practices

Für Tests und Entwicklung

Port-Forwarding verwenden

  • Schnell, sicher, keine Änderungen am Cluster

Für Produktiv-Zugriff

Ingress mit DNS verwenden

  • Korrekte DNS-Einträge erstellen lassen
  • TLS/HTTPS konfigurieren
  • Basic Auth oder OAuth für Authentifizierung

Sicherheit

⚠️ Nie direkt auf Pods zugreifen in Produktion ⚠️ Immer über Services routen ⚠️ Port-Forwarding nicht dauerhaft laufen lassen


Glossar

Begriff Erklärung
Cluster Die gesamte Kubernetes-Umgebung mit allen Maschinen
Node Eine einzelne Maschine (VM) im Cluster
Pod Kleinste Einheit, enthält Container mit Ihrer App
Service Stabiler Zugriffspunkt zu einem oder mehreren Pods
Ingress HTTP/HTTPS-Zugang von außen, wie ein Router
Namespace Logische Trennung/Ordner für Anwendungen
ConfigMap Konfigurationsdaten (nicht-sensitiv)
Secret Sensible Daten (Passwörter, Tokens) - base64-kodiert
Load Balancer Verteilt Traffic auf mehrere Pods (z.B. AWS ELB)
TLS/SSL Verschlüsselung für HTTPS
Port-Forward Tunnel von lokalem PC zu Kubernetes-Service

Zusammenfassung

Quick Start: Auf Anwendung zugreifen

  1. Namespace finden:

    kubectl get namespaces
    
  2. Ingress prüfen:

    kubectl get ingress -n <namespace>
    
  3. Port-Forwarding starten:

    kubectl port-forward -n <namespace> svc/<service-name> 8585:8585
    
  4. Im Browser öffnen:

    http://localhost:8585
    

Das war's! 🎉


Weitere Ressourcen


Erstellt am: {{ date:2026-02-10 }} Workspace: gitops