Kubernetes (kind) pod cannot resolve service in another namespace (DNS not working)

Summary

Cross-namespace service resolution failed in a Kind Kubernetes cluster due to missing DNS configuration for cross-namespace lookups. Pods in the prod namespace could not resolve the svc-test service in the test namespace despite valid services and endpoints.

Root Cause

The issue stemmed from CoreDNS not being configured to handle cross-namespace DNS queries by default in Kind clusters. Kind’s lightweight nature omits certain DNS configurations, leading to unresolved service names across namespaces.

Why This Happens in Real Systems

  • Kind Cluster Limitations: Kind prioritizes simplicity over feature completeness, often excluding advanced DNS configurations.
  • Namespace Isolation: Kubernetes namespaces are designed to isolate resources, and DNS resolution across namespaces requires explicit configuration.
  • CoreDNS Configuration: CoreDNS needs additional setup to recognize and resolve cross-namespace service names.

Real-World Impact

  • Service Unavailability: Pods unable to resolve services in other namespaces lead to application failures.
  • Debugging Overhead: Engineers spend time diagnosing DNS issues instead of focusing on application logic.
  • Deployment Delays: Cross-namespace dependencies halt deployment pipelines until DNS issues are resolved.

Example or Code (if necessary and relevant)

# Updated CoreDNS ConfigMap to enable cross-namespace resolution
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health {
            lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
            max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

How Senior Engineers Fix It

  1. Update CoreDNS ConfigMap: Modify the CoreDNS configuration to include cross-namespace resolution.
  2. Restart CoreDNS Pods: Force CoreDNS pods to reload the updated configuration.
  3. Verify DNS Resolution: Test cross-namespace service resolution using dig or curl from affected pods.
  4. Document Configuration: Ensure DNS configuration is documented and included in cluster setup scripts.

Why Juniors Miss It

  • Assumption of Default Behavior: Juniors assume Kubernetes handles cross-namespace DNS resolution out of the box.
  • Lack of DNS Knowledge: Limited understanding of how CoreDNS and Kubernetes DNS interact.
  • Overlooking Kind Limitations: Failure to recognize Kind’s stripped-down nature compared to production clusters.

Leave a Comment