First, each node has a NodeName and IP address assigned to it. The node names and IP addresses of the cluster are probably registered in a DNS server in the organization. The Cluster DNS resolution within the cluster between the different components in the cluster such as pods and services. Kubernetes deploys a built-in DNS server by default when you set up a cluster. If you set up Kubernetes manually, then you do it by yourself.
So, How it helps pods resolve other pods and services within the cluster? We do not really care about nodes. We focus purely on Pods and services within the cluster. As long as our cluster networking is set up correctly, and all pods and services can get their own IP address and can reach each other.
Cluster DNS
- All pods and services can reach others using their IP addresses.
Connection Test by DNS
1. Check DNS pod is running in the Kubernetes Cluster
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-74ff55c5b-vjvpb 1/1 Running 4 4d14h
- coredns is running in the K8s Cluster
2. Create Nginx Pod and Nginx Service
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip-service
spec:
type: ClusterIP
ports:
- targetPort: 80
port: 80
selector:
app: nginx
$ kubectl create -f nginx-pod.yaml
pod/nginx-pod created
$ kubectl create -f nginx-clusterip-service.yaml
service/nginx-clusterip-service created
3. Create web Pod for connecting to Nginx Service (Nginx-Pod) through Cluster DNS
apiVersion: v1
kind: Pod
metadata:
name: web-app-pod
spec:
containers:
- image: radial/busyboxplus:curl
command:
- sleep
- "60000"
imagePullPolicy: IfNotPresent
name: web-app-container
restartPolicy: Always
$ kubectl create -f web-app-pod.yaml
pod/web-app-pod created
4. In the web Container in the Web Pod, curl Nginx Service or Nginx Pod
// Service Information
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-clusterip-service ClusterIP 10.98.112.241 <none> 80/TCP 5m29s
// Pod Information
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 1/1 Running 0 6m14s 172.17.0.2 minikube <none> <none>
web-app-pod 1/1 Running 0 3m40s 172.17.0.10 minikube <none> <none>
$ kubectl exec -it web-app-pod -- sh
// Connection Test to Nginx service with DNS
[ root@web-app-pod:/ ]$ curl nginx-clusterip-service
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl nginx-clusterip-service:80
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl nginx-clusterip-service.default.svc.cluster.local
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl http://nginx-clusterip-service.default.svc.cluster.local:80
Welcome to nginx!
// Connection Test to Nginx Service with Service IP
[ root@web-app-pod:/ ]$ curl 10.98.112.241
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl 10.98.112.241:80
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl http://10.98.112.241:80
Welcome to nginx!
// Connection Test to Nginx Pod with DNS
$ curl 172-17-0-2.default.pod.cluster.local
Welcome to nginx!
// Connection Test to Nginx Service with Pod IP
[ root@web-app-pod:/ ]$ curl 172.17.0.2
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl 172.17.0.2:80
Welcome to nginx!
[ root@web-app-pod:/ ]$ curl http://172.17.0.2:80
Welcome to nginx!
- Cluster DNS only can be used in pods not node.
$ minikube ssh
// Nginx Service
$ curl 10.98.112.241
Welcome to nginx!
$ curl http://nginx-clusterip-service.default.svc.cluster.local:80
curl: (6) Could not resolve host: nginx-clusterip-service.default.svc.cluster.local
// Nginx Pod
$ curl 172.17.0.2
Welcome to nginx!
$ curl 172-17-0-2.default.pod.cluster.local
curl: (6) Could not resolve host: 172-17-0-2.default.pod.cluster.local
To make the nginx-pod accessible to a web pod, to create an nginx-service. Whenever the service is created, the Kubernetes DNS service creates a record for the service. It maps the service name to the IP address.
Hostname | Namespace | Type | Root | IP Address |
nginx-clusterip-service | default | svc | cluster.local | 10.98.112.241 |
172-1172-17-0-2 | default | pod | cluster.local | 172.17.0.2 |