Veröffentlicht am

Kubernetes Ingress keine Adresse zugewiesen: Lösung

Teilen:
Authors

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-IPBedeutungLösung
<pending>Cloud-LB wird nicht erstelltCloud-Provider Integration prüfen
<none>Kein LoadBalancer-SupportMetalLB installieren (Bare Metal)
IP-Adresse vorhandenController sollte funktionierenIngress-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:

FehlermeldungUrsacheLösung
service "my-app" not foundBackend-Service existiert nichtService im richtigen Namespace erstellen
error obtaining endpointsService hat keine EndpointsPod-Labels und Service-Selector abgleichen
invalid pathUngültiger Pfad oder pathTypepathType 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