What things get DNS names?
Every Service defined in the cluster (including the DNS server itself) is assigned a DNS name. By default, a client Pod’s DNS search list will include the Pod’s own namespace and the cluster’s default domain. This is best illustrated by example:
Assume a Service named “
my-service”in the Kubernetes namespace
dev”. A Pod running in namespace
dev”can look up this service by simply doing a DNS query for
my-service”. A Pod running in namespace can look up this service by doing a DNS query for
Kubernetes offers a cluster addon for DNS service discovery, which most environments enable by default. “SkyDNS” seems to be the standard DNS server of choice, since it was designed to work on top of etcd. The “
kube-dns”addon is composed of a kubernetes service which, like all services, is allocated an arbitrary VIP within the preconfigured subnet (this is the IP that every other service will use for DNS); and a replication controller that will manage pods with the following containers inside them:
- A local etcd instance
- The SkyDNS server
- A process called kube2sky which binds SkyDNS to the kubernetes cluster
- A health check called healthz that monitors how DNS is being resolve
|DNS IP: 10.254.0.10||We can choose an IP from cluster service range which should not allocated to any other service.|
|Domain Name: kubernetes.local||Defined Domain name to use.|
In order to set everything up, we need to retrieve the definition files for the service and replication controller, like the following:Note: Change the Red Marked settings according to your setup.
[root@kube-master ~]# wget https://gist.githubusercontent.com/jamiehannaford/b80465bf7d427b949542/raw/75e7c0ff3fc740ea0f4eb54e5d10753cccf1267b/skydns-svc.yml
Now we need to setup “MASTER-IP” and Domain Name in the sysdns-rc.yaml file.
[root@kube-master ~]# vim skydns-rc.yaml
Line no. 51
Line No. 62
- -domain=kubernetes.local → Your Domain Name
- -cmd=nslookup kubernetes.default.svc.kubernetes.local localhost >/dev/null
Next we need to change the DNS server ip in skydns-svc.yaml file as follows.
[root@kube-master ~]# vim skydns-svc.yaml
Line No. 31
Now we can define the service and replication controller.
[root@kube-master ~]# kubectl create -f skydns-rc.yaml
[root@kube-master ~]# kubectl create -f skydns-svc.yaml
This will create a replication controller and service under the kube-system namespace. To check their status, run:
[root@kube-master ~]# kubectl get pods --namespace=kube-system
[root@kube-master ~]# kubectl get services --namespace=kube-system
Once our pod is completely up-and-running,
will need to pass in the DNS server IP
and domain to all of the kubelet agents running on
To do this,
will likely need to change the
will need to add the following flags.
[root@minion1 ~]# vim /etc/kubernetes/kubelet
[root@minion1 ~]# systemctl restart kubelet
We have done with the dns settings. To test DNS functions we can start one small
pod based on busybox Image as follows.
[root@kube-master ~]# vim /root/busybox.yaml
Now we can create pod using the above yaml file.
[root@kube-master ~]# kubectl create -f busybox.yaml
[root@kube-master ~]# kubectl exec busybox -- nslookup kubernetes
can substitute kubernetes any service name that is currently running, and it will
resolve to the IP of a pod that the service ordinarily directs to.
That’s all about the DNS Add-on in Kubernetes.