✦ For everyone, free.

Practical knowledge for real and everyday life

Home

Kubernetes Cross Namespace Service Discovery

Kubernetes Cross Namespace Service Discovery allows services to communicate across namespaces using DNS or service discovery, ensuring seamless cluster connectivity.

Kubernetes Cross Namespace Service Discovery refers to the specific practices and constraints involved when a workload in one namespace needs to locate and connect to a Service owned by a different namespace, a scenario that requires deliberate handling because the default short-name DNS resolution mechanism is scoped to the caller's own namespace and does not extend across namespace boundaries automatically.


Why Cross-Namespace Discovery Requires Explicit Handling

Namespace-Scoped Short Names

The DNS search path injected into every pod resolves short Service names against the pod's own namespace first, meaning a consumer in prod-search-indexer attempting to resolve ledger-api by short name alone would resolve against a Service named ledger-api inside its own namespace, if one exists, rather than the intended Service in prod-payments-ledger, or fail to resolve at all if no such Service exists locally.

curl http://ledger-api

This only works correctly when ledger-api exists in the caller's own namespace; it is not a valid way to reach a Service in another namespace.

Fully Qualified Names as the Correct Mechanism

Cross-namespace discovery is achieved by using the Service's fully qualified domain name, which explicitly encodes the target namespace, removing any ambiguity about which namespace's Service is being resolved.

curl http://ledger-api.prod-payments-ledger.svc.cluster.local

Network Policy Implications

Discovery Does Not Imply Reachability

Being able to resolve a Service's fully qualified name across namespaces does not guarantee the resulting connection will succeed; if a NetworkPolicy in the target namespace restricts ingress to specific source namespaces or pods, a technically resolvable Service can still reject the connection entirely, meaning cross-namespace discovery and cross-namespace access control are separate, independently configured layers.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-search-to-ledger
  namespace: prod-payments-ledger
spec:
  podSelector:
    matchLabels:
      app: ledger-api
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              team: search

Namespace Selector Labels as a Prerequisite

For a NetworkPolicy to selectively permit traffic from a specific consuming namespace, that namespace must carry a label the policy's namespaceSelector can match against, which is one of the reasons a consistent namespace labeling convention (as established by namespace organization practice) is a practical prerequisite for controlled cross-namespace discovery, not merely a nice-to-have.


Patterns for Managing Cross-Namespace Dependencies

Explicit Dependency Documentation

Because cross-namespace calls create an implicit coupling between otherwise independently owned namespaces, teams commonly document these dependencies explicitly — through annotations on the consuming Service, a dependency graph maintained outside the cluster, or both — so that a namespace owner planning to rename, move, or retire a Service can identify affected cross-namespace consumers before making the change.

metadata:
  annotations:
    consumed-by: "prod-search-indexer, prod-notifications"

Aliased Local Services

Rather than every consumer hardcoding another namespace's fully qualified Service name throughout its codebase, some teams create a local ExternalName Service inside the consuming namespace that aliases to the fully qualified cross-namespace target, allowing application code to reference a short, namespace-local name while the actual cross-namespace resolution detail lives in a single, centrally managed manifest.

apiVersion: v1
kind: Service
metadata:
  name: ledger-api
  namespace: prod-search-indexer
spec:
  type: ExternalName
  externalName: ledger-api.prod-payments-ledger.svc.cluster.local

Multi-Cluster Extensions

ServiceExport and Multi-Cluster Discovery

In multi-cluster deployments, cross-namespace discovery patterns extend into cross-cluster discovery through mechanisms like the Multi-Cluster Services API, where a ServiceExport object in one cluster makes a Service discoverable in other member clusters using a similarly structured, explicitly qualified name, following the same underlying principle that discovery across a boundary requires an explicit act rather than relying on default short-name resolution.

apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceExport
metadata:
  name: ledger-api
  namespace: prod-payments-ledger

Governance Considerations

Restricting Which Namespaces May Be Targeted

Some clusters apply admission policy to restrict which namespaces are even permitted to declare cross-namespace-referencing ExternalName Services or overly broad NetworkPolicy ingress rules, treating cross-namespace discovery capability itself as something to be granted deliberately rather than left universally available by default.

prod-search-indexer prod-payments-ledger FQDN resolve Resolution succeeds only if NetworkPolicy also permits the connection.