- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes Ingress 502, 503, 504 Errors: Gateway Troubleshooting Guide
TL;DR
- 502 Bad Gateway: Der Ingress Controller erreicht das Backend nicht -- Pod gecrasht, falscher Port oder Service-Selector stimmt nicht.
- 503 Service Unavailable: Kein einziger Endpoint verfuegbar -- Deployment skaliert auf 0, Readiness Probe schlaegt fehl oder Label-Mismatch.
- 504 Gateway Timeout: Backend antwortet zu langsam -- Timeout-Annotations erhoehen oder Backend-Performance optimieren.
- Debugging-Reihenfolge: Endpoints pruefen, Ingress-Controller-Logs lesen, Annotations validieren.
- Nginx Ingress Controller ist der haeufigste -- die meisten Beispiele hier beziehen sich darauf.
Ingress-Fehler: Was passiert eigentlich?
Ein Kubernetes Ingress leitet externen Traffic an Services weiter. Zwischen dem Client und Ihrem Pod liegen mindestens drei Komponenten: der Ingress Controller (meist Nginx), der Kubernetes Service und die Pods dahinter. Jede dieser Schichten kann Fehler verursachen.
Die HTTP-Statuscodes 502, 503 und 504 kommen dabei nicht von Ihrer Anwendung, sondern vom Ingress Controller selbst. Er meldet damit, dass er das Backend nicht erreichen kann oder keine Antwort bekommt.
Client */} Ingress Controller */} Service */} Endpoints */} Pod
502/503/504
kommen von hier
502 Bad Gateway: Backend nicht erreichbar
Was 502 bedeutet
Der Ingress Controller hat versucht, die Anfrage an das Backend weiterzuleiten, aber die Verbindung ist fehlgeschlagen. Das Backend hat die Verbindung abgelehnt, geschlossen oder eine ungueltige Antwort gesendet.
Die haeufigsten Ursachen
1. Pod ist gecrasht oder startet gerade neu
# Pruefen, ob Pods laufen
kubectl get pods -l app=my-backend -n production
# Typische Ausgabe bei Problem:
# NAME READY STATUS RESTARTS AGE
# my-backend-5d4f8b-x9k2l 0/1 CrashLoopBackOff 5 8m
Wenn der Pod in CrashLoopBackOff ist, hilft kein Ingress-Tuning. Beheben Sie zuerst den Pod-Crash.
2. Falscher containerPort oder Service-Port
Ein klassischer Fehler: Der Service zeigt auf Port 80, aber der Container lauscht auf Port 8080.
# Service-Konfiguration pruefen
kubectl get svc my-backend -n production -o yaml
apiVersion: v1
kind: Service
metadata:
name: my-backend
spec:
selector:
app: my-backend
ports:
- protocol: TCP
port: 80 # Service-Port (hier kommt der Ingress an)
targetPort: 8080 # Container-Port (muss zum Pod passen!)
Vergleichen Sie den targetPort mit dem containerPort im Deployment:
kubectl get deployment my-backend -n production -o jsonpath='{.spec.template.spec.containers[0].ports[0].containerPort}'
# Muss 8080 ergeben
3. Backend sendet ungueltige HTTP-Antwort
Wenn Ihr Backend gRPC, WebSocket oder ein anderes Protokoll spricht, muss der Ingress Controller das wissen:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-backend-ingress
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-backend
port:
number: 50051
502 Debugging-Workflow
# 1. Endpoints pruefen -- gibt es ueberhaupt Backend-Pods?
kubectl get endpoints my-backend -n production
# Erwartete Ausgabe: mindestens eine IP:Port Kombination
# NAME ENDPOINTS AGE
# my-backend 10.244.1.5:8080,10.244.2.3:8080 5d
# 2. Direkt zum Pod verbinden (umgeht Ingress)
kubectl port-forward svc/my-backend 8080:80 -n production
# Dann in einem zweiten Terminal:
curl http://localhost:8080/health
# 3. Ingress-Controller-Logs pruefen
kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx --tail=50
In den Nginx-Ingress-Logs sehen Sie bei 502 typischerweise:
upstream prematurely closed connection while reading response header from upstream
oder:
connect() failed (111: Connection refused) while connecting to upstream
503 Service Unavailable: Keine Endpoints
Was 503 bedeutet
Der Ingress Controller kennt den Service, aber es gibt keinen einzigen verfuegbaren Endpoint. Das heisst: Kein Pod ist bereit, Traffic zu empfangen.
Die haeufigsten Ursachen
1. Label-Mismatch zwischen Service und Deployment
Der haeufigste Grund fuer 503 Errors. Der Service-Selector findet keine Pods, weil die Labels nicht uebereinstimmen.
# Service-Selector anzeigen
kubectl get svc my-backend -n production -o jsonpath='{.spec.selector}'
# Ausgabe: {"app":"my-backend"}
# Pods mit diesem Label suchen
kubectl get pods -l app=my-backend -n production
# Wenn hier "No resources found" steht, stimmt der Selector nicht
# Alle Labels der Pods anzeigen
kubectl get pods -n production --show-labels | grep backend
2. Readiness Probe schlaegt fehl
Pods laufen, aber die Readiness Probe meldet "nicht bereit". Kubernetes entfernt diese Pods aus den Endpoints.
# Pod-Status pruefen
kubectl describe pod my-backend-5d4f8b-x9k2l -n production | grep -A 10 "Readiness"
# Typische Readiness-Probe-Konfiguration
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
Wenn der Health-Endpoint /health nicht existiert oder einen Fehler zurueckgibt, bleibt der Pod dauerhaft "not ready":
# Readiness manuell testen
kubectl exec my-backend-5d4f8b-x9k2l -n production -- curl -s http://localhost:8080/health
Mehr zu Health-Check-Konfiguration finden Sie im Artikel zu Liveness und Readiness Probes.
3. Deployment auf 0 Replicas skaliert
Manchmal trivial, aber leicht zu uebersehen:
kubectl get deployment my-backend -n production
# NAME READY UP-TO-DATE AVAILABLE AGE
# my-backend 0/0 0 0 5d
Passiert haeufig durch versehentliches kubectl scale oder einen Autoscaler, der auf 0 skaliert hat.
4. Namespace-Mismatch
Der Ingress verweist auf einen Service in einem anderen Namespace. In Kubernetes sind Services namespace-spezifisch.
# Falsch: Service existiert nicht in diesem Namespace
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default # Ingress ist in 'default'
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-backend # Service muss auch in 'default' sein!
port:
number: 80
503 Debugging-Workflow
# 1. Endpoints pruefen (leer = Problem)
kubectl get endpoints my-backend -n production
# NAME ENDPOINTS AGE
# my-backend 5d <-- LEER! Keine Endpoints
# 2. Service-Selector mit Pod-Labels vergleichen
kubectl get svc my-backend -n production -o jsonpath='{.spec.selector}' && echo
kubectl get pods -n production --show-labels
# 3. Pod-Readiness pruefen
kubectl get pods -n production -l app=my-backend -o wide
# Spalte READY muss "1/1" zeigen
504 Gateway Timeout: Backend zu langsam
Was 504 bedeutet
Der Ingress Controller hat die Anfrage ans Backend weitergeleitet, aber innerhalb des konfigurierten Timeouts keine Antwort bekommen. Der Standard-Timeout bei Nginx Ingress ist 60 Sekunden.
Die haeufigsten Ursachen
1. Backend braucht zu lange
Aufwendige Datenbankabfragen, externe API-Aufrufe oder rechenintensive Operationen koennen dazu fuehren, dass das Backend laenger als 60 Sekunden braucht.
# Direkt zum Backend verbinden und Antwortzeit messen
kubectl exec -it debug-pod -n production -- curl -w "\nTotal: %{time_total}s\n" -o /dev/null -s http://my-backend:80/slow-endpoint
2. Timeout-Annotations zu niedrig
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-backend-ingress
annotations:
# Timeout fuer das Senden der Anfrage ans Backend
nginx.ingress.kubernetes.io/proxy-send-timeout: "120"
# Timeout fuer das Lesen der Antwort vom Backend
nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
# Timeout fuer die Verbindung zum Backend
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-backend
port:
number: 80
Fuer Long-Running-Requests (z.B. Datei-Uploads, Report-Generierung) muessen Sie die Timeouts entsprechend erhoehen.
3. Keepalive-Probleme
Wenn das Backend Verbindungen schliesst, bevor der Ingress Controller es erwartet, koennen Timeouts entstehen:
annotations:
nginx.ingress.kubernetes.io/upstream-keepalive-connections: "32"
nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "60"
4. Resource-Limits zu niedrig (CPU Throttling)
Wenn das Backend CPU-throttled wird, antwortet es langsamer. Das kann zu 504-Fehlern fuehren. Pruefen Sie die Performance Ihres Clusters und die Resource-Limits der Backend-Pods.
# CPU-Throttling pruefen
kubectl top pods -n production -l app=my-backend
504 Debugging-Workflow
# 1. Aktuelle Timeout-Konfiguration pruefen
kubectl get ingress my-backend-ingress -n production -o yaml | grep -A 5 annotations
# 2. Backend-Antwortzeit messen
kubectl run debug-curl --image=curlimages/curl --rm -it --restart=Never -- \
curl -w "Connect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s http://my-backend.production.svc.cluster.local:80/
# 3. Ingress-Controller-Logs auf Timeout-Meldungen pruefen
kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx --tail=100 | grep "504\|upstream timed out"
Ingress-Controller-Logs richtig lesen
Die Logs des Ingress Controllers sind die wichtigste Informationsquelle. So aktivieren Sie detailliertere Logs:
# Log-Level erhoehen (temporaer)
kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx -o name | head -1) \
-n ingress-nginx -- /nginx-ingress-controller --v=3
Fuer dauerhafte Aenderungen passen Sie das Helm-Chart an:
# values.yaml fuer Nginx Ingress Helm Chart
controller:
config:
# Detaillierte Access-Logs mit Upstream-Infos
log-format-upstream: '$remote_addr - $request_id [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id'
Die wichtigsten Felder in den Logs:
| Feld | Bedeutung |
|---|---|
$upstream_status | HTTP-Status vom Backend (leer = keine Verbindung) |
$upstream_response_time | Antwortzeit des Backends in Sekunden |
$upstream_addr | IP:Port des Backends, an das weitergeleitet wurde |
$status | HTTP-Status, den der Client bekommt |
Health Checks fuer den Ingress Controller selbst
Nicht nur Ihre Backends brauchen Health Checks. Pruefen Sie auch den Ingress Controller:
# Ingress-Controller-Health pruefen
kubectl get pods -n ingress-nginx
kubectl top pods -n ingress-nginx
# Ingress-Controller-Konfiguration validieren
kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx -o name | head -1) \
-n ingress-nginx -- cat /etc/nginx/nginx.conf | grep upstream -A 10
Wenn der Ingress Controller selbst ueberlastet ist (zu viele Connections, zu wenig CPU/Memory), kann er ebenfalls 502/503-Fehler werfen:
# Resource Limits fuer den Ingress Controller
controller:
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: "1"
memory: 512Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 70
Annotations-Referenz: Die wichtigsten Nginx-Ingress-Settings
annotations:
# Timeouts
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
# Body Size (wichtig fuer Uploads)
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
# Retry-Verhalten
nginx.ingress.kubernetes.io/proxy-next-upstream: "error timeout"
nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "3"
# Rate Limiting
nginx.ingress.kubernetes.io/limit-rps: "50"
# SSL-Redirect
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# Custom Error Pages
nginx.ingress.kubernetes.io/custom-http-errors: "502,503,504"
nginx.ingress.kubernetes.io/default-backend: error-pages
Checkliste: Ingress Troubleshooting in 5 Minuten
Verwenden Sie diese Checkliste, wenn ein Ingress-Fehler auftritt:
# Schritt 1: Welcher Fehlercode?
curl -I https://app.example.com
# Schritt 2: Ingress-Objekt pruefen
kubectl get ingress -n production
kubectl describe ingress my-ingress -n production
# Schritt 3: Service und Endpoints pruefen
kubectl get svc -n production
kubectl get endpoints -n production
# Schritt 4: Pod-Status pruefen
kubectl get pods -n production -l app=my-backend
# Schritt 5: Ingress-Controller-Logs
kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx --tail=50
# Schritt 6: Direkte Verbindung zum Backend testen
kubectl port-forward svc/my-backend -n production 8080:80
Wenn der Fehler bei der direkten Verbindung (Schritt 6) auch auftritt, liegt das Problem im Backend. Wenn er nur ueber den Ingress auftritt, liegt es an der Ingress-Konfiguration.
Praeventive Massnahmen
Um Ingress-Fehler von vornherein zu vermeiden:
- Readiness Probes richtig konfigurieren: Nur Pods, die tatsaechlich bereit sind, sollten Traffic bekommen.
- PodDisruptionBudgets setzen: Verhindern, dass zu viele Pods gleichzeitig weg sind.
- Graceful Shutdown implementieren: Ihre Anwendung sollte laufende Requests vor dem Beenden abschliessen.
- Monitoring einrichten: Alerting auf 5xx-Raten am Ingress, bevor Nutzer sich beschweren.
# PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-backend-pdb
namespace: production
spec:
minAvailable: 1
selector:
matchLabels:
app: my-backend
Fuer umfassendes Monitoring empfehlen wir den Artikel zu Kubernetes Monitoring und Observability.
Verwandte Artikel
- Kubernetes CrashLoopBackOff Troubleshooting -- Wenn Ihre Backend-Pods crashen
- Kubernetes Service nicht erreichbar -- Netzwerkprobleme innerhalb des Clusters
- Kubernetes Monitoring und Observability -- Ingress-Metriken ueberwachen
- Kubernetes Network Policies -- Wenn Netzwerkregeln den Traffic blockieren
- Kubernetes OOMKilled Troubleshooting -- Wenn Backend-Pods wegen Speichermangel sterben
Haben Sie wiederkehrende Ingress-Probleme oder komplexe Routing-Anforderungen? Unser Team unterstuetzt Sie beim Debugging und der Optimierung Ihrer Kubernetes-Netzwerkinfrastruktur. Kontaktieren Sie uns fuer eine kostenlose Erstberatung.
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 keine Adresse zugewiesen: Lösung
Kubernetes Ingress zeigt keine Address? Ursachen und Lösungen für fehlende IngressClass, nicht installierte Controller und Pending LoadBalancer.
API Gateway für Kubernetes: Nginx, Kong, Traefik
Kubernetes API Gateways im Vergleich: Nginx Ingress, Kong und Traefik mit Feature-Matrix, Installations-Aufwand und Gateway API HTTPRoute-Beispielen.
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.