- Authors

- Name
- Phillip Pham
- @ddppham
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
kubectl connection refused 6443 beheben
kubectl connection refused auf Port 6443: der API-Server antwortet nicht. kubeconfig, Kontext, Firewall, API-Prozess. Der Pod-Status kommt erst danach.
Error from server Forbidden: RBAC-Recht
kubectl Forbidden: Error from server (Forbidden) nennt User, Verb und Ressource. kubectl auth can-i zeigt das Recht, bevor jemand cluster-admin vergibt.
ContainerCreating hängt: Volume, Sandbox, CNI
ContainerCreating hängt: der Pod hat einen Node, der Container startet nicht. FailedMount, Pod-Sandbox und CNI stehen in den Events, nicht in den Logs.
CreateContainerConfigError: Secret und ConfigMap
CreateContainerConfigError: fehlendes Secret, falscher Key oder Namespace. Der Container startet nicht, logs --previous bleibt leer. Das Event nennt das Objekt.
Kubernetes DNS fehlgeschlagen: CoreDNS, ndots
Kubernetes DNS fehlgeschlagen: CoreDNS-Pods, das Service-ClusterIP und ndots:5. Wann ein Name im Cluster auflöst und wann die NetworkPolicy UDP 53 schluckt.
Exit Code 1: die erste Zeile im Previous-Log
Exit Code 1 auf Kubernetes: die Anwendung beendet sich selbst. kubectl logs --previous zeigt die Zeile. Speicher, Image-Pull und SIGKILL sind andere Codes.
Exit Code 143: SIGTERM und Graceful Shutdown
Exit Code 143 ist SIGTERM: 128 plus 15. Beim Rollout ist das normal. Im Loop fehlt ein Handler oder die Grace-Period ist kürzer als der Stopp der Anwendung.
Node NotReady: Kubelet, CNI und Conditions
Node NotReady: Conditions am Node lesen. Kubelet still, CNI nicht da, MemoryPressure oder DiskPressure. Pods auf diesem Node sind Symptom, nicht Ursache.