What it means: Envoy picked a backend, but the connection failed or was reset before any response headers arrived.
Free online tool — HTTP status code checker: instant results, no signup.
Requests the address and shows the status code and what the server sends back.
Envoy's router builds this body when an upstream request ends before the backend sent response headers. In the current source the string is assembled as upstream connect error or disconnect/reset before headers. , then retried and the latest if retries happened, then reset reason: and the reason, and optionally , transport failure reason: with the low-level detail (router.cc). A typical response:
HTTP/1.1 503 Service Unavailable
server: envoy
upstream connect error or disconnect/reset before headers. reset reason: remote connection failure, transport failure reason: delayed connect error: Connection refusedThe status is 503, except when the reset reason is protocol error, which gives 502. Unlike no healthy upstream, Envoy did choose a host and tried to talk to it. Older Envoy releases printed shorter reasons such as reset reason: connection failure; the meaning is the same. Operators can hide the transport detail with the runtime flag envoy.reloadable_features.hide_transport_failure_reason_in_response_body, so the tail may be missing.
The reason strings come from Http::Utility::resetReasonToString() (utility.cc); the access log flag is set from the same reason.
| Reset reason | Access log flag | Usual cause |
|---|---|---|
remote connection failure, local connection failure | UF | TCP connect refused or failed: the app is not listening on that port, the pod is restarting, a NetworkPolicy blocks it |
connection timeout | UF | No answer to the connect within connect_timeout (5 s if not set): firewall drops, wrong IP, overloaded node |
connection termination | UC | The backend closed the connection: crash, a keep-alive connection closed by the app as Envoy reused it, TLS rejected by the server |
remote reset, remote refused stream reset | UR | The backend sent a TCP RST or an HTTP/2 stream reset |
overflow | UO | Envoy's own circuit breaker (max connections or pending requests) was full |
protocol error | UPE | The backend spoke a different protocol than configured: HTTP/1 to an HTTP/2 cluster, plain text to a TLS cluster, malformed headers |
The transport failure reason narrows it further: an errno text such as Connection refused means nothing listens; a TLS error string means certificate, SNI or protocol mismatch between the proxy and the backend.
127.0.0.1 inside the pod is invisible to traffic arriving on the pod IP in some setups. Bind to 0.0.0.0.kubectl get svc reviews -o jsonpath='{.spec.ports}' must match containerPort.connection termination or a TLS transport reason.appProtocol. A port named http in front of a gRPC or HTTP/2-only server produces protocol error.connection termination on low traffic is the signature.kubectl exec deploy/productpage -c istio-proxy -- curl -sv http://reviews:9080/ 2>&1 | tail -5kubectl exec deploy/reviews -c reviews -- ss -ltn
# State Recv-Q Send-Q Local Address:Port
# LISTEN 0 128 0.0.0.0:9080 A port bound to 127.0.0.1, or a different port, explains connection failure.istioctl x describe pod REVIEWS_POD shows the effective mTLS mode and DestinationRule; for TLS to an external backend test the handshake: openssl s_client -connect 203.0.113.10:443 -servername api.example.com -brief </dev/null.grpc or http2, or set appProtocol, when the backend speaks HTTP/2.common_http_protocol_options.idle_timeout on the cluster).connection termination.for i in $(seq 1 50); do curl -s -o /dev/null -w '%{http_code}\n' https://example.com/api/; done | sort | uniq -c
# 50 200Intermittent cases need volume: fifty requests without a single 503 is a better test than one. In the access log the UF, UC or UPE flags must stop appearing for the cluster. For the public address, the HTTP status checker shows the status code and body the proxy returns.
HTTP status codes are three-digit numbers that the server returns for every request. They tell the browser and search crawlers what happened: success, redirect, or error.
Enter a code or keyword — instant result with description.
1xx Informational, 2xx Success, 3xx Redirect, 4xx Client Error, 5xx Server Error.
For each code: typical causes and concrete steps to resolve.
How each code affects indexing and link juice transfer in Google.
choosing correct status
redirect optimization
5xx error diagnostics
landing page check
HTTP monitor alerts when response code changes or 5xx appears.
Sign up freeEnvoy could not open a TCP connection to the chosen backend: nothing listened on that address and port, or the connect failed. Newer releases print remote connection failure or local connection failure for the same case.
Envoy returns 502 when the reset reason is protocol error and 503 for the other reset reasons.
A retry policy was active, Envoy retried the request, and every attempt failed. The reason shown is the one from the last attempt.
Intermittent cases usually come from a keep-alive race, where the backend closes an idle connection just as Envoy reuses it, or from pods restarting during a rollout.
It can be. A plain-text client hitting a STRICT mTLS workload, or double TLS between a DestinationRule and the app, ends the connection before headers. istioctl x describe pod shows the effective policy.
Free plan — 10 monitors, checks every 5 min, no card required. Upgrade for 1-minute interval and multi-region monitoring.