- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes Ingress keine Adresse zugewiesen: Lösung
TL;DR
Ein Ingress ohne zugewiesene Adresse hat fast immer eine von drei Ursachen: kein Ingress Controller installiert, die IngressClass fehlt oder ist falsch gesetzt, oder der zugehörige LoadBalancer Service hängt im Status Pending. Prüfen Sie zuerst mit kubectl get ingressclass, ob eine IngressClass existiert.
Sie haben eine Ingress-Ressource erstellt, aber kubectl get ingress zeigt eine leere ADDRESS-Spalte:
NAME CLASS HOSTS ADDRESS PORTS AGE
my-app nginx app.example.de 80 15m
Das bedeutet: Kein Controller hat diesen Ingress verarbeitet. Die Ressource existiert in der API, aber niemand tut etwas damit. Hier die systematische Fehlersuche.
Schritt 1: Ist ein Ingress Controller installiert?
Das klingt banal, ist aber die häufigste Ursache. Kubernetes liefert keinen Ingress Controller mit -- Sie müssen ihn selbst installieren.
# Prüfen ob ein Ingress Controller läuft
kubectl get pods -A | grep -i ingress
# IngressClasses anzeigen
kubectl get ingressclass
Wenn kubectl get ingressclass nichts zurückgibt, fehlt der Controller komplett. Installation mit Helm:
# NGINX Ingress Controller installieren
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
Nach der Installation sollte eine IngressClass nginx existieren:
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 2m
Schritt 2: IngressClass prüfen und zuweisen
Ab Kubernetes 1.18 muss jeder Ingress eine IngressClass angeben. Ohne sie weiß kein Controller, dass er zuständig ist.
Variante A: IngressClass im Ingress Manifest setzen
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
spec:
ingressClassName: nginx # Das ist der Schlüssel
rules:
- host: app.example.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
Variante B: Default IngressClass definieren
Wenn Sie nur einen Controller haben, markieren Sie seine IngressClass als Default:
kubectl annotate ingressclass nginx \
ingressclass.kubernetes.io/is-default-class=true
Damit wird jeder Ingress ohne explizite ingressClassName automatisch von diesem Controller verarbeitet.
Häufiger Fehler: Alte Annotation statt ingressClassName
Viele Tutorials verwenden noch die veraltete Annotation:
# VERALTET - funktioniert nicht mehr zuverlässig
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
Nutzen Sie stattdessen immer das Feld spec.ingressClassName. Die Annotation wird seit Kubernetes 1.22 nicht mehr offiziell unterstützt.
Schritt 3: LoadBalancer Service prüfen
Der Ingress Controller erstellt einen Service vom Typ LoadBalancer. Wenn dieser keine externe IP bekommt, kann der Ingress keine Adresse zuweisen.
# Service des Ingress Controllers prüfen
kubectl get svc -n ingress-nginx
| Status EXTERNAL-IP | Bedeutung | Lösung |
|---|---|---|
<pending> | Cloud-LB wird nicht erstellt | Cloud-Provider Integration prüfen |
<none> | Kein LoadBalancer-Support | MetalLB installieren (Bare Metal) |
| IP-Adresse vorhanden | Controller sollte funktionieren | Ingress-Konfiguration prüfen |
Pending auf Bare Metal lösen
Auf Bare-Metal-Clustern gibt es keinen Cloud-Provider, der LoadBalancer-IPs zuweist. MetalLB schließt diese Lücke:
# MetalLB installieren
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
# IP-Pool konfigurieren
cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.210
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
EOF
Pending in der Cloud lösen
In AWS, GCP oder Azure bedeutet Pending meist ein Berechtigungsproblem. Der Cloud Controller Manager braucht IAM-Rechte, um LoadBalancer zu erstellen.
# Events des Service prüfen
kubectl describe svc ingress-nginx-controller -n ingress-nginx
# Typische Fehlermeldungen:
# "Error creating load balancer (will retry): failed to ensure load balancer for service"
# "Insufficient permissions to create ELB"
Prüfen Sie die IAM-Rolle des Node- oder Controller-ServiceAccounts und stellen Sie sicher, dass die nötigen Berechtigungen vorhanden sind (z.B. elasticloadbalancing:* in AWS).
Schritt 4: Controller Logs auswerten
Wenn IngressClass und LoadBalancer stimmen, liegt das Problem oft im Ingress Manifest selbst:
# Controller-Logs prüfen
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller --tail=100
# Nach dem spezifischen Ingress filtern
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller \
| grep "my-app"
Häufige Fehler in den Logs:
| Fehlermeldung | Ursache | Lösung |
|---|---|---|
service "my-app" not found | Backend-Service existiert nicht | Service im richtigen Namespace erstellen |
error obtaining endpoints | Service hat keine Endpoints | Pod-Labels und Service-Selector abgleichen |
invalid path | Ungültiger Pfad oder pathType | pathType auf Prefix oder Exact prüfen |
Schritt 5: End-to-End Validierung
Wenn die Adresse zugewiesen wurde, testen Sie die gesamte Kette:
# Ingress hat jetzt eine Adresse?
kubectl get ingress my-app
# DNS-Auflösung testen
nslookup app.example.de
# Direkt über die Ingress-IP testen
curl -H "Host: app.example.de" http://<INGRESS-IP>/
# TLS prüfen (wenn konfiguriert)
curl -v https://app.example.de 2>&1 | grep "SSL certificate"
FAQ
Brauche ich für jeden Namespace einen eigenen Ingress Controller?
Nein. Ein Ingress Controller kann Ingress-Ressourcen aus allen Namespaces verarbeiten. Sie können aber mit --watch-namespace einschränken, welche Namespaces er überwacht.
Warum zeigt mein Ingress eine IP, aber die Seite lädt nicht?
Die Adresse bedeutet nur, dass der Controller den Ingress verarbeitet hat. Prüfen Sie, ob der Backend-Service Endpoints hat (kubectl get endpoints my-app) und ob die Pods tatsächlich auf dem konfigurierten Port antworten.
Kann ich mehrere Ingress Controller gleichzeitig betreiben?
Ja, das ist ein gängiges Setup. Erstellen Sie verschiedene IngressClasses und weisen Sie jedem Ingress die passende zu. Typisch: einen internen und einen externen Controller.
Was ist der Unterschied zwischen Ingress und Gateway API?
Die Gateway API ist der Nachfolger von Ingress mit mehr Funktionen (Traffic-Splitting, Header-basiertes Routing). Für einfache HTTP-Weiterleitung reicht Ingress, bei komplexeren Anforderungen lohnt sich der Umstieg auf Gateway API.
Wenn Ihr Ingress-Setup komplexer wird oder Sie Unterstützung bei der Netzwerk-Architektur Ihres Clusters brauchen, helfen wir gerne -- Kontakt aufnehmen.
Weiterführende Artikel:
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Kubernetes Ingress 502, 503, 504 Fehler beheben
Ingress-Fehler systematisch lösen: 502 Bad Gateway, 503 Service Unavailable und 504 Timeout mit Ursachen, Debugging-Schritten und Fixes.
CoreDNS Debugging: Kubernetes-DNS Probleme lösen
DNS-Probleme in Kubernetes systematisch debuggen: CoreDNS-Logs, ndots-Konfiguration, NXDOMAIN-Fehler und Corefile-Optimierung für schnellere Auflösung.
Gateway API: Der neue Kubernetes Ingress Standard
Kubernetes Gateway API als moderner Ingress-Ersatz. GatewayClass, Gateway und HTTPRoute konfigurieren, Traffic Splitting und Header-basiertes Routing einrichten.
Kubernetes DNS Auflösung fehlgeschlagen: CoreDNS debuggen
Kubernetes DNS Auflösung fehlgeschlagen? Systematisches CoreDNS Debugging mit ndots, search domains und DNS Policy für schnelle Problemlösung.
CoreDNS Troubleshooting: Kubernetes DNS Probleme lösen
CoreDNS-Probleme systematisch debuggen: DNS-Auflösung testen, ndots konfigurieren, DNS-Policies verstehen und Performance optimieren.