El DNS externo permite configurar registros de DNS de forma dinámica en función de los servicios con carga equilibrada de Kubernetes. Puede implementar la extensión TKG para DNS externo a fin de proporcionar la detección dinámica de servicios para el clúster.

Requisitos previos de la extensión

Cumpla los siguientes requisitos antes de implementar la extensión TKG v1.3.1 para DNS externo.

Otros requisitos

Las configuraciones de muestra proporcionadas con la extensión DNS externo incluyen ejemplos con y sin el controlador de entrada de Contour. Si utiliza Contour, instálelo antes de instalar la extensión DNS externo. Consulte Implementar y administrar la extensión TKG para la entrada de Contour.

La extensión DNS externo permite la detección dinámica de servicios. Un caso de uso común es con el registro de Harbor. Harbor requiere una zona de DNS configurada en un proveedor de DNS dinámico compatible con RFC 2136, como AWS Route53, Azure DNS, Google Cloud DNS o un servidor DNS local como BIND. Consulte Implementar y administrar la extensión TKG para el registro de Harbor.

Implementar la extensión DNS externo

Complete los siguientes pasos antes de instalar la extensión TKG v1.3.1 para DNS externo.

  1. Cambie el directorio en el que descargó los archivos de la extensión DNS externo.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. Cree el espacio de nombres y varios objetos de control de acceso basado en funciones para usarlos con la extensión DNS externo.
    kubectl apply -f namespace-role.yaml

    Este comando crea el espacio de nombres tanzu-system-service-discovery y los objetos RBAC asociados. Ejecute kubect get ns para comprobarlos.

  3. Cree un archivo de valores de datos. El archivo de valores de datos de ejemplo proporciona la configuración mínima que se pide.

    Hay archivos de valores de datos de ejemplo para AWS, Azure y un proveedor de DNS dinámico compatible con RFC 2136; cada uno con y sin entrada de Contour. Elija el archivo de ejemplo adecuado y cópielo.

    Por ejemplo, si utiliza AWS Route 53 con Contour, ejecute el siguiente comando.
    cp external-dns-data-values-aws-with-contour.yaml.example external-dns-data-values-aws-with-contour.yaml
    O bien, si utiliza Azure con Contour, ejecute el siguiente comando.
    cp external-dns-data-values-azure-with-contour.yaml.example external-dns-data-values-azure-with-contour.yaml
  4. Configure los valores de datos de DNS externos.

    Por ejemplo, a continuación se muestra la configuración de DNS de Azure. Proporcione los valores de domain-filter y azure-resource-group.

    #@data/values
    #@overlay/match-child-defaults missing_ok=True
    ---
    externalDns:
      image:
        repository: projects.registry.vmware.com/tkg
      deployment:
        #@overlay/replace
        args:
        - --provider=azure
        - --source=service
        - --source=ingress
        - --domain-filter=my-zone.example.org #! zone where services are deployed
        - --azure-resource-group=my-resource-group #! Azure resource group
        #@overlay/replace
        volumeMounts:
        - name: azure-config-file
          mountPath: /etc/kubernetes
          readOnly: true
        #@overlay/replace
        volumes:
        - name: azure-config-file
          secret:
            secretName: azure-config-file
  5. Cree un secreto genérico con el archivo de valores de datos que ha rellenado.

    Por ejemplo, el siguiente comando crea el secreto mediante el archivo de valores de datos DNS de Azure.

    kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values-azure-with-contour.yaml -n tanzu-system-service-discovery

    Debería ver que secret/external-dns-data-values created se ha creado en el espacio de nombres tanzu-system-service-discovery. Puede verificarlo con el comando kubectl get secrets -n tanzu-system-service-discovery.

  6. Implemente la extensión DNS externo.
    kubectl apply -f external-dns-extension.yaml

    Si todo es correcto, debería ver app.kappctrl.k14s.io/external-dns created.

  7. Compruebe el estado de la implementación de la extensión.
    kubectl get app external-dns -n tanzu-system-service-discovery
    El estado de la aplicación debe cambiar de Reconciling a Reconcile succeeded una vez que DNS externo se implemente correctamente. Si el estado es Reconcile failed, consulte Solucionar problemas de la implementación.
  8. Ver estado detallado.
    kubectl get app external-dns -n tanzu-system-service-discovery -o yaml

Solucionar problemas de la implementación

Si se produce un error en la reconciliación, ejecute el comando kubectl get pods -A para ver el estado de los pods. En condiciones normales, debería ver que el estado del pod external-dns-XXXXX es Running. Si se produce un error en la reconciliación o el estado del pod es ImagePullBackOff o ImagecRashLoopBackOff, quiere decir que no se pudo extraer la imagen del contenedor del repositorio. Compruebe la dirección URL del repositorio en los valores de datos y los archivos YAML de extensión, y asegúrese de que sean precisos.

Para comprobar los registros del contenedor, ejecute los siguientes comandos, donde name-XXXX es el nombre único del pod que puede ver cuando ejecuta kubectl get pods -A:
kubectl logs pod/external-dns-XXXXX -c external-dns -n tanzu-system-service-discovery

Actualizar la extensión DNS externo

Actualice la extensión DNS externo que está implementada en el clúster de Tanzu Kubernetes.

  1. Obtenga los valores de datos de Contour del secreto.
    kubectl get secret external-dns-data-values -n tanzu-system-service-discovery -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > external-dns-data-values.yaml
  2. Actualice los valores de datos de DNS externo en external-dns-data-values.yaml. Consulte Configurar la extensión DNS externo.
  3. Actualice el secreto de los valores de datos de Contour.
    kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values.yaml -n tanzu-system-service-discovery -o yaml --dry-run | kubectl replace -f-
    La extensión DNS externo se conciliará con los nuevos valores de datos.
    Nota: De forma predeterminada, kapp-controller sincronizará las aplicaciones cada 5 minutos. La actualización debería tener efecto en 5 minutos o menos. Si desea que la actualización se aplique inmediatamente, cambie los valores de syncPeriod en external-dns-extension a un valor menor y aplique la extensión de Contour mediante kubectl apply -f external-dns-extension.
  4. Compruebe el estado de la extensión.
    kubectl get app external-dns -n tanzu-system-service-disovery

    El estado de la aplicación debe cambiar a Reconcile Succeeded una vez que se actualice.

  5. Vea el estado detallado y solucione los problemas.
    kubectl get app external-dns -n tanzu-system-service-disovery -o yaml

Eliminar la extensión DNS externo

Elimine la extensión DNS externo de un clúster de Tanzu Kubernetes.

Nota: Complete los pasos en orden. No elimine los objetos de función ni el espacio de nombres de destino antes de eliminar la aplicación y la extensión. Al eliminar el espacio de nombres y los objetos de función, se elimina la cuenta de servicio que utiliza kapp-controller. Si esta cuenta de servicio se elimina antes de eliminar la aplicación y la extensión, se pueden producir errores en el sistema.
  1. Cambie el directorio en el que descargó los archivos de la extensión.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. Elimine la extensión DNS externo.
    kubectl delete -f external-dns-extension.yaml
  3. Compruebe que la extensión se haya eliminado.
    kubectl get app contour -n tanzu-system-ingress

    Resultado esperado: el estado de la aplicación es Not Found.

  4. Elimine el espacio de nombres.
    Solo después de confirmar que la aplicación y la extensión Contour se han eliminado completamente se pueden eliminar de forma segura los objetos de función y espacio de nombres.
    kubectl delete -f namespace-role.yaml
    Resultado esperado: se elimina el espacio de nombres donde está implementada la extensión y los objetos de control de acceso basado en funciones asociados.

Configurar la extensión DNS externo

La extensión DNS externo se puede configurar con parámetros personalizados.

Configure los parámetros de implementación para el proveedor de DNS externo. Consulte el sitio de Kubernetes https://github.com/kubernetes-sigs/external-dns#running-externaldns para obtener más instrucciones.
Tabla 1. Parámetros de configuración de la extensión Harbor
Parámetro Descripción Tipo Predeterminado
externalDns.namespace Espacio de nombres en el que se implementará el DNS externo string tanzu-system-service-discovery
externalDns.image.repository Repositorio que contiene la imagen de DNS externo string projects.registry.vmware.com/tkg
externalDns.image.name Nombre de external-dns string external-dns
externalDns.image.tag Etiqueta de la imagen de DNS externo string v0.7.4_vmware.1
externalDns.image.pullPolicy Directiva de extracción de la imagen de DNS externo string IfNotPresent
externalDns.deployment.annotations Anotaciones en la implementación de external-dns map<string,string> {}
externalDns.deployment.args Argumentos transmitidos a través de la línea de comandos a external-dns list<string> [] (parámetro obligatorio)
externalDns.deployment.env Variables de entorno que se transferirán a external-dns list<string> []
externalDns.deployment.securityContext Contexto de seguridad del contenedor de DNS externo SecurityContext {}
externalDns.deployment.volumeMounts Montajes de volumen del contenedor de external-dns list<VolumeMount> []
externalDns.deployment.volumes Volúmenes del pod de DNS externo list<Volume> []