Veröffentlicht am

Ingress ohne Address: Controller und Class

Teilen:
Authors

Ingress ohne Address: Controller, Class, LoadBalancer

TL;DR

Die Spalte ADDRESS am Ingress bleibt leer, wenn kein Controller das Objekt übernimmt. Das Backend kann gesund sein. Zuerst Klasse und Controller:

kubectl get ingress INGRESS -o wide
kubectl get ingressclass
kubectl get pods -A | grep -i ingress

Keine IngressClass, oder spec.ingressClassName zeigt auf eine Klasse ohne Controller: ADDRESS bleibt leer. Der Controller läuft, ADDRESS bleibt leer, und sein Service ist Pending: dann hat der LoadBalancer keine externe IP. Das ist der nächste Fehler, nicht ein falscher Pfad. Pod-Status der Anwendung: Pod startet nicht.

Wer das Objekt besitzen soll

Ein Ingress-Objekt tut allein nichts. Ein Controller (nginx, Traefik, der Cloud-Ingress) watched die API und schreibt die Address, sobald er eine IP oder einen Hostnamen hat.

ingressClassName muss eine existierende Klasse nennen. kubectl get ingressclass zeigt CONTROLLER pro Klasse. Fehlt die Klasse, ignoriert jeder Controller das Objekt, außer einer ist als Default markiert (ingressclass.kubernetes.io/is-default-class: "true"). Zwei Controller ohne Default und ein Ingress ohne Klasse: keiner fühlt sich zuständig. Die Address bleibt leer, Events am Ingress sagen das oft in einem Satz.

Die Annotation kubernetes.io/ingress.class ist der alte Weg. Sie gilt nicht zusätzlich zu einem widersprüchlichen ingressClassName. Ein Wert, eine Klasse.

Controller-Pod und sein Service

Der Controller-Pod muss Running sein. Sonst ist das ein normaler Pod-Fehler: CrashLoop, ImagePull oder Pending im Namespace des Controllers, häufig ingress-nginx.

Läuft er, hat sein Service vom Typ LoadBalancer eine externe IP?

kubectl get svc -A | grep -i ingress

EXTERNAL-IP <pending> heißt: die Cloud hat keinen LoadBalancer angelegt, oder auf Bare Metal fehlt MetalLB beziehungsweise ein gesetzter host ohne externe Vergabe. Dann bekommt auch der Ingress keine Address. Auf einem Cluster ohne Cloud-Integration bleibt LoadBalancer pending, bis etwas die IP vergibt. Das ist kein Timeout, der sich auswächst.

Manchen Controllern reicht eine NodePort-Adresse. Sie schreiben dann eine Node-IP oder gar nichts in ADDRESS, und der Zugriff läuft über den NodePort. Leer ist in dem Setup kein Defekt, solange der Controller-Log sagt, dass er den Ingress geladen hat.

Address da, und trotzdem 404

Das ist nicht mehr dieses Problem. Die Address steht, der Controller antwortet, der Pfad oder der Service-Name stimmt nicht. kubectl describe ingress INGRESS zeigt Backend und Events wie no object matches oder einen Service ohne Endpoints. Ein Service ohne ready Pods liefert 503 vom Controller, nicht eine leere Address.

Quellen

📖 Verwandte Artikel

Weitere interessante Beiträge zu ähnlichen Themen