Cómo gestionar automáticamente los registros DNS desde DigitalOcean Kubernetes mediante ExternalDNS
El autor seleccionó el Fondo de Código Libre y Abierto para recibir una donación como parte del programa Write for DOnations .
Introducción
Al implementar aplicaciones web en Kubernetes, generalmente se utilizan servicios e ingresos para exponer las aplicaciones más allá del clúster en el dominio deseado. Esto implica configurar manualmente no solo el ingreso, sino también los registros DNS en su proveedor, lo que puede ser un proceso lento y propenso a errores. Esto puede convertirse en un obstáculo a medida que la aplicación se vuelve más compleja; cuando cambia la IP externa, es necesario actualizar los registros DNS en consecuencia.
Para solucionar este problema, el equipo de Kubernetes sig-network creó ExternalDNS con el fin de administrar automáticamente los registros DNS externos desde un clúster de Kubernetes. Una vez implementado, ExternalDNS funciona en segundo plano y prácticamente no requiere configuración adicional. Siempre que se crea o modifica un servicio o ingreso, ExternalDNS actualiza los registros de inmediato.
En este tutorial, instalará ExternalDNS en su clúster Kubernetes de DigitalOcean a través de Helm y lo configurará para usar DigitalOcean como su proveedor de DNS. Luego, implementará una aplicación web de muestra con un Ingress y usará ExternalDNS para apuntarla a su nombre de dominio. Al final, tendrá un sistema automatizado de administración de registros DNS para los servicios y los Ingresses.
Prerrequisitos
-
Un clúster de Kubernetes de DigitalOcean con su conexión configurada como
kubectl
predeterminada. Las instrucciones sobre cómo configurarlokubectl
se muestran en el paso Conectarse a su clúster cuando crea su clúster. Para crear un clúster de Kubernetes en DigitalOcean, lea la Guía de inicio rápido de Kubernetes . -
El administrador de paquetes Helm 3 instalado en su máquina local. Complete el paso 1 del tutorial Cómo instalar software en clústeres de Kubernetes con el administrador de paquetes Helm 3 .
-
El controlador de ingreso de Nginx instalado en su clúster mediante Helm para usar ExternalDNS con recursos de ingreso. Para ello, siga Cómo configurar un ingreso de Nginx en DigitalOcean Kubernetes mediante Helm . Deberá configurar la
publishService
propiedadtrue
según las instrucciones del paso 2. -
Una clave API de DigitalOcean (Personal Access Token) con permisos de lectura y escritura. Para crear una, visita Cómo crear un token de acceso personal .
-
Un nombre de dominio completamente registrado. Este tutorial se utilizará
echo.your_domain
en todo momento. Puede comprar un nombre de dominio en Namecheap , obtener uno gratis en Freenom o utilizar el registrador de dominios que prefiera.
Paso 1: Instalación de ExternalDNS mediante Helm
En esta sección, instalará ExternalDNS en su clúster usando Helm y lo configurará para que funcione con el servicio DNS de DigitalOcean.
Para anular algunas de las configuraciones predeterminadas del gráfico Helm de ExternalDNS, deberá crear un values.yaml
archivo que pasará a Helm durante la instalación. En la máquina que utiliza para acceder a su clúster en los requisitos previos, cree el archivo ejecutando lo siguiente:
- nano externaldns-values.yaml
Añade las siguientes líneas:
valores de dns externos.yaml
provider: digitaloceandigitalocean: apiToken: your_api_tokeninterval: "1m"policy: sync # or upsert-only# domainFilters: [ 'your_domain' ]
En el primer bloque, se establece el proveedor de servicios DNS en DigitalOcean. Luego, en el siguiente bloque, se define el token de API de DigitalOcean reemplazando your_api_token
.
La siguiente línea establece el intervalo en el que ExternalDNS sondeará los cambios en los ingresos y los servicios. Puede configurarlo en un valor más bajo para propagar los cambios a su DNS más rápido; 1 minuto es el valor predeterminado.
La policy
configuración determina si ExternalDNS solo insertará registros DNS ( upsert-only
) o los creará y eliminará según sea necesario ( sync
). Afortunadamente, desde la versión 0.3, ExternalDNS admite el concepto de propiedad mediante la creación de registros TXT adjuntos en los que almacena información sobre los dominios que crea, lo que limita su alcance de acción solo a aquellos que crea.
El domainFilters
parámetro se utiliza para limitar los dominios que puede administrar ExternalDNS. Puede quitar los comentarios e ingresar sus dominios en forma de matriz de cadenas, pero esto no es necesario.
Cuando haya terminado de editar, guarde y cierre el archivo.
El gráfico Helm de ExternalDNS es parte de la biblioteca de gráficos de Bitnami . Añádalo a su instalación de Helm ejecutando el siguiente comando:
- helm repo add bitnami https://charts.bitnami.com/bitnami
Luego, actualice el caché de Helm para descargar su contenido:
- helm repo update
Por último, instale ExternalDNS en su clúster ejecutando lo siguiente:
- helm install external-dns bitnami/external-dns -f externaldns-values.yaml
La salida será similar a la siguiente:
OutputNAME: external-dnsLAST DEPLOYED: ...NAMESPACE: defaultSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:** Please be patient while the chart is being deployed **To verify that external-dns has started, run: kubectl --namespace=default get pods -l "app.kubernetes.io/name=external-dns,app.kubernetes.io/instance=external-dns"
Puede verificar la creación de ExternalDNS ejecutando:
- kubectl --namespace=default get pods -l "app.kubernetes.io/name=external-dns,app.kubernetes.io/instance=external-dns"
OutputNAME READY STATUS RESTARTS AGEexternal-dns-56c85ff66b-2vm88 1/1 Running 0 24s
Ha instalado ExternalDNS en su clúster de Kubernetes. A continuación, implementará una aplicación web de ejemplo, la expondrá mediante un Ingress de Nginx y dejará que ExternalDNS apunte automáticamente su nombre de dominio al Load Balancer adecuado.
Paso 2: Implementación y exposición de una aplicación web de ejemplo
En esta sección, implementará una aplicación web ficticia en su clúster para exponerla mediante su Ingress. Luego, configurará ExternalDNS para que configure automáticamente los registros DNS por usted. Al final, tendrá registros DNS para su dominio apuntados al balanceador de carga de Ingress.
La aplicación web ficticia que implementarás es http-echo
de Hashicorp. Es un servidor web en memoria que repite el mensaje que le das. Almacenarás sus manifiestos de Kubernetes en un archivo llamado echo.yaml
. Créalo y ábrelo para editarlo:
- nano echo.yaml
Añade las siguientes líneas a tu archivo:
eco.yaml
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: echo-ingress annotations: kubernetes.io/ingress.class: nginxspec: rules: - host: "echo.your_domain" http: paths: - pathType: Prefix path: "/" backend: service: name: echo port: number: 80---apiVersion: v1kind: Servicemetadata: name: echospec: ports: - port: 80 targetPort: 5678 selector: app: echo---apiVersion: apps/v1kind: Deploymentmetadata: name: echospec: selector: matchLabels: app: echo replicas: 3 template: metadata: labels: app: echo spec: containers: - name: echo image: hashicorp/http-echo args: - "-text=Echo!" ports: - containerPort: 5678
En esta configuración, se define una implementación, un ingreso y un servicio. La implementación consta de tres réplicas de la http-echo
aplicación, con un mensaje personalizado ( Echo!
) que se pasa. El servicio se define para permitir el acceso a los pods en la implementación a través del puerto 80
. El ingreso se configura para exponer el servicio en su dominio.
Reemplace echo.your_domain
con su dominio, luego guarde y cierre el archivo.
Ahora ya no es necesario que configures los registros DNS del dominio de forma manual. ExternalDNS lo hará automáticamente tan pronto como apliques la configuración a Kubernetes.
Para aplicar la configuración, ejecute el siguiente comando:
- kubectl create -f echo.yaml
Recibirás el siguiente resultado:
Outputingress.extensions/echo-ingress createdservice/echo createddeployment.apps/echo created
Deberá esperar un breve período de tiempo para que ExternalDNS detecte los cambios y cree los registros DNS adecuados. La interval
configuración en el gráfico de Helm determina el tiempo que deberá esperar para la creación de su registro DNS. En externaldns-values.yaml
, la duración del intervalo está establecida en 1 minuto de manera predeterminada.
Puede visitar su Panel de control de DigitalOcean para encontrar un registro A y TXT.
Una vez transcurrido el intervalo de tiempo especificado, o encuentre los registros en el Panel de Control, acceda a su dominio mediante curl
:
- curl echo.your_domain
Recibirás el siguiente resultado:
OutputEcho!
Este mensaje confirma que has configurado ExternalDNS y has creado los registros DNS necesarios para apuntar al balanceador de carga del controlador de ingreso de Nginx. Si tienes un mensaje de error, espera un poco. O bien, puedes intentar acceder a tu dominio desde tu navegador, donde recibirás un mensaje de error Echo!
.
Ha probado ExternalDNS implementando una aplicación de ejemplo con un Ingress. También puede observar los nuevos registros DNS en su Panel de control de DigitalOcean. En el siguiente paso, expondrá el servicio en su nombre de dominio.
Paso 3 (opcional): Exponer la aplicación mediante un servicio
En esta sección opcional, utilizará Servicios con ExternalDNS en lugar de Ingresses. ExternalDNS le permite poner distintos recursos de Kubernetes a disposición de los servidores DNS. El uso de Servicios es un proceso similar al de Ingresses con la configuración modificada para este recurso alternativo.
Nota: al seguir este paso se eliminarán los registros DNS que acaba de crear.
Dado que personalizará el servicio incluido en echo.yaml
, ya no lo necesitará echo-ingress
. Elimínelo con el siguiente comando:
- kubectl delete ing echo-ingress
La salida será:
Outputingress.extensions/echo-ingress deleted
ExternalDNS eliminará los registros DNS existentes que creó en el paso anterior. En el resto del paso, podrá utilizar el mismo dominio que utilizó antes.
A continuación, abra el echo.yaml
archivo para editarlo:
- nano echo.yaml
Reemplace el contenido del archivo con las siguientes líneas:
eco.yaml
apiVersion: v1kind: Servicemetadata: name: echo annotations: external-dns.alpha.kubernetes.io/hostname: echo.your_domainspec: type: LoadBalancer ports: - port: 80 targetPort: 5678 selector: app: echo---apiVersion: apps/v1kind: Deploymentmetadata: name: echospec: selector: matchLabels: app: echo replicas: 3 template: metadata: labels: app: echo spec: containers: - name: echo image: hashicorp/http-echo args: - "-text=Echo!" ports: - containerPort: 5678
Ha eliminado Ingress del archivo de la configuración anterior y ha cambiado el tipo de servicio a LoadBalancer
. Además, ha añadido una anotación que especifica el nombre de dominio para ExternalDNS.
Aplique los cambios a su clúster ejecutando el siguiente comando:
- kubectl apply -f echo.yaml
La salida será:
Output...service/echo configureddeployment.apps/echo configured
Puede comprobar que el balanceador de carga del servicio esté disponible ejecutando:
- kubectl get svc echo -w
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEecho LoadBalancer 10.245.81.235 pending 80:31814/TCP 8s...
Al igual que en el paso anterior, deberá esperar un tiempo para que se creen y propaguen los registros DNS. Una vez hecho esto, curl
el dominio que especificó:
- curl echo.your_domain
El resultado será el mismo que el paso anterior:
OutputEcho!
Si recibe un error, espere un poco más o pruebe con otro dominio. Dado que los registros DNS se almacenan en caché en los sistemas cliente, es posible que los cambios tarden mucho tiempo en propagarse.
En este paso, creó un Servicio (de tipo LoadBalancer
) y lo apuntó a su nombre de dominio mediante ExternalDNS.
Conclusión
ExternalDNS funciona de forma silenciosa en segundo plano y ofrece una experiencia sin inconvenientes. Su clúster de Kubernetes se ha convertido en la fuente central de información sobre los dominios. Ya no tendrá que actualizar manualmente los registros DNS.
El verdadero poder de ExternalDNS se hará evidente al crear entornos de prueba a partir de un sistema de entrega continua. Si desea configurar un sistema de este tipo en su clúster de Kubernetes, visite Cómo configurar una canalización de CD con Spinnaker en DigitalOcean Kubernetes .
Deja una respuesta