Service Discovery and DNS in Kubernetes

Tutorial 4 of 5

Service Discovery and DNS in Kubernetes

1. Introduction

In this tutorial, we will discover how Kubernetes uses DNS for service discovery, which allows Pods to communicate with each other and with other services. You will learn how DNS names are assigned to services within a Kubernetes cluster.

What You Will Learn:

  • The role of DNS in Service Discovery in Kubernetes.
  • How DNS names are assigned to services.
  • How to configure and use DNS within a Kubernetes cluster.

Prerequisites:

  • Basic knowledge of Kubernetes.
  • A working Kubernetes cluster for practice.

2. Step-by-Step Guide

Service Discovery is a key feature of Kubernetes that allows Pods to communicate with each other. This is achieved through the use of DNS. When a service is created in Kubernetes, it is automatically assigned a DNS name. This DNS name can be used by other Pods in the cluster to communicate with the service.

DNS in Kubernetes

Kubernetes uses DNS for service discovery. It automatically assigns a DNS name to each service within the cluster. When a Pod needs to communicate with a service, it can do so using the service's DNS name.

The format of the DNS name is: <service-name>.<namespace-name>.svc.cluster.local

Configuring DNS in Kubernetes

By default, the DNS policy for Pods is Default, which means the Pod inherits the name resolution configuration from the node that it’s running on. The Pod’s DNS resolution should behave the same as the node. But you can change this by setting a different dnsPolicy for the Pod.

3. Code Examples

Example 1: Creating a Service

Here's a simple example of creating a service in Kubernetes. The service is assigned a DNS name automatically.

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

In this example, the service my-service will be assigned the DNS name my-service.default.svc.cluster.local.

Example 2: Creating a Pod with Custom DNS Policy

Here's an example of creating a Pod with a custom DNS policy and custom DNS Config.

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command:
      - sleep
      - "3600"
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searches:
      - ns1.svc.cluster.local
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"

In this example, the Pod busybox is configured to use a custom DNS server (1.2.3.4) and custom search domains (ns1.svc.cluster.local and my.dns.search.suffix).

4. Summary

In this tutorial, we learned how Kubernetes uses DNS for service discovery and how DNS names are assigned to services. We also learned how to configure a custom DNS policy for a Pod.

Next Steps:

  • Practice creating and interacting with services in a Kubernetes cluster.
  • Explore other networking concepts in Kubernetes.

Additional Resources:

5. Practice Exercises

Exercise 1: Create a service in your Kubernetes cluster and verify its DNS name.

Solution: You can use the example code provided in the tutorial to create a service. The DNS name of the service should be <service-name>.<namespace-name>.svc.cluster.local.

Exercise 2: Create a Pod with a custom DNS policy and verify that it's using the correct DNS server.

Solution: You can use the example code provided in the tutorial to create a Pod with a custom DNS policy. You can verify the DNS server by inspecting the Pod's /etc/resolv.conf file.

Exercise 3: Create two services and verify that they can communicate with each other using their DNS names.

Solution: You can create two services using the example code provided in the tutorial. You can verify communication by creating a Pod that sends a request from one service to the other using the services' DNS names.

Tips for further practice:

  • Explore other options for DNS policies and DNS config.
  • Practice creating and managing more complex services.