NetworkPolicy silently drops the traffic, the client uses the wrong address or port, or a Node-level routing problem breaks the path. Start with the error string: connection refused points at the Service and its Endpoints, while connection timed out points at a NetworkPolicy or a wrong target. CKS uses Cilium as its container network interface (CNI), and Cilium replaces kube-proxy for in-cluster Service load balancing. You configure Services, Endpoints, and NetworkPolicy. CoreWeave manages the underlying data plane.
What you see
Most pod-to-service failures surface as one of four errors when a client Pod attempts to connect to a Service. The error string indicates which layer to check first.| Error string | What it usually means |
|---|---|
connection refused | The destination is reachable but actively rejects the connection. On CKS this most often means the Service has no Ready backends, so the data plane returns a REJECT. |
connection timed out / i/o timeout | Packets are dropped silently before a reply returns. This is the signature of a NetworkPolicy blocking the traffic, or a wrong address or port. |
no route to host | A routing or Node-level network problem. The client can’t find a path to the destination address at all. |
Insufficient or 0/N nodes are available (at schedule time) | Not a connectivity error. The Pod never started, so it has no network yet. Resolve the scheduling problem first, then return to this page once the Pod is Running. For the symptom index, see Troubleshoot networking. |
connection refused means a reachable host said no, while connection timed out means the packets vanished. Refused points at the Service and its backends. Timed out points at a NetworkPolicy or a wrong target.
First three checks
Run these read-only checks in order. They resolve most pod-to-service tickets.1. Confirm the client Pod has an IP and is Running
Pending or ContainerCreating, hasn’t joined the network yet. Resolve the scheduling or startup problem before testing connectivity.
2. Confirm the target Service has Endpoints
An emptyEndpoints list is the single most common cause of connection refused. When a ClusterIP Service has no Ready backend Pods, the CKS data plane issues a REJECT, which surfaces to the client as connection refused, not a timeout.
<none> or an empty endpoints set, check two things:
- Are the backend Pods Ready? A failing readiness probe removes a Pod from
Endpoints. Runkubectl get pods -n [NAMESPACE] -l [SELECTOR]and confirm theREADYcolumn shows all containers ready. - Does the Service selector match the Pod labels? A typo in
spec.selectorproduces a Service with zero Endpoints. Comparekubectl get svc [SERVICE-NAME] -n [NAMESPACE] -o jsonpath='{.spec.selector}'against the Pod labels.
3. Check for a NetworkPolicy in the namespace
Aconnection timed out between Pods that should be allowed to communicate usually means a NetworkPolicy (or CiliumNetworkPolicy) drops the traffic.
100.124.0.0/18 (Kubernetes API and platform services) and DNS egress to node-local-dns rather than kube-dns. Both are common causes of a connection timed out to a Service that should be reachable. For the exact rules and a full default-deny example, see Cilium network policy on CKS and Deploy network policies.
It works in-cluster but not externally
If acurl from inside the cluster succeeds but an external client fails, the problem isn’t your Service or its backends. Use this discriminator:
curl http://[LOADBALANCER-IP]:[PORT] from your laptop.
| In-cluster | External | Diagnosis |
|---|---|---|
| Fails | Fails | Application or Service problem. Re-run the first three checks. |
| Works | Fails | External reachability problem. Confirm the Service requested a public IP. If the public IP is still unreachable, open a ticket. This isn’t a customer-side fix. |
| Fails | Works | Unusual. Most often an Endpoints or selector mismatch on the internal path. |
LoadBalancer Service receives an internet-facing IP only when you request public addressing. Without it, the Service receives a private address reachable only from inside the cluster or a connected VPC. See Choose public or private addressing and Get a publicly routable IP for your LoadBalancer Service.
What this is not
Consider the following points:- This isn’t a DNS problem if your client connects successfully to a Service IP but fails on a Service name. For name resolution failures, see Troubleshoot DNS resolution from a Pod.
connection refusedisn’t a firewall block. Firewalls andNetworkPolicydrops produce timeouts, not refusals. A refusal means a reachable host rejected the connection, most often an emptyEndpointsset.- You don’t need to inspect or tune the CNI data plane.
When to open a ticket
Open a support ticket in any of these situations:- An in-cluster
curlto the Service IP works but the external client still can’t reach a publicLoadBalancerIP after you confirmed thepublicannotation. - You see intermittent
connection refusedto an internalLoadBalancervirtual IP that you can’t tie to an emptyEndpointsset. - Connectivity fails with
no route to hostfor traffic that has noNetworkPolicyin the path.