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:
Prerequisites:
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.
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
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.
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
.
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
).
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:
Additional Resources:
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: