12 KiB
Executable File
Inhaltsverzeichnis
- Grundkonzepte
- Schritt 1: Welche Endpoints gibt es?
- Schritt 2: Endpoint-Konfiguration prüfen
- Schritt 3: Endpoint erreichbar machen
- Troubleshooting
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 erreichbarNodePort: Von außen über Port am Node erreichbarLoadBalancer: 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 normalPending: ⏳ Pod startet geradeCrashLoopBackOff: ❌ 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:
- Kubernetes erstellt einen Tunnel von Ihrem PC zum Service
- Sie können nun auf
http://localhost:8585zugreifen - 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:
- ✅ Ingress ist konfiguriert (siehe Schritt 2.1)
- ✅ DNS-Eintrag existiert
- ✅ 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)
- Load Balancer IP/Hostname finden:
kubectl get ingress <ingress-name> -n <namespace>
Notieren Sie die ADDRESS (z.B. xxx.elb.amazonaws.com)
- Load Balancer IP auflösen:
nslookup xxx.elb.amazonaws.com
-
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
- Datei öffnen als Administrator:
-
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:
- Load Balancer URL finden:
kubectl get ingress <ingress-name> -n <namespace>
- 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:
- DNS testen:
nslookup <hostname> - Falls DNS fehlt → Port-Forwarding verwenden (Methode 1)
- 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
-
Namespace finden:
kubectl get namespaces -
Ingress prüfen:
kubectl get ingress -n <namespace> -
Port-Forwarding starten:
kubectl port-forward -n <namespace> svc/<service-name> 8585:8585 -
Im Browser öffnen:
http://localhost:8585
Das war's! 🎉
Weitere Ressourcen
Erstellt am: {{ date:2026-02-10 }}
Workspace: gitops