Kubernetes, también conocido como K8s, es un sistema de código abierto de orquestación para automatizar la implementación, el escalado y la gestión de aplicaciones en contenedores. Su portabilidad, flexibilidad y capacidades de escalado automático lo convierten en un sistema ampliamente utilizado. Por encima de todas las características destacadas, la opción de crear registros DNS para servicios y pods lo hace imbatible frente a otros sistemas de software. El servicio DNS de Kubernetes le permite comunicarse con los servicios mediante nombres DNS consistentes en lugar de direcciones IP.
Requisitos previos
Para aprovechar al máximo el tutorial y comprender mejor el servicio DNS de Kubernetes, asegúrese de repasar los conceptos básicos de Kubernetes. También se beneficiará de la lectura de la Descripción general de las terminologías, componentes y conceptos de DNS para comprender mejor los conceptos de DNS. Además, una descripción general del ecosistema de Docker y los conceptos básicos de la tecnología de contenedorización le aportarán una gran ventaja.
¿Qué es un sistema DNS?
El Sistema de Nombres de Dominio (DNS) es un mecanismo para vincular varios tipos de información con nombres fáciles de recordar, como direcciones IP. El uso de un sistema DNS para traducir los nombres de las solicitudes en direcciones IP facilita que los usuarios finales lleguen a su nombre de dominio de destino sin esfuerzo. La mayoría de los clústeres de Kubernetes incluyen un servicio DNS interno configurado de forma predeterminada para ofrecer un enfoque ligero para el descubrimiento de servicios. Incluso cuando los pods y servicios se crean, eliminan o se trasladan entre nodos, el descubrimiento de servicios integrado simplifica que las aplicaciones identifiquen y se comuniquen con los clústeres de Kubernetes.
En versiones recientes de Kubernetes, los detalles técnicos del servicio DNS de Kubernetes han cambiado. Este tutorial tiene como objetivo presentar las implementaciones tanto de kube-dns como de CoreDNS del servicio DNS de Kubernetes. Comprenderemos los registros DNS de Kubernetes en detalle y demostraremos cómo funciona el DNS de Kubernetes.
¿Qué se incluye en el servicio DNS de Kubernetes?
Anteriormente, el servicio DNS de Kubernetes se basaba en kube-dns antes del lanzamiento de la versión 1.11. Sin embargo, la seguridad y la privacidad seguían siendo una preocupación grave. Más tarde, la comunidad de Kubernetes introdujo CoreDNS en la nueva versión 1.11 para abordar los problemas de seguridad y estabilidad de kube-dns.
Independientemente de la versión de software que esté utilizando para administrar los registros DNS, kube-dns y CoreDNS funcionan de manera similar:
- Se crea un servicio kube-dns y uno o más pods.
- El servicio kube-dns monitorea la API de Kubernetes para eventos de servicios y endpoints y cambia sus entradas de DNS según corresponda. Cuando modifica estos servicios de Kubernetes y sus pods relacionados con operaciones de creación, edición o eliminación, estos eventos se activan automáticamente.
- Kubelet asigna la IP del clúster del servicio kube-dns a cada nuevo pod en la opción etc/resolv.conf nameserver, junto con la configuración de search adecuada para permitir nombres de host más cortos:
|
1 2 3 |
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5 |
-
Las aplicaciones en contenedores pueden entonces resolver nombres de host como example-service.namespace a la dirección IP del clúster correspondiente.
Una descripción general de los registros DNS de Kubernetes
Comprendamos mejor los registros DNS de Kubernetes con la ayuda de un ejemplo. El registro DNS A completo para un servicio de Kubernetes se verá así:
service.namespace.svc.cluster.local
Un pod tendría un registro en este formato, que representaría la dirección IP real del pod’s:
10.32.0.125.namespace.pod.cluster.local
Además, se crean registros SRV para los puertos especificados de un servicio de Kubernetes:
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
Como resultado, su aplicación o microservicio puede conectarse a un nombre de host simple y consistente para llegar a otros servicios o pods en el clúster, gracias al mecanismo de descubrimiento de servicios integrado basado en DNS.
Resolución de nombres de host más cortos y búsqueda de dominios
No siempre necesitará utilizar todo el nombre de host para acceder a otro servicio debido a los sufijos de dominio de búsqueda establecidos en el resolv.conf archivo. Si se está comunicando con un servicio en el mismo espacio de nombres, puede llamarlo simplemente por su nombre:
|
1 |
other-service |
Agregue other-service a la consulta si el servicio está en un espacio de nombres diferente:
|
1 |
other-service.other-namespace |
Deberá utilizar al menos lo siguiente si se dirige a un pod:
|
1 |
pod-ip.other-namespace.pod |
Solo los sufijos .svc se completan automáticamente en el archivo resolv.conf predeterminado. Por lo tanto, es esencial especificar la configuración hasta .pod. A continuación, repasemos las complejidades de las dos implementaciones alternativas de DNS de Kubernetes que hemos conocido hasta ahora.
Implementación de DNS de Kubernetes
La versión 1.11 de Kubernetes proporcionó un nuevo software para administrar el servicio kube-dns , como se mencionó en la sección anterior. La razón principal detrás de la nueva actualización fue mejorar el rendimiento y la seguridad del servicio. Comencemos con la integración de kube-dns desde el principio.
-
kube-dns
En la versión anterior de Kubernetes 1.11, el servicio kube-dns tenía tres contenedores operando en un pod kube-dns en el espacio de nombres kube-system . Eche un vistazo a los tres contenedores a continuación:
- kube-dns: un contenedor que ejecuta SkyDNS y funciona como un servicio de resolución de consultas DNS.
- dnsmasq: las respuestas de SkyDNS son almacenadas en caché por dnsmasq, un solucionador y caché de DNS ligero y común.
- sidecar: un contenedor al lado del servicio que realiza informes de métricas y reacciona a las comprobaciones de estado.
CoreDNS se creó como resultado de las vulnerabilidades de seguridad en Dnsmasq y los problemas de rendimiento de escalabilidad con SkyDNS.
-
CoreDNS
Como nuevo servicio DNS de Kubernetes, CoreDNS se ha actualizado a disponibilidad general en Kubernetes 1.11. Esto implica que está listo para producción y será utilizado por muchas herramientas de instalación y proveedores de Kubernetes administrados como el servicio DNS del clúster predeterminado.
CoreDNS es un servidor DNS flexible y extensible que actúa como un clúster DNS de Kubernetes. Realiza todas las funcionalidades del sistema anterior. Un contenedor DNS es responsable de resolver y almacenar en caché las consultas DNS. CoreDNS responde a las comprobaciones de estado y proporciona métricas en un solo contenedor. Además, aborda algunos fallos menores y proporciona nuevas capacidades para resolver problemas de rendimiento y seguridad:
- Se han resuelto algunos conflictos entre el uso de stubDomains y servicios externos.
- Al aleatorizar el orden en que se devuelven algunas entradas, CoreDNS puede mejorar el equilibrio de carga round-robin.
- Al iterar mejor sobre cada uno de los sufijos de dominio de búsqueda definidos en resolv.conf, una función llamada autopath puede mejorar los tiempos de respuesta de DNS al resolver nombres de host externos.
- Incluso si el pod no existe, kube-dns 10.32.0.125.namespace.pod.cluster.local siempre se resolverá en 10.32.0.125. CoreDNS ofrece un modo de pods validados que solo se resolverá si existe un pod con la dirección IP y el espacio de nombres correctos.
Para avanzar en su conocimiento sobre los endpoints, autopaths, y wildcards de Kubernetes, consulte un tutorial sobre cómo Kubernetes permite leer datos de zona de su clúster.
Características de personalización
Kubernetes permite configurar pods DNS y personalizar la resolución DNS del clúster, gracias al servicio de personalización de DNS de Kubernetes. Los administradores pueden aprovechar estos servicios para alterar los servidores de nombres ascendentes o los sufijos de dominio de búsqueda definidos en resolv.conf. Por encima de todo, hay una función adicional para personalizar pods y contenedores utilizando la opción dnsConfig :

La actualización de esta configuración forzará una reescritura del resolv.conf de un pod, lo que permitirá que los cambios surtan efecto. La configuración anterior creará un archivo que contiene líneas de nameserver 203.0.113.44 y search custom.dns.local, lo que se transfiere directamente a las opciones normales de resolv.conf .
Conclusión
En este tutorial, le hemos guiado a través de los conceptos básicos del servicio DNS de Kubernetes y su implementación en diferentes versiones. También se analizaron los registros DNS de Kubernetes con la ayuda de un ejemplo. Además, destacamos algunas opciones de configuración adicionales para personalizar pods y resolver consultas DNS. Esto cubre los conceptos básicos del servicio DNS de Kubernetes, pero su aprendizaje no debería terminar aquí. Consulte la documentación oficial de Kubernetes para explorar más sobre el tema.
Para ampliar sus conocimientos de DevOps y profundizar en los aspectos esenciales de Kubernetes, consulte los siguientes tutoriales de nuestro blog:
- Introducción a Helm: Gestor de paquetes para Kubernetes
- Cómo instalar y usar Kubernetes en Ubuntu 20.04
- Desplegar una aplicación PHP en un clúster de Kubernetes con Ubuntu 18.04
¡Feliz computación!
Comentarios
Aún no hay comentarios. Sea el primero.