Instalar ExternalDNS para la detección de servicios

En este tema se explica cómo implementar ExternalDNS en un clúster de carga de trabajo en Tanzu Kubernetes Grid.

ExternalDNS

El servicio ExternalDNS publica registros de DNS para las aplicaciones en los servidores DNS mediante una interfaz declarativa nativa de Kubernetes. Se empaqueta como un paquete administrado por CLI en Tanzu Kubernetes Grid.

Requisitos previos

  • Una máquina de arranque que tenga instalado lo siguiente:
  • Ha determinado los nombres de dominio completos (FQDN) para los servicios que desea exponer con ExternalDNS en el servidor DNS.

Preparar el clúster para la implementación de ExternalDNS

El servicio ExternalDNS debe implementarse en el mismo clúster que los servicios para los que exportará registros de DNS.

Para instalar Harbor, siga los requisitos previos y el procedimiento descritos en Instalar Harbor para el registro de servicios.

  • ExternalDNS admite la creación de registros para los servicios de Kubernetes y los recursos HTTPProxy de Contour. Si desea crear registros para los recursos HTTPProxy de Contour en un clúster de carga de trabajo, debe instalar el paquete de Contour en el clúster. Para obtener instrucciones, consulte Instalar Contour para el control de entrada. Harbor también requiere el paquete de Contour.

Preparar el archivo de configuración para el paquete de ExternalDNS

El paquete de ExternalDNS se validó con AWS (ruta 53), DNS de Azure y RFC2136 (BIND). La configuración proporcionada a continuación exporta registros para los recursos de Contour HTTPProxy y Services Kubernetes de tipo LoadBalancer.

La comunidad de DNS externo mantiene las integraciones con muchos proveedores de DNS en distintos niveles de estabilidad. Excepto cuando se indique lo contrario, VMware no garantiza la compatibilidad con la integración del paquete ExternalDNS con proveedores específicos.

AWS (ruta 53)

  1. Cree una zona hospedada dentro de la ruta 53 con el dominio que utilizarán los servicios.
  2. Registre el identificador de zona alojada. Utilizará este identificador más adelante al configurar ExternalDNS.
  3. Cree una directiva de IAM para ExternalDNS que permita que ExternalDNS actualice la ruta 53. En la consola de AWS, vaya al panel de control de IAM y, en Administración de acceso, desplácese hasta la pantalla Directivas. Haga clic en Crear directiva y cambie a la pestaña JSON. Pegue la siguiente directiva. Si es necesario, puede ajustar la directiva para permitir actualizaciones en la zona alojada que acaba de crear. Finalice el asistente.

    {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "route53:ChangeResourceRecordSets"
         ],
         "Resource": [
           "arn:aws:route53:::hostedzone/*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "route53:ListHostedZones",
           "route53:ListResourceRecordSets"
         ],
         "Resource": [
           "*"
         ]
       }
     ]
    }
    
  4. Cree un usuario de IAM para ExternalDNS con la directiva que creó anteriormente. En la consola de AWS, vaya a la pantalla Usuarios y haga clic en Agregar usuarios. Proporcione un nombre para el usuario de IAM y asegúrese de que Programar acceso esté habilitado. En la pantalla Permisos del asistente, haga clic en Asociar directivas existentes directamente y seleccione la directiva que creó en el paso anterior.

  5. Continúe a la página final del asistente. Registre el identificador de clave de acceso y la clave de acceso secreta. Para que estas credenciales de la ruta 53 estén disponibles para ExternalDNS, cree un secreto de Kubernetes en el espacio de nombres donde se ejecutará ExternalDNS.

    1. Establezca el contexto de kubectl en el clúster en el que va a implementar ExternalDNS. Por ejemplo:

      kubectl config use-context tkg-services-admin@tkg-services
      
    2. Cree el espacio de nombres tanzu-system-service-discovery si aún no existe:

      kubectl create namespace tanzu-system-service-discovery
      
    3. Cree el secreto de Kubernetes:

      kubectl -n tanzu-system-service-discovery create secret generic route53-credentials \
      --from-literal=aws_access_key_id=YOUR-ACCESS-KEY-ID \
      --from-literal=aws_secret_access_key=YOUR-SECRET-ACCESS-KEY
      

      Donde YOUR-ACCESS-KEY-ID y YOUR-SECRET-ACCESS-KEY son las credenciales que registró anteriormente.

  6. Cree un archivo de configuración para la configuración de ExternalDNS. Este archivo configura el paquete ExternalDNS.

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --generate-default-values-file
    

    Donde PACKAGE-VERSION es la versión del paquete ExternalDNS que desea instalar. El comando anterior creará un archivo denominado external-dns-default-values.yaml para contener los siguientes valores:

    ---
    
    # Namespace in which to deploy ExternalDNS pods.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
     args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-owner-id=HOSTED-ZONE-ID
       - --txt-prefix=txt # Disambiguates TXT records from CNAME records.
       - --provider=aws
       - --aws-zone-type=public # Looks only at public hosted zones. Valid values are public, private, or no value for both.
       - --aws-prefer-cname
     env:
       - name: AWS_ACCESS_KEY_ID
         valueFrom:
           secretKeyRef:
             name: route53-credentials
             key: aws_access_key_id
       - name: AWS_SECRET_ACCESS_KEY
         valueFrom:
           secretKeyRef:
             name: route53-credentials
             key: aws_secret_access_key
     securityContext: {}
     volumeMounts: []
     volumes: []
    
  7. Reemplace los marcadores de posición del archivo external-dns-default-values.yaml por los valores. Para obtener más opciones de configuración, consulte la documentación ExternalDNS.

    Antes de establecer otras opciones de configuración en el archivo external-dns-default-values.yaml, revise el esquema de valores del paquete ExternalDNS. Para recuperar el esquema de valores, ejecute:

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    Donde AVAILABLE-VERSION es la versión del paquete ExternalDNS. La marca --values-schema recupera la sección valuesSchema del recurso de API Package para el paquete ExternalDNS. Puede establecer el formato de salida, --output, para el esquema de valores en yaml, json o table. Para obtener más información, consulte Paquetes en Instalar y administrar paquetes.

Servidor RFC2136 (BIND)

El proveedor RFC2136 permite utilizar cualquier servidor DNS compatible con RFC2136 como proveedor para ExternalDNS, como BIND.

  1. Solicite o cree una clave TSIG para el servidor. Esta clave debe estar autorizada para actualizar y transferir la zona que desea actualizar. La clave debe ser similar al siguiente mensaje:

    key "externaldns-key" {
     algorithm hmac-sha256;
     secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
    };
    

    Si administra su propio servidor DNS, puede crear una clave TSIG mediante el comando tsig-keygen -a hmac-sha256 externaldns. Copie los resultados en la configuración de los servidores DNS. Por ejemplo, para BIND, agregue la clave al archivo named.conf y configure la zona con los campos allow-transfer y update-policy. Por ejemplo:

    key "externaldns-key" {
     algorithm hmac-sha256;
     secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
    };
    zone "k8s.example.org" {
     type master;
     file "/etc/bind/zones/k8s.zone";
         allow-transfer {
           key "externaldns-key";
         };
         update-policy {
           grant externaldns-key zonesub ANY;
         };
    };
    

    En lo anterior, se supone que también tiene un archivo de zona similar al siguiente:

    $TTL 60 ; 1 minute
    @         IN SOA  k8s.example.org.  root.k8s.example.org. (
                     16  ; serial
                     60  ; refresh (1 minute)
                     60  ; retry (1 minute)
                     60  ; expire (1 minute)
                     60  ; minimum (1 minute)
                     )
               NS   ns.k8s.example.org.
    ns           A    1.2.3.4
    
  2. Cree un archivo de configuración para la configuración de ExternalDNS. Este archivo configura el paquete ExternalDNS.

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --generate-default-values-file
    

    Donde PACKAGE-VERSION es la versión del paquete ExternalDNS que desea instalar. El comando anterior creará un archivo denominado external-dns-default-values.yaml para contener los siguientes valores:

    ---
    
    # Namespace in which to deploy ExternalDNS pods.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
     args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # For example, k8s.example.org. Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-owner-id=k8s
       - --txt-prefix=external-dns- # Disambiguates TXT records from CNAME records.
       - --provider=rfc2136
       - --rfc2136-host=IP-ADDRESS-OF-RFC2136-DNS-SERVER
       - --rfc2136-port=53
       - --rfc2136-zone=DNS-ZONE # For example, k8s.example.org.
       - --rfc2136-tsig-secret=TSIG-SECRET-FROM-STEP-1
       - --rfc2136-tsig-secret-alg=hmac-sha256
       - --rfc2136-tsig-keyname=TSIG-KEY-NAME # For example, externaldns-key.
       - --rfc2136-tsig-axfr
     env: []
     securityContext: {}
     volumeMounts: []
     volumes: []
    
  3. Reemplace los marcadores de posición del archivo external-dns-default-values.yaml por los valores. Para obtener más opciones de configuración, consulte la documentación ExternalDNS.

    Antes de establecer otras opciones de configuración en el archivo external-dns-default-values.yaml, revise el esquema de valores del paquete ExternalDNS. Para recuperar el esquema de valores, ejecute:

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    Donde AVAILABLE-VERSION es la versión del paquete ExternalDNS. La marca --values-schema recupera la sección valuesSchema del recurso de API Package para el paquete ExternalDNS. Puede establecer el formato de salida, --output, para el esquema de valores en yaml, json o table. Para obtener más información, consulte Paquetes en Instalar y administrar paquetes.

Microsoft Azure

  1. Inicie sesión en la CLI az:

    az login
    
  2. Establezca su suscripción:

    az account set -s SUBSCRIPTION-ID-GUID
    
  3. Cree una entidad de servicio:

    az ad sp create-for-rbac -n SERVICE-PRINCIPAL-NAME
    

    La salida JSON del comando tiene un aspecto similar al siguiente:

    {
      "appId": "a72a7cfd-7cb0-4b02-b130-03ee87e6ca89",
      "displayName": "foo",
      "name": "http://foo",
      "password": "515c55da-f909-4e17-9f52-236ffe1d3033",
      "tenant": "b35138ca-3ced-4b4a-14d6-cd83d9ea62f0"
    }
    
  4. Asigne permisos a la entidad de servicio:

    1. Recupere el identificador del grupo de recursos:

      az group show --name RESOURCE-GROUP --query id
      
    2. Asigne la función de lector a la entidad de servicio para el ámbito del grupo de recursos. Necesitará el appId del resultado del comando az ad sp create-for-rbac anterior.

      az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
      
    3. Recupere el identificador de la zona de DNS:

      az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
      
    4. Asigne la función de colaborador a la entidad de servicio para el ámbito de zona de DNS:

      az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
      
  5. Para conectar el servicio ExternalDNS al servicio DNS de Azure, cree un archivo de configuración denominado azure.json en la máquina local con contenido similar al siguiente:

    {
     "tenantId": "01234abc-de56-ff78-abc1-234567890def",
     "subscriptionId": "01234abc-de56-ff78-abc1-234567890def",
     "resourceGroup": "MyDnsResourceGroup",
     "aadClientId": "01234abc-de56-ff78-abc1-234567890def",
     "aadClientSecret": "uKiuXeiwui4jo9quae9o"
    }
    

    Reemplace los valores del ejemplo anterior por sus propios valores de la siguiente manera:

    • Para recuperar tenantId, puede ejecutar el comando az account show --query "tenantId".
    • Para recuperar subscriptionId, puede ejecutar el comando az account show --query "id".
    • resourceGroup es el nombre del grupo de recursos dentro del que se encuentra la zona de DNS.
    • aadClientId es el appId del resultado de la entidad de servicio.
    • aadClientSecret es la contraseña del resultado de la entidad de servicio.
  6. Para que las credenciales de Azure estén disponibles para ExternalDNS, cree un secreto de Kubernetes en el espacio de nombres donde se ejecutará ExternalDNS:

    1. Establezca el contexto de kubectl en el clúster en el que va a implementar ExternalDNS. Por ejemplo:

      kubectl config use-context tkg-services-admin@tkg-services
      
    2. Cree el espacio de nombres tanzu-system-service-discovery si aún no existe:

      kubectl create namespace tanzu-system-service-discovery
      
    3. Cree el secreto mediante el archivo de configuración azure.json del paso anterior:

      kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
      
  7. Cree un archivo de configuración para la configuración de ExternalDNS. Este archivo configura el paquete ExternalDNS.

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --generate-default-values-file
    

    Donde PACKAGE-VERSION es la versión del paquete ExternalDNS que desea instalar. El comando anterior creará un archivo denominado external-dns-default-values.yaml para contener los siguientes valores:

    ---
    
    # Namespace in which to deploy ExternalDNS.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
     args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # For example, k8s.example.org. Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-prefix=externaldns- # Disambiguates TXT records from CNAME records.
       - --provider=azure
       - --azure-resource-group=RESOURCE-GROUP # Azure resource group.
     env: []
     securityContext: {}
     volumeMounts:
       - name: azure-config-file
         mountPath: /etc/kubernetes
         readOnly: true
     volumes:
       - name: azure-config-file
         secret:
           secretName: azure-config-file
    
  8. Reemplace los marcadores de posición del archivo external-dns-default-values.yaml por los valores. Para obtener más opciones de configuración, consulte Configuración de ExternalDNS para servicios en Azure en la documentación de ExternalDNS.

    Antes de establecer otras opciones de configuración en el archivo external-dns-default-values.yaml, revise el esquema de valores del paquete ExternalDNS. Para recuperar el esquema de valores, ejecute:

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    Donde AVAILABLE-VERSION es la versión del paquete ExternalDNS. La marca --values-schema recupera la sección valuesSchema del recurso de API Package para el paquete ExternalDNS. Puede establecer el formato de salida, --output, para el esquema de valores en yaml, json o table. Para obtener más información, consulte Paquetes en Instalar y administrar paquetes.

Instalar el paquete ExternalDNS

  1. Establezca el contexto de kubectl en el clúster en el que va a implementar ExternalDNS. Por ejemplo:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. Si aún no lo ha hecho, agregue el repositorio de paquetes estándar al clúster:

    tanzu package repository add tanzu-standard --url projects.registry.vmware.com/tkg/packages/standard/repo:v1.6.0 --namespace tkg-system
    
  3. Recupere el nombre del paquete ExternalDNS:

    tanzu package available list -A
    
  4. Recupere la versión del paquete ExternalDNS:

    tanzu package available list external-dns.tanzu.vmware.com -A
    
  5. Antes de instalar el paquete, elimine todos los comentarios del archivo external-dns-default-values.yaml:

    yq -i eval '... comments=""' external-dns-default-values.yaml
    
  6. Instale el paquete:

    • Si el espacio de nombres de destino existe en el clúster, ejecute:

      tanzu package install external-dns \
      --package-name external-dns.tanzu.vmware.com \
      --version AVAILABLE-PACKAGE-VERSION \
      --values-file external-dns-default-values.yaml \
      --namespace TARGET-NAMESPACE
      

      Donde:

      • TARGET-NAMESPACE es el espacio de nombres en el que se desea instalar el paquete de ExternalDNS, la aplicación del paquete de ExternalDNS y cualquier otro recurso de Kubernetes que describa el paquete. Por ejemplo, el espacio de nombres my-packages o tanzu-cli-managed-packages. Si no se especifica la marca --namespace, la CLI de Tanzu utiliza el espacio de nombres default. Los pods de ExternalDNS y cualquier otro recurso asociado con el componente ExternalDNS se crean en el espacio de nombres tanzu-system-service-discovery; no instale el paquete de ExternalDNS en este espacio de nombres.
      • AVAILABLE-PACKAGE-VERSION es la versión que recuperó anteriormente.

      Por ejemplo:

      tanzu package install external-dns \
      --package-name external-dns.tanzu.vmware.com \
      --version 0.8.0+vmware.1-tkg.1 \
      --values-file external-dns-default-values.yaml \
      --namespace my-packages
      
    • Si el espacio de nombres de destino no existe en el clúster, ejecute:

      tanzu package install external-dns \
      --package-name external-dns.tanzu.vmware.com \
      --version AVAILABLE-PACKAGE-VERSION \
      --values-file external-dns-default-values.yaml \
      --namespace TARGET-NAMESPACE \
      --create-namespace
      

      Donde:

      • TARGET-NAMESPACE es el espacio de nombres en el que se desea instalar el paquete de ExternalDNS, la aplicación del paquete de ExternalDNS y cualquier otro recurso de Kubernetes que describa el paquete. Por ejemplo, el espacio de nombres my-packages o tanzu-cli-managed-packages. Si no se especifica la marca --namespace, la CLI de Tanzu utiliza el espacio de nombres default. Los pods de ExternalDNS y cualquier otro recurso asociado con el componente ExternalDNS se crean en el espacio de nombres tanzu-system-service-discovery; no instale el paquete de ExternalDNS en este espacio de nombres.
      • AVAILABLE-PACKAGE-VERSION es la versión que recuperó anteriormente.

      Por ejemplo:

      tanzu package install external-dns \
      --package-name external-dns.tanzu.vmware.com \
      --version 0.8.0+vmware.1-tkg.1 \
      --values-file external-dns-default-values.yaml \
      --namespace my-packages \
      --create-namespace
      
  7. Confirme que se haya instalado el paquete external-dns:

    tanzu package installed list -A
    

    Para ver más detalles sobre el paquete, también puede ejecutar:

    tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
    

    Donde PACKAGE-NAMESPACE es el espacio de nombres en el que está instalado el paquete external-dns.

  8. Confirme que la aplicación external-dns se haya conciliado correctamente en su PACKAGE-NAMESPACE:

    kubectl get apps -A
    

    Si el estado no es Reconcile Succeeded, consulte los detalles del estado completo de la aplicación external-dns. Ver el estado completo puede ayudarle a solucionar el problema.

    kubectl get app external-dns --namespace PACKAGE-NAMESPACE -o yaml
    

    Donde PACKAGE-NAMESPACE es el espacio de nombres en el que se instaló el paquete. Si la solución de problemas no le ayuda a solucionar el problema, debe desinstalar el paquete antes de volver a instalarlo:

    tanzu package installed delete external-dns --namespace PACKAGE-NAMESPACE
    
  9. Confirme que los pods de ExternalDNS se estén ejecutando en el espacio de nombres tanzu-system-service-discovery:

    kubectl get pods -A
    

Validando ExternalDNS

Si se configura con Contour, ExternalDNS observará automáticamente el espacio de nombres especificado para los recursos de HTTPProxy y creará registros de DNS para los servicios con nombres de host que coincidan con el filtro de dominio configurado.

ExternalDNS también buscará automáticamente los servicios de Kubernetes con la anotación external-dns.alpha.kubernetes.io/hostname y creará registros de DNS para los servicios cuyas anotaciones coincidan con el filtro de dominio configurado.

Por ejemplo, para un servicio con la anotación external-dns.alpha.kubernetes.io/hostname: foo.k8s.example.org, ExternalDNS creará un registro de DNS para foo.k8s.example.org. Puede validar que el registro existe examinando la zona que creó.

Actualizar una implementación de ExternalDNS en ejecución

Si necesita realizar cambios en la configuración del paquete de ExternalDNS después de la implementación, siga estos pasos para actualizar el paquete de ExternalDNS implementado.

  1. Actualice la configuración de ExternalDNS en external-dns-default-values.yaml.

  2. Actualiza la configuración del paquete instalado:

    tanzu package installed update external-dns \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file external-dns-default-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    Donde:

    • INSTALLED-PACKAGE-VERSION es la versión del paquete ExternalDNS instalado.
    • INSTALLED-PACKAGE-NAMESPACE es el espacio de nombres en el que está instalado el paquete ExternalDNS.

    Por ejemplo:

    tanzu package installed update external-dns \
    --version 0.8.0+vmware.1-tkg.1 \
    --values-file external-dns-default-values.yaml \
    --namespace my-packages
    

El paquete de ExternalDNS se conciliará con el nuevo valor o los valores que agregó. kapp-controller puede tardar hasta cinco minutos en aplicar los cambios.

Para obtener más información sobre el comando tanzu package installed update, consulte Actualizar un paquete en Instalar y administrar paquetes. Puede usar este comando para actualizar la versión o la configuración de un paquete instalado.

check-circle-line exclamation-circle-line close-line
Scroll to top icon