6.3 Servicio DNS en Kubernetes
Existe un componente de Kubernetes llamado CoreDNS, que ofrece un servidor DNS interno para que los Pods puedan resolver diferentes nombres de recursos (Services, Pods, …) a direcciones IP.
Cada vez que se crea un nuevo recurso Service se crea un registro de tipo A con el nombre:
<nombre_servicio>.<nombre_namespace>.svc.cluster.local.
Comprobemos el servidor DNS
Partimos del punto anterior donde tenemos creados los dos Services:
kubectl get services
mariadb ClusterIP 10.106.60.233 <none> 3306/TCP
nginx NodePort 10.110.81.74 <none> 80:32717/TCP
Para comprobar el servidor DNS de nuestro cluster y que podemos resolver los nombres de los distintos Services, vamos a usar un Pod (busybox.yaml
) creado desde una imagen busybox
. Es una imagen muy pequeña pero con algunas utilidades que nos vienen muy bien:
kubectl apply -f busybox.yaml
¿Qué servidor DNS está configurado en los Pods que estamos creando? Podemos ejecutar la siguiente instrucción para comprobarlo:
kubectl exec -it busybox -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
- El servidor DNS (componente coreDNS) tiene asignado la IP del cluster 10.96.0.10.
- Podemos utilizar el nombre corto del Service, porque buscará el nombre del host totalmente cualificado usando los dominios indicados en el parámetro
search
. Como vemos el primer nombre de dominio es el que se crea con los Services:default.svc.cluster.local
(recuerda que el namespace que estamos usando esdefault
).
Vamos a comprobar que realmente se han creado dos registros A para cada uno de los Service, haciendo consultas DNS:
kubectl exec -it busybox -- nslookup nginx
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: nginx.default.svc.cluster.local
Address: 10.110.81.74
Vemos que ha hecho la resolución del nombre nginx
con la IP correspondiente a su servicio. Y con el Service mariadb también lo podemos hacer:
kubectl exec -it busybox -- nslookup mariadb
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: mariadb.default.svc.cluster.local
Address: 10.106.60.233
También podemos comprobar que usando el nombre podemos acceder al servicio:
kubectl exec -it busybox -- wget http://nginx
Connecting to nginx (10.110.81.74:80)
saving to 'index.html'
...
Podemos concluir que, cuando necesitemos acceder desde alguna aplicación desplegada en nuestro cluster a otro servicio ofrecido por otro despliegue, utilizaremos el nombre que hemos asignado a su Service de acceso. Por ejemplo, si desplegamos un Wordpress y un servidor de base de datos mariadb, y creamos dos Services: uno de tipo NodePort para acceder desde el exterior al CMS, y otro, que llamamos mariadb
de tipo ClusterIP para acceder ala base de datos, cuando tengamos que configurar el Wordpress para indicar la dirección de la base de datos, pondremos mariadb
.