Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

A Pod marked Running or even Ready does not prove that an application request can reach its destination. Debug the complete path—from client to Service, EndpointSlice, target Pod, application, and dependency—and use evidence at each layer to narrow down the cause. EndpointSlices show which backends Kubernetes associates with a Service; they do not establish that traffic forwarding or the application itself works.

This guide uses a Flask-and-PostgreSQL project on a local multi-node kind cluster as a learning example. Its author describes deliberately reproducing failures so they can be observed, diagnosed, and recovered from. The project is explicitly a demonstration, not a production deployment. Project description.

What EndpointSlices tell you—and what they do not

A Service can have a ClusterIP and still have no usable backends. EndpointSlices help you check the backend side of that relationship: for a selector-based Service, the control plane creates slices containing references to matching Pods. They track backend IP addresses and are a source of truth for kube-proxy’s internal routing.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Kubernetes Documentation describes EndpointSlices as “the mechanism that Kubernetes uses to let your Service scale to handle large numbers of backends, and allows the cluster to update its list of healthy backends efficiently.” The API has been stable since Kubernetes v1.21. The Kubernetes documentation selector showed v1.37 when the page was accessed on 2026-10-07; check documentation for the version running in your cluster. Kubernetes: EndpointSlices.

A populated EndpointSlice is useful evidence, but it is not an end-to-end connectivity test. Traffic can still fail because of a port mismatch, forwarding or network trouble, an application error, or a dependency problem. Corroborate slice state with Pod details, events, node status, and application-level observations.

Trace the request path in order

In the project example, the reported request path is client → flask-app-svc → Flask → postgres-svc → PostgreSQL. A separate PVC represents PostgreSQL persistence. The author reports two Flask replicas and one PostgreSQL replica; those are details of this example, not recommended production requirements. Project description.

  1. Start with the failing observation. Record what the client sees, which request fails, and whether the failure is consistent. A successful connection to one object does not establish that later steps work.
  2. Inspect the Service and its EndpointSlices. Check that the Service exists and that slices associate it with the expected backend Pods. Kubernetes’ debugging guide recommends kubectl get endpointslices -l kubernetes.io/service-name=<service-name> when investigating a Service. Replace the placeholder with the actual Service name. Kubernetes: Debug Services.
  3. Check the target Pod and its events. Use kubectl describe pods <name> to inspect Pod state and recent events. Look for probe failures, scheduling messages, restarts, and other evidence tied to the symptom. Kubernetes: Debug Pods.
  4. Check the application and its dependency separately. Determine whether Flask responds when reached directly, then examine whether it can connect to PostgreSQL. A Flask response that reports a database failure points to a different layer than a request that cannot reach the Flask Pod.
  5. Make the smallest fix supported by the evidence, then repeat the same observation. Confirm not only that an object changed state, but that the original failed request now succeeds.

Kubernetes’ debugging guidance starts with triage: decide whether the issue appears to involve Pods, a controller, or a Service, then inspect the relevant object’s state and evidence. The question to keep asking is: What evidence proves where the failure actually is?

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use observations to distinguish common failure hypotheses

Observation What it supports What it does not prove Useful next check
Service exists and has a ClusterIP The Service object is present. That it has usable backends or that requests reach the application. Inspect its EndpointSlices and selector.
No expected backend appears in the EndpointSlices The Service currently lacks the expected associated endpoints. Why they are absent; possible causes include a selector mismatch or Pods not eligible for traffic. Compare the Service selector with Pod labels, then inspect Pod state and events.
Endpoints appear, but Service traffic fails The Service has associated backend endpoint state. That forwarding, port mapping, application handling, or dependencies work. Check Service targetPort, Pod ports, direct connectivity where appropriate, and application behavior.
Pod is Pending The Pod has not been scheduled to run. That resource shortage is the cause. Inspect Pod events and scheduler messages for the reason.
Pod is Running The Pod has reached the Running phase. That the application is healthy or can serve requests. Check probe state, application response, and dependency connectivity.
Readiness fails The container is not currently considered ready to accept traffic. That restarting the process will fix the cause. Inspect the readiness endpoint, events, and any dependency it checks.

The project author reports exercising selector mismatches and incorrect targetPort settings, among other failure classes. These are reported project scenarios, not independently verified tests. Project description.

Choose probes for the question they answer

Startup, readiness, and liveness probes serve different purposes. Kubernetes Documentation states: “Readiness probes determine when a container is ready to accept traffic.” A failed readiness probe causes the EndpointSlice controller to remove that Pod IP from matching Service EndpointSlices. Startup probes can delay liveness and readiness checks until startup succeeds; liveness probes determine when Kubernetes should restart a container. Kubernetes: Container probes.

  • Startup: Has this application finished initializing?
  • Readiness: Should this instance receive Service traffic now?
  • Liveness: Should Kubernetes restart this container?

The example project reports a startup probe and readiness probe at /health, plus a liveness probe at /. Its intent is to let a PostgreSQL problem make Flask unready without automatically treating that dependency failure as a reason to restart Flask. That is the author’s design choice, not a universal configuration: probes should reflect the application’s behavior and the consequences of failure.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Follow the evidence across other failure classes

The project description reports exercises involving ConfigMap values and keys, PostgreSQL availability and authentication, memory enforcement and OOMKilled, CPU throttling, ResourceQuota rejection, taint-related scheduling problems, node failures, hostPath limitations, PVCs stuck in Pending because of StorageClass configuration, and RBAC or identity. It also recounts an infrastructure incident involving a NotReady worker, an unreachable-node taint, a failed worker container, and internal DNS trouble. These are claims reported by the project author, not independently verified tests. Project description.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use the same reasoning pattern for each: symptom → observation → hypothesis → evidence → decisive evidence → root cause → smallest correct fix → verification. For example, a Pending Pod is a scheduling state, not a diagnosis; scheduler events help distinguish causes. A bound PVC establishes a storage binding state, not that backups exist or can be restored. A dependency outage need not trigger a process restart if the application’s readiness and liveness checks are intentionally separate.

What the example demonstrates—and its limits

The author reports rerunning the documented procedure in an isolated namespace. The reported result included two Ready kind nodes, a bound postgres-pvc, successful PostgreSQL and Flask rollouts, populated EndpointSlices, and an application response of {"database":"connected","status":"healthy"}, recorded as PASS. This is the author’s reproduction report, not an independent rerun. Project description.

The project is explicitly labeled “Demonstration / learning project. NOT production-deployed.” It reports one PostgreSQL replica, no database failover, untested backup and restore, resource values that are unmeasured local baselines, and no centralized logs, distributed tracing, or automated alerting. The author identifies managed or highly available PostgreSQL, tested backups and restores, measured resource tuning, stronger secret and supply-chain controls, production networking, and observability as future work—not completed capabilities. Project description.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.