Ingress High 5xx

!!! danger "Severity: Critical" Target response: 5 min. The cluster ingress / load balancer is returning 5xx responses at a high rate. User traffic is failing at the edge.

What this alert means

sum(rate(nginx_ingress_controller_requests{status=~"5.."}[5m]))
/
sum(rate(nginx_ingress_controller_requests[5m]))
> 0.05

(Adjust metric names for your ingress controller — traefik, contour, ALB, etc.)

5xx at the ingress means the LB or ingress controller couldn't successfully proxy the request to an upstream pod. Different from app-level 5xx — this is the gateway saying "I couldn't reach a backend."

Quick diagnostics

Three commands to run before reading further:

# WHERE: shell with kubectl context set. Assumes ingress-nginx;
#   adjust namespace + selector if you run Traefik, HAProxy,
#   Contour, or another controller.
# WHAT: last 200 log lines from the ingress controller pods,
#   filtered to lines containing a 4xx or 5xx response code.
# READ: each line shows the request that errored, including
#   upstream and error message. Common patterns:
#     "no live upstreams" → all backend pods unhealthy
#     "upstream timed out" → backend slow, not dead
#     "connect() failed (111: Connection refused)" → backend pod
#       unreachable on configured port (deploy mismatch, NetworkPolicy)
#     "client closed connection" → benign user behavior
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --tail=200 | grep -E "[45][0-9]{2}"
# WHERE: shell with kubectl context set.
# WHAT: every Service in every namespace + its Endpoints. The
#   ENDPOINTS column lists actual pod IP:port pairs.
# READ: a service with ENDPOINTS=<none> has no Ready pods backing
#   it — all requests routed there return 503 at ingress. Common
#   cause: pod readiness probe failing, or deployment scaled to 0.
#   Cross-reference with the failing ingress hostname to find the
#   right service.
kubectl get endpoints -A | grep -v "<none>"
# WHERE: Grafana → Explore (Prometheus data source) or Prometheus /graph.
# WHAT: per-ingress 5xx rate over 5 min from nginx-ingress-controller's
#   request counter.
# READ: nonzero result for a specific ingress = that hostname is
#   the failing one. Convert to a RATIO for a better signal —
#   raw rate misleads on low-traffic services:
#     sort_desc(
#       sum by (ingress) (rate(nginx_ingress_controller_requests{status=~"5.."}[5m]))
#       /
#       sum by (ingress) (rate(nginx_ingress_controller_requests[5m]))
#     )
sum by (ingress) (rate(nginx_ingress_controller_requests{status=~"5.."}[5m]))

Severity & urgency

Severity Pager? Target response Business impact
Critical Yes 5 min Edge-level failures — user-visible regardless of which service was the target

Diagnostic steps

1. Identify which backend

TODO — break the 5xx rate down by ingress / service label.

2. Are the backends healthy?

kubectl get endpoints -n <namespace> <service-name>

3. Ingress controller logs

TODO — kubectl logs -n <ingress-namespace> <ingress-controller-pod> and look for backend timeouts / connection refused.

4. Ingress controller resource pressure

TODO — kubectl top pod -n <ingress-namespace>. Is the controller itself CPU/memory starved?

Common causes & fixes

A. Backend service has no Ready endpoints

Symptom Fix
kubectl get endpoints returns empty See Service Endpoint Down

B. Backend slow → ingress timeouts

Symptom Fix
Ingress logs show "upstream timed out" See High API Latency. Consider raising timeout temporarily.

C. Ingress controller resource exhaustion

Symptom Fix
Ingress pod itself OOMKilling or CPU-throttled Scale the ingress deployment; tune limits

D. SSL/TLS handshake failures

Symptom Fix
5xx with TLS errors in logs See Certificate Expiring Soon

Escalation

  1. Platform on-call@platform-oncall.
  2. Network team — if LB-level (cloud provider's LB).