Last9

Kubernetes Service Discovery Explained with Practical Examples

Understand Kubernetes Service Discovery with clear examples of Services, Endpoints, DNS, Ingress, and headless setups in action.

Sep 16th, ‘25
Kubernetes Service Discovery Explained with Practical Examples
See How Last9 Works

Unified observability for all your telemetry. Open standards. Simple pricing.

Talk to an Expert

In Kubernetes, applications are constantly changing — new pods start, old ones shut down, workloads shift across nodes. The challenge is making sure that different parts of your system, and even external clients, can still find each other when the actual locations keep moving. That’s what service discovery handles. It provides a stable way for applications to connect and communicate, no matter where they’re running or how often the underlying infrastructure changes.

This guide walks through how Kubernetes service discovery works, with clear examples you can apply directly in your own applications.

TL;DR: Kubernetes Service Discovery in a Nutshell

Kubernetes Service Discovery is how applications in your cluster find each other.

It works through two main mechanisms:

  • Environment variables — older and less flexible
  • DNS — the modern, preferred approach

You define Services, which act as stable network abstractions over dynamic groups of Pods. Behind the scenes, Endpoints objects automatically track the IPs of the Pods backing each Service.

When a Pod needs to talk to another Service, it can use:

  • The Service’s name (resolved to an IP address by DNS), or
  • Its environment variables

For external access, Ingress often comes into play.

Consider it as Kubernetes’ built-in phonebook for your microservices, ensuring they can always connect.

💡
For a closer look at how background workers behave in production, see our guide on Background Job Observability.

What is Service Discovery and Why Do We Need It?

In traditional, monolithic applications, connecting components was often straightforward. You'd configure a static IP address or hostname for a database or another service, and it rarely changes. But the cloud-native world, especially with container orchestration platforms like Kubernetes, is a different beast entirely.

The Challenge of Dynamic Environments

Consider a microservices architecture running on Kubernetes. Your application consists of dozens, hundreds, or even thousands of individual services, each potentially scaled up and down based on demand. Pods, the smallest deployable units in Kubernetes, are inherently ephemeral. They can be created, destroyed, rescheduled, or moved to different nodes at any time due to:

  • Scaling events: Your application might scale out from 3 to 10 instances of a service during peak hours, and then scale back down.
  • Rolling updates: When you deploy a new version of your application, old Pods are replaced by new ones.
  • Node failures: If a node goes down, Kubernetes automatically reschedules its Pods onto healthy nodes.
  • Resource constraints: Pods might be evicted and restarted elsewhere if resources become scarce.

This constant flux means the IP address of a Pod serving a function is highly unstable. If one service needs to call another, how does it know where to find it at any given moment? Hardcoding IP addresses, or even dynamically fetching them at runtime, creates operational overhead and makes the system fragile.

How Service Discovery Solves the Problem

Service discovery is the automated process of detecting services and their network locations within a dynamic infrastructure.

It ensures application components can reliably connect, regardless of underlying IP addresses or where they are running.

In essence, service discovery acts as a dynamic directory or a smart address book:

  • Services register themselves (or are registered by the orchestrator).
  • Client services query the mechanism by a logical name.
  • They get the current network location (IP address and port).

This decoupling of service names from network locations is crucial for building applications that are:

  • Resilient
  • Scalable
  • Maintainable

Without service discovery, the benefits of containerization and orchestration would be undermined by constant configuration changes and broken connections.

Kubernetes Service Discovery Fundamentals

Kubernetes doesn't just provide a platform for running containers; it includes powerful, built-in mechanisms for service discovery. To understand how it works, we need to grasp three core concepts: Pods, Services, and Endpoints.

Pods: The Basic Building Block

At the heart of Kubernetes is the Pod. A Pod is the smallest deployable unit in Kubernetes, representing a single instance of a running process in your cluster.

  • Encapsulation: A Pod encapsulates one or more containers (which share network, storage, and other resources), storage resources, a unique network IP, and options that control how the containers should run.
  • Ephemeral Nature: Pods are designed to be short-lived and disposable. They come and go. When a Pod dies, its IP address is gone forever. New Pods receive new IP addresses.
  • Independent IP Address: Each Pod in a Kubernetes cluster gets its own unique IP address from the cluster's network range. This means containers within the same Pod can communicate via localhost, but containers in different Pods need to use their respective Pod IPs.

Because Pod IPs are transient, you cannot rely on them for inter-service communication. This is where Services come in.

Services: The Abstraction Layer

A Service in Kubernetes is a stable, persistent abstraction that defines a logical set of Pods and a policy by which to access them. Think of a Service as a stable internal load balancer or a fixed entry point to a group of dynamic Pods.

  • Stable Identity: Unlike Pods, Services have a stable IP address and DNS name that remain constant for the lifetime of the Service.
  • Pod Selection: Services use label selectors to identify which Pods they should route traffic to. When you create a Service, you specify a selector field that matches the labels on your Pods. Any Pod matching these labels becomes a backend for that Service.
  • Load Balancing: When traffic arrives at a Service's IP, Kubernetes automatically distributes that traffic across the healthy Pods that match the Service's selector. This provides built-in load balancing.
  • Types of Services: Kubernetes offers several Service types to address different use cases, including:
    • ClusterIP: The default type. Exposes the Service on an internal IP address inside the cluster. Only reachable from within the cluster.
    • NodePort: Exposes the Service on a static port on each Node's IP. Makes the Service accessible from outside the cluster using <NodeIP>:<NodePort>.
    • LoadBalancer: Exposes the Service externally using a cloud provider's load balancer. Only works with cloud providers that support it (e.g., AWS, GCP, Azure).
    • ExternalName: Maps the Service to the contents of the externalName field (e.g., my.database.example.com) by returning a CNAME record. No proxying or load balancing is involved.
    • Headless Service: A special type of Service (ClusterIP: None) that doesn't get a stable Cluster IP. Instead, it directly exposes the IP addresses of the backing Pods via DNS, useful for stateful applications or direct Pod-to-Pod communication.

Endpoints: The Bridge Between Services and Pods

While a Service defines which Pods it targets (using labels), an Endpoints object provides the actual mapping to the IP addresses and ports of the Pods that match its selector.

  • Automatic Creation: For most Service types, when you create a Service, Kubernetes automatically creates an Endpoints object with the same name.
  • Dynamic Updates: The Kubernetes control plane continuously monitors Pods. When a Pod matching a Service's selector is created, destroyed, or changes its IP address, the corresponding Endpoints object is automatically updated.
  • Service-Endpoint Relationship: The Service itself doesn't know the IP addresses of the Pods directly. It relies on the associated Endpoints object to provide this information for routing traffic.
💡
See how Service Catalog Observability provides visibility into your API endpoints and microservice behavior in What Is Service Catalog Observability.

The Two Pillars of Kubernetes Service Discovery

With Services and Endpoints handling the underlying mapping, how do client Pods actually find a Service? Kubernetes offers two primary mechanisms for this: environment variables and DNS.

1. Environment Variables: The Legacy Approach

When a Pod starts, Kubernetes injects a set of environment variables into the Pod's containers for every active Service in the cluster. These variables contain the Service's IP address and port.

Example: If you have a Service named my-backend with a ClusterIP of 10.0.0.5 exposed on port 8080, a Pod starting after this Service is created will have environment variables like:

bash MY_BACKEND_SERVICE_HOST=10.0.0.5 MY_BACKEND_SERVICE_PORT=8080

Pros:

  • Simple: No external configuration needed; just read the environment variables.
  • Always present: If the Service exists when the Pod starts, the variables will be there.

Cons:

  • Order-dependent: A Pod must be created after the Service it wants to discover for the environment variables to be populated. If the Service is created after the Pod, the Pod will not have these variables.
  • Limited: Only provides the ClusterIP and port. Not suitable for discovering multiple instances or for more complex scenarios.
  • Cluttered: In a cluster with many Services, the number of environment variables can become excessive.

Due to the order dependency and limitations, environment variables are generally considered a legacy approach and are not recommended for new applications or for reliable service discovery.

2. DNS: The Preferred Method

Kubernetes integrates deeply with DNS (Domain Name System) to provide a robust and flexible service discovery mechanism. Every Kubernetes cluster runs a DNS service (usually CoreDNS), which is configured to resolve internal Kubernetes domain names.

When a Service is created, the Kubernetes DNS service automatically creates corresponding DNS records:

  • Service Name: A Service named my-backend in the default namespace will be discoverable at my-backend.default.svc.cluster.local.
  • Short Name: Within the same namespace, you can often just use my-backend.
  • Service IP: This DNS name resolves to the ClusterIP of the Service.

Example: If your my-backend Service has a ClusterIP of 10.0.0.5, a DNS query for my-backend.default from within the cluster will resolve to 10.0.0.5.

Pros:

  • Dynamic and Decoupled: DNS records are automatically updated as Services and Endpoints change. You refer to Services by logical names, not transient IPs.
  • No Order Dependency: A Pod can query for a Service's DNS name regardless of when the Pod or Service was created.
  • Standardized: DNS is a universally understood protocol, making it easy for developers.
  • Flexible: Can be used for different Service types (including Headless Services for direct Pod IP resolution).

Cons:

  • Slightly more complex than env vars: Requires understanding DNS naming conventions.
  • DNS caching issues: Rarely, client-side DNS caching within containers can cause stale lookups, though this is less common with modern client libraries.

DNS is the standard way to do service discovery in Kubernetes, and it’s the recommended choice for internal communication.

How Service Discovery Works

Let's look at concrete scenarios to understand more about Kubernetes Service Discovery:

Scenario 1: Internal Communication within a Cluster

A simple application has a frontend and a backend service. The frontend needs to call the backend.

1. Define the Backend Deployment and Service

# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-app
  labels:
    app: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend-container
        image: your-backend-image:1.0   # Replace with your actual backend image
        ports:
        - containerPort: 8080
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend   # This matches the labels on the backend Pods
  ports:
  - protocol: TCP
    port: 80        # Service port
    targetPort: 8080 # Pod's container port
  type: ClusterIP   # Default, internal to the cluster

What happens here:

  • backend-deployment creates two backend Pods, each with its own IP (e.g., 10.244.0.10, 10.244.0.11).
  • backend-service selects these Pods with selector: app: backend.
  • Kubernetes assigns a stable ClusterIP (e.g., 10.0.0.100) to the Service.
  • An Endpoints object lists the Pod IPs: 10.244.0.10:8080, 10.244.0.11:8080.
  • Kubernetes DNS registers:
    • backend-service.default.svc.cluster.local
    • backend-service (short form in the default namespace)
      Both resolve to the ClusterIP 10.0.0.100.

2. Define the Frontend Deployment

# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-app
  labels:
    app: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend-container
        image: your-frontend-image:1.0   # Replace with your actual frontend image
        env:
        - name: BACKEND_URL
          value: "http://backend-service:80"  # Using the DNS name
        ports:
        - containerPort: 3000

How the frontend connects:

  • The frontend container uses http://backend-service:80 as its backend URL.
  • When the frontend Pod resolves backend-service, CoreDNS returns the Service’s ClusterIP (10.0.0.100).
  • Traffic flows to the ClusterIP and is load-balanced across the backend Pods listed in the Endpoints object.

This is the most common and recommended pattern for inter-service communication inside Kubernetes.

Scenario 2: Exposing Services to the Outside World (Ingress)

While NodePort and LoadBalancer Services can expose applications to the outside world, they each have limits — NodePort binds to specific ports on every node, and LoadBalancer depends on cloud provider integrations.

For HTTP and HTTPS traffic, Ingress is the recommended option.

1. Create the Frontend Service

The frontend Deployment is the same as in Scenario 1. To expose it externally, define a Service:

# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  type: ClusterIP   # Still internal, Ingress will expose it

2. Define an Ingress Resource

# my-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
  - host: myapp.example.com    # Your public domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service   # Refers to the internal Service
            port:
              number: 80

What happens here:

  • An Ingress controller (e.g., NGINX Ingress Controller, Traefik) runs in the cluster and watches for Ingress resources.
  • When my-app-ingress is created, the controller configures itself (or an external load balancer) to route traffic for myapp.example.com to frontend-service.
  • A user requests http://myapp.example.com:
    1. The Ingress controller receives the request.
    2. It proxies traffic to the ClusterIP of frontend-service.
    3. The Service load-balances the request across its frontend Pods.

Ingress acts as a layer 7 (HTTP/HTTPS) router, using Kubernetes Service Discovery to find the internal Services it needs to route traffic. It consolidates routing rules, manages TLS, and enables advanced traffic management — all under a single external endpoint (the Ingress controller’s external IP or hostname).

💡
Understand more on how APM supports large-scale Kubernetes applications by monitoring distributed services end-to-end in APM for Kubernetes: Monitor Distributed Applications at Scale.

Scenario 3: Headless Services for Direct Pod Access

Sometimes you need direct access to the individual Pods behind a Service rather than going through the Service’s built-in load balancer.

This is common in:

  • Stateful applications — like databases, where clients need to reach a specific replica (primary/secondary roles).
  • Custom load balancing or sharding logic — where the application itself decides how to distribute requests.

A Headless Service provides this behavior. You create one by setting clusterIP: None in the Service definition.

1. Define the Deployment and Headless Service

# headless-service-example.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-store
  labels:
    app: datastore
spec:
  replicas: 3
  selector:
    matchLabels:
      app: datastore
  template:
    metadata:
      labels:
        app: datastore
    spec:
      containers:
      - name: store-container
        image: your-datastore-image:1.0   # e.g., a simple key-value store
        ports:
        - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: data-store-headless
spec:
  selector:
    app: datastore
  clusterIP: None    # This makes it a Headless Service
  ports:
  - protocol: TCP
    port: 6379
    targetPort: 6379
  • The data-store Deployment creates three Pods (e.g., data-store-abc, data-store-def, data-store-ghi).
  • The data-store-headless Service selects these Pods.
  • Unlike a normal Service, no ClusterIP is allocated.
  • When Kubernetes DNS is queried for:
    data-store-headless.default.svc.cluster.local
    it returns a list of Pod IPs and their individual hostnames, e.g.:
    • data-store-abc.data-store-headless.default.svc.cluster.local
    • data-store-def.data-store-headless.default.svc.cluster.local
    • data-store-ghi.data-store-headless.default.svc.cluster.local

2. How to Use It

A client Pod can now:

  1. Perform a DNS lookup on data-store-headless.
  2. Get the IP addresses of all healthy data-store Pods.
  3. Apply its own connection logic, such as:
    • Connect to the first available Pod.
    • Always connect to a specific primary replica.
    • Distribute requests across Pods using custom hashing.

This bypasses the Service’s default round-robin load balancing and gives you fine-grained control over how traffic flows to Pods.

Advanced Service Discovery Concepts

While Kubernetes' native service discovery is powerful, more complex environments or specific requirements might lead you to explore advanced concepts.

Service Mesh Integration (e.g., Istio, Linkerd)

For highly complex microservices architectures, especially those requiring advanced traffic management, policy enforcement, observability, and security features, a service mesh like Istio or Linkerd can be invaluable.

  • Enhanced Discovery: Service meshes build upon Kubernetes' native service discovery. They typically inject sidecar proxies (e.g., Envoy for Istio) into every Pod. These proxies intercept all network traffic to and from the application containers.
  • Traffic Management: With a service mesh, you can achieve sophisticated traffic routing (e.g., canary deployments, A/B testing, traffic splitting), retries, timeouts, and circuit breaking, all configured at the mesh level rather than within application code.
  • Observability: Service meshes provide deep visibility into service communication, collecting metrics, logs, and traces for every network interaction.
  • Security: They can enforce mTLS (mutual TLS) between services automatically, regardless of the application's implementation, and apply fine-grained authorization policies.

While a service mesh doesn't replace Kubernetes service discovery, it significantly augments it, taking over the actual routing and policy enforcement after Kubernetes DNS has resolved a Service name to a ClusterIP (or Pod IPs for headless services). The sidecar proxies then apply the mesh's rules before forwarding the traffic.

Custom Service Discovery Mechanisms

In rare cases, you might encounter scenarios where Kubernetes' built-in mechanisms are insufficient or where you're integrating with legacy systems. This could involve:

  • External Service Registries: Integrating with existing service registries like Consul or Eureka outside of Kubernetes. This might involve custom controllers that synchronize Kubernetes Services with the external registry or proxies that bridge the two.
  • Application-Specific Discovery: Applications that implement their own discovery logic, often for highly specialized needs, such as peer-to-peer communication in distributed databases.
  • API Gateways: While Ingress handles L7 routing, an API Gateway might perform more advanced discovery and routing based on dynamic backend information or complex business logic.

For most modern Kubernetes applications, relying on Kubernetes' native DNS-based service discovery, potentially augmented by a service mesh, is the recommended and most efficient approach. Custom mechanisms should only be considered when necessary.

💡
Resolve Kubernetes service discovery issues faster with Last9 MCP — bring live cluster context (Services, Endpoints, DNS, metrics) into your workflow so you can pinpoint and fix connectivity problems without guesswork.

Troubleshooting Kubernetes Service Discovery

Service discovery in Kubernetes is usually reliable, but there are a few common issues you might run into. Here’s how to recognize them and where to look first.

Pod Cannot Resolve Service Name

If your application logs show errors like “hostname not found” or “connection refused” when trying to reach another Service by name, the problem usually lies in naming or DNS.

Possible causes include:

  • Typos in the Service name — always worth double-checking.
  • Incorrect namespace — if the Service is in a different namespace, you’ll need to use the fully qualified domain name (FQDN), e.g. backend-service.my-namespace.svc.cluster.local. Within the same namespace, just backend-service is enough.
  • DNS issues — CoreDNS might not be running or misconfigured.

Useful checks:

  • List CoreDNS Pods: kubectl get pods -n kube-system -l k8s-app=kube-dns
  • Inspect CoreDNS logs: kubectl logs -n kube-system <coredns-pod-name>
  • Test DNS resolution inside a Pod: kubectl exec -it <your-pod-name> -- nslookup <target-service-name>

If the Service name and namespace are correct and DNS is healthy, resolution should work.

Service Name Resolves, But Connection Fails

Sometimes DNS works, but the application still can’t connect. This usually points to missing or misconfigured backends.

Check for these conditions:

  • No backing Pods — the Service’s selector may not match any running Pods, or the Pods may all be unhealthy.
  • Incorrect targetPort — the Service targetPort must match the containerPort the application listens on.
  • Network restrictions — a NetworkPolicy might be blocking traffic.

Diagnostics to run:

  • kubectl get endpoints <service-name> → should list Pod IPs. If empty, the Service has no backends.
  • kubectl get pod -l app=my-backend -o yaml → verify Pods have the labels the Service selector expects.
  • kubectl get pods -l app=my-backend → confirm Pods are running and healthy.
  • kubectl get networkpolicies --all-namespaces → check for restrictive policies.

Fixing labels, correcting ports, and ensuring Pods pass health checks usually resolves this.

Environment Variables Not Populated

If a Pod expects SERVICE_HOST or SERVICE_PORT environment variables and they’re missing, it’s often because the Pod was created before the Service existed. Restarting the Pod fixes this, but in most cases, using DNS-based discovery is more reliable than relying on environment variables.

Incorrect Load Balancing

Another issue is uneven traffic distribution — some Pods receive all the traffic while others sit idle.

Two common reasons are:

  • Unhealthy Pods — kube-proxy routes traffic only to Pods that pass readiness/liveness probes.
  • Sticky sessions — external load balancers or Ingress controllers may be configured for sticky sessions, which can prevent even distribution.

Ensuring Pods pass readiness probes and reviewing external load balancer or Ingress settings will restore balance.

As a starting point for any of these issues, it’s helpful to inspect the Service and its backends directly:

kubectl get service <service-name> -o yaml
kubectl get endpoints <service-name> -o yaml

This shows the Service configuration and the actual Pod IPs behind it, helping you pinpoint where discovery is breaking down.

💡
Know how metrics play a critical role in keeping your cluster healthy, explained in Kubernetes Monitoring: Metrics.

Best Practices for Kubernetes Service Discovery

To build robust and scalable applications, follow these best practices:

Always Use DNS for Internal Communication

This is the golden rule. Leverage the stable DNS names provided by Kubernetes Services (e.g., my-service.my-namespace.svc.cluster.local or simply my-service within the same namespace). This decouples your application code from the ephemeral nature of Pod IPs and the order of deployment.

Use Labels and Selectors Effectively

Labels are the cornerstone of Kubernetes' declarative model.

  • Consistent Labels: Ensure your Pods have consistent and meaningful labels (e.g., app: my-app, tier: frontend, version: v1).
  • Service Selectors: Use these labels in your Service selectors to precisely define which Pods belong to which Service. This is how Services know where to send traffic.
  • Label Management: Use tools like Helm or Kustomize to manage labels consistently across your deployments.

Monitor Your Services and Endpoints

Service discovery is critical for application uptime.

  • Check Endpoints: Regularly inspect your Endpoints objects (kubectl get endpoints <service-name>) to ensure they correctly reflect the healthy Pods you expect. An empty Endpoints list means your Service has no backends.
  • Readiness Probes: Implement robust readiness probes in your Pod definitions. These probes tell Kubernetes when a Pod is truly ready to receive traffic. If a Pod fails its readiness probe, it will be removed from the Service's Endpoints until it recovers, preventing traffic from being routed to unhealthy instances.
  • Alerting: Set up alerts for Services with zero Endpoints or for high error rates on specific Service connections.

Consider a Service Mesh for Complex Deployments

If your application grows in complexity, requiring advanced traffic management, fine-grained security policies, or deep observability across many microservices, investigate a service mesh like Istio or Linkerd. They simplify these challenges by moving network concerns out of application code and into the infrastructure layer.

Final Thoughts

Kubernetes Service Discovery is the glue that holds distributed systems together, but understanding the mechanics is only half the picture.

What really helps teams is seeing how these patterns behave in a live cluster. With Last9’s Discover → Kubernetes view, you can trace how Pods map to Services, inspect Endpoints in real time, and track the health of deployments down to CPU, memory, and restart counts.

This makes discovery practical — you’re not just looking at YAML definitions, but observing how workloads connect, scale, and recover under changing conditions. A headless Service backing a stateful workload or an Ingress routing external traffic becomes easier to reason about. With this visibility, teams debug faster, plan resources with more confidence, and avoid surprises when environments shift.

Start for free today!

FAQs

Does Kubernetes do service discovery?
Yes. Kubernetes provides service discovery through Services and DNS. Services give stable names and virtual IPs, while CoreDNS maps these names to Pod IPs.

What is the difference between ingress and service discovery?
Service discovery handles how Pods and Services locate each other inside the cluster. Ingress manages external access to Services, including routing, hostnames, and TLS.

How does service discovery work?
Pods have dynamic IPs. A Service groups Pods with labels and provides a stable name. Kubernetes DNS resolves that name to a ClusterIP or, for headless Services, directly to Pod IPs.

What is service discovery in GKE?
In Google Kubernetes Engine, service discovery uses the same mechanisms as upstream Kubernetes: Services, Endpoints, and DNS through CoreDNS.

Why is service discovery important in Kubernetes?
It removes the need to hardcode Pod IPs and ensures applications can find each other as infrastructure changes, making clusters more reliable and scalable.

How do Kubernetes services work?
A Service selects Pods using labels, assigns them a stable DNS name and IP, and load-balances traffic across healthy Pods.

What are some common challenges with service discovery, and how can I troubleshoot them?
Common issues include DNS failures, Services with no Endpoints, misconfigured ports, or restrictive NetworkPolicies. Use kubectl get service, kubectl get endpoints, and CoreDNS logs to debug.

What is a Kubernetes Pod?
A Pod is the smallest deployable unit in Kubernetes, usually containing one or more containers that share storage, networking, and configuration.

What objects get DNS records?
Services and Pods get DNS records. Services resolve to ClusterIPs (or Pod IPs for headless Services), and Pods get DNS names based on their IPs and namespace.

How to secure applications on Kubernetes (SSL/TLS Certificates)?
Use Ingress with TLS certificates managed by tools like cert-manager. This allows encrypted traffic between clients and your Services.

How do I configure service discovery in a Kubernetes cluster?
Create Services that select Pods via labels. CoreDNS automatically provides DNS entries for those Services.

How can I configure DNS-based service discovery in Kubernetes?
Use the Service name (e.g., my-service.default.svc.cluster.local) from within Pods. CoreDNS resolves this to the Service’s IP or backing Pods.

How can I configure Kubernetes service discovery for my application?
Define a Service that selects your application Pods. Update your app to call other Services by their DNS names instead of hardcoding IPs.

Contents

Do More with Less

Unlock unified observability and faster triaging for your team.