>DevOps Interview KB

How does a Service-not-routing-traffic failure mode differ between a plain ClusterIP Service and one fronted by an Ingress controller?

IntermediateComparisonConceptualKubernetes7 min read

Short Answer

A plain ClusterIP Service's routing failure is fully explained by Service-to-Pod mechanics (selector, Endpoints, readiness). An Ingress-fronted setup adds an entire additional hop with its own failure surface — the Ingress controller must correctly parse the Ingress resource, route matching external requests to the right Service, and often perform its own separate health/backend checks — meaning "traffic isn't reaching my Pods" now needs to be diagnosed at two potentially-independent layers: is the Ingress controller successfully routing to the Service at all, and separately, is the Service correctly routing to the Pods.

Detailed Explanation

A plain ClusterIP Service's job is narrow and well-understood: match Pods by label selector, populate an Endpoints (or EndpointSlice) object with those Pods' IPs (only Ready ones, by default), and let kube-proxy program the actual traffic-forwarding rules from the Service's virtual IP to those Pod IPs. A failure here is fully diagnosable within that narrow scope — a selector mismatch, no Ready Pods, or a kube-proxy/networking issue.

Adding an Ingress controller in front introduces a genuinely separate system with its own configuration and failure surface, sitting before traffic ever reaches the Service. The Ingress controller reads Ingress resources (host/path routing rules) and is responsible for correctly matching incoming external requests to the right backend Service — meaning failures can now originate purely at this layer, with the Service and its Pods being completely healthy: an Ingress resource with an incorrect backend.service.name or port, a missing or misconfigured ingressClassName causing no controller to pick up the resource at all, a TLS/certificate misconfiguration blocking the request before routing even happens, or a host/path rule that simply doesn't match the request being sent. Many Ingress controllers (nginx-ingress, for instance) also perform their own upstream health checking somewhat independent of Kubernetes' own readiness-based Endpoints population, adding yet another layer where "the Ingress controller thinks this backend is unhealthy" could be a distinct problem from "the Service's Endpoints are actually correct."

The practical troubleshooting difference: for a plain Service, you're debugging one system (Service → Endpoints → Pods). For an Ingress-fronted Service, you need to isolate which layer is actually failing first — testing the Service directly (bypassing the Ingress, e.g. via kubectl port-forward to the Service or a test Pod curling the Service's ClusterIP directly) confirms whether the Service-to-Pod layer is healthy independent of the Ingress; if that layer works but external traffic through the Ingress still fails, the investigation shifts entirely to the Ingress controller's own logs, its resource configuration, and its specific implementation's routing/health-check behavior — a genuinely different investigation with different tools than the plain-Service case.

Interview Follow-Up Questions

  • How would you test a Service directly, bypassing the Ingress layer entirely, to isolate which layer is actually failing?
  • What's different about troubleshooting an Ingress-fronted Service when using a cloud-managed Ingress controller (like AWS ALB Ingress Controller) versus a self-hosted one like nginx-ingress?
  • How does Gateway API change this picture compared to the older Ingress resource model?

Key Takeaways

  • A plain ClusterIP Service's routing failure is fully explained within Service-to-Pod mechanics (selector, Endpoints, readiness).
  • An Ingress controller adds a separate layer with its own failure surface — resource misconfiguration, missing ingressClassName, TLS issues, and often its own independent backend health checking.
  • Isolating which layer is failing (test the Service directly, bypassing Ingress) is the key troubleshooting step that a plain-Service investigation doesn't need.
  • Different Ingress controller implementations (nginx-ingress, ALB Ingress Controller, etc.) have their own specific configuration quirks and log locations worth knowing for the specific one in use.

References

Last updated August 21, 2026 · Last reviewed August 21, 2026