El servicio DNS en Kubernetes
Existe un componente de Kubernetes llamado KubeDNS, que ofrece un servidor DNS para que los pods puedan resolver diferentes nombres de recursos (servicios, pods, …) a direcciones IP.
El servicio KubeDNS se comounica con el servidor de API y comprueba los servicios y pods creado para gestionar los diferentes registros de sus zonas de DNS.
¿Qué se puede resolver?
- Cada vez que se crea un nuevo servicio se crea un registro de tipo A con el nombre
servicio.namespace.svc.cluster.local
. - Para cada puerto nombrado se crea un registro SRV del tipo
_nombre-puerto._nombre-protocolo.my-svc.my-namespace.svc.cluster.local
que resuelve el número del puerto y al CNAME:servicio.namespace.svc.cluster.local
. - Para cada pod creado con dirección IP 1.2.3.4, se crea un registro A de la forma
1-2-3-4.default.pod.cluster.local
.
Comprobamos el DNS
Creamos un pod con la imagen busybox
a partir del fichero busybox.yaml
:
kubectl create -f busybox.yaml
Si tenemos los siguientes servicios creados:
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d
nginx NodePort 10.111.102.186 <none> 80:30305/TCP 2d
La consulta para resolver la IP de un servicio sería:
kubectl exec -it busybox -- nslookup nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: nginx
Address 1: 10.111.102.186 nginx.default.svc.cluster.local
De esta manera podemos hacer referencia al servicio por el nombre:
kubectl exec -it busybox -- wget http://nginx
Connecting to nginx (10.111.102.186:80)
index.html 100% |*******************************| 612 0:00:00 ETA
Como podemos observar el servidor DNS se llama kube-dns.kube-system.svc.cluster.local
y tiene la IP 10.96.0.10
, es un servicio que representa un conjunto de pods que se está ejecutando en el espacio de nombres kube-config
:
kubectl get pods --namespace=kube-system -o wide
NAME READY STATUS RESTARTS AGE
...
kube-dns-86f4d74b45-c4zxz 3/3 Running 0 6d
...
kubectl get services --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
...
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 6d
...
Y podemos comprobar el fichero de resolución de los pods de la siguiente forma:
kubectl exec -it busybox -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:5
Para terminar veamos la resolución del nombre de un pod:
kubectl exec -it busybox -- nslookup 192-168-72-178.default.pod.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: 192-168-72-178.default.pod.cluster.local
Address 1: 192.168.72.178
Índice de entradas sobre Kubernetes
Este artículo corresponde a una serie de entradas donde he hablado sobre Kubernetes:
- Instalación de kubernetes con kubeadm
- Desplegando una aplicación en Kubernetes
- Recursos de Kubernetes: Pods
- Recursos de Kubernetes: ReplicaSet
- Recursos de Kubernetes: Deployment
- Kubernetes: Desplegando la aplicación Mediawiki
- Kubernetes: Desplegando la aplicación GuestBook (Parte 1)
- Recursos de Kubernetes: Services
- El servicio DNS en Kubernetes
- Kubernetes: Desplegando la aplicación GuestBook (Parte 2)
- Kubernetes: Desplegando la aplicación LetsChat
- Recursos de Kubernetes: Ingress
- Accediendo a nuestras aplicaciones Kubernetes con Ingress
- Recursos de Kubernetes: Namespaces
- Kubernetes. Configurando nuestras aplicaciones: variables de entornos, ConfigMap, Secrets
- Kubernetes. Desplegando WordPress con MariaDB
- Almacenamiento en Kubernetes. PersistentVolumen. PersistentVolumenClaims
- Kubernetes. Desplegando WordPress con MariaDB con almacenamiento persistente
- Integración de Kubernetes con OpenStack
Comments
Rafael Muñoz Gonzalez
Muy buen post me ha aclarado muchas cosas.
Me gustaría hacerte una pregunta:
¿Como puedo unir un nombre local con un nombre externo?. Es decir asociar este nombre interno "mongodb-replicaset-0.mongodb-replicaset.mongodb-replicaset.svc.cluster.local:27017" a este nombre externo "mongo-01.midominio.com".
La opción de exponer un puerto random del nodo no es valido ya que solo atiende a peticiones con el nombre interno.
Un saludo y muchas gracias!
José Domingo Muñoz
Hola Rafael, la opción que tienes es crear un CNAME para que cuando se acceda al nombre local se esté accediendo al nombre externo.
Un saludo
Rafael Muñoz Gonzalez
Muchas gracias por tu rápida respuesta.
Perdoname pero soy bastante nuevo con esto de Kubernetes. Te refieres a crear un servicio de external hostname en el cluster y luego unir el subdominio con la ip publica del nodo?
José Domingo Muñoz
Perdón a no he entendido bien la pregunta. Tampoco se si esta respuesta te puede valer, pero creo que lo que necesiatas es un servicio que te de acceso a una aplicación externa. Puedes verlo en el siguiente enlace: https://medium.com/@Managed...
Un saludo
Fernando Trigos
Genial… Aclaré muchas dudas… Gran POST
Leave a Comment
Your email address will not be published. Required fields are marked *