Cómo gestionar automáticamente los registros DNS desde DigitalOcean Kubernetes mediante ExternalDNS

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de ExternalDNS mediante Helm
  • Paso 2: Implementación y exposición de una aplicación web de ejemplo
  • Paso 3 (opcional): Exponer la aplicación mediante un servicio
  • Conclusión
  • 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 kubectlpredeterminada. Las instrucciones sobre cómo configurarlo kubectlse 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 publishServicepropiedad truesegú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_domainen 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.yamlarchivo 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:

    1. 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 policyconfiguració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 domainFilterspará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:

    1. helm repo add bitnami https://charts.bitnami.com/bitnami

    Luego, actualice el caché de Helm para descargar su contenido:

    1. helm repo update

    Por último, instale ExternalDNS en su clúster ejecutando lo siguiente:

    1. 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:

    1. 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-echode 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:

    1. 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-echoaplicació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_domaincon 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:

    1. 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 intervalconfiguració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:

    1. 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:

    1. 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.yamlarchivo para editarlo:

    1. 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:

    1. 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:

    1. 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, curlel dominio que especificó:

    1. 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 .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion