The Problem
I deployed an app on Kubernetes, and everything looked fine.
- Pods were in Running state
- No restarts
- No obvious errors
But when I tried to access the app, nothing worked.
- Requests timed out
- Curl just hung
- No response at all
At first, it looked like a networking issue.
What Looked Correct But Was Not
At a glance:
- Pods were running
- Containers were up
- Ports were defined
But the application was not reachable.
This is where it gets confusing.
Kubernetes shows Pods as Running, but that does not mean they are ready to receive traffic.
In my case, I assumed the app was working because the Pods were not crashing, but that turned out to be wrong.
This turned out to be a simple issue, but it is easy to miss because Kubernetes does not surface it clearly.
What Is Not Obvious
A Pod being in Running state only means the container is running.
It does not mean:
- The application inside is ready
- The port is actually listening
- Traffic can reach it
Kubernetes only routes traffic to Pods that are Ready, not just Running.
That is why Pods can look fine while requests still fail.
If your Service has no endpoints, it will not route traffic at all. In that case, check why your Kubernetes Service has no endpoints before debugging anything else.
Example of the Issue
Here is what I saw:
kubectl get pods
Output:
NAME READY STATUS RESTARTS AGE
my-app 0/1 Running 0 2m
Key detail:
READY shows zero out of one, which means the Pod is not ready to receive traffic.
What Actually Fixed It
The issue was a failing readiness probe.
readinessProbe:
httpGet:
path: /health
port: 3000
The problem was simple:
- The health endpoint did not exist
- Kubernetes kept marking the Pod as not ready
After fixing it:
readinessProbe:
httpGet:
path: /
port: 3000
Now:
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-app-xyz 1/1 Running 0 3m
Traffic started working immediately.
In my case, I initially ignored readiness because the container was running, which was the wrong assumption.
How This Actually Works
Kubernetes separates Running and Ready states.
- Running means the container is up
- Ready means the Pod can receive traffic
Only Ready Pods are added to Service endpoints.
If a Pod is not Ready:
- It will not receive traffic
- Even if everything else looks correct
This is why Services may exist but still not route traffic.
How I Verified the Issue
These checks made it clear.
kubectl get pods
Look at the READY column.
kubectl describe pod my-app
Check readiness probe status.
kubectl get endpoints my-service
See if the Pod is included.
If the Pod is missing from endpoints, it is not ready.
Other Reasons Pods Are Not Reachable
Even if readiness is configured, other issues can cause the same problem.
Application Not Listening on the Expected Port
If your app is not listening on the port you expect, traffic will fail even if routing is correct.
Port Mismatch
If container port and Service target port do not match, requests go nowhere.
Slow Startup
If the app takes time to initialize, readiness may fail temporarily and block traffic.
Network Policies
Traffic may be blocked by cluster network rules.
Service Issues
Wrong selector or missing endpoints can also cause reachability issues.
Common Mistakes
- Assuming Running means working
- Ignoring the READY column
- Misconfigured readiness probes
- Wrong health check path
- Debugging networking too early
Most of the time, this is a readiness or configuration issue, not networking.
Assuming networking is broken when the Service is not connected to any Pods. This often happens when the Service has no endpoints.
When to Use This
Use this when:
- Pods are running but not responding
- Requests time out
- Service exists but traffic fails
- Ingress returns errors
Final Takeaway
A Pod being Running does not mean it is ready.
Most reachability issues come from readiness probes or configuration mismatches.
If your Pods are not reachable, check readiness before anything else.