Usar Cloud DNS para GKE

En este documento se explica cómo configurar y usar Cloud DNS como proveedor de DNS para tus clústeres de Google Kubernetes Engine (GKE).

Cloud DNS gestiona automáticamente los registros DNS de tus servicios de Kubernetes. De forma predeterminada, solo se puede acceder a estos registros desde tu clúster (ámbito del clúster).

Si necesitas resolver servicios sin encabezado desde fuera de tu clúster, como desde VMs de Compute Engine, debes habilitar el ámbito de VPC o el ámbito de VPC aditivo.

Este documento está dirigido a usuarios de GKE, incluidos desarrolladores, administradores y arquitectos. Para obtener más información sobre los roles y las tareas de ejemplo habituales en Google Cloud, consulta Roles y tareas de usuario habituales de GKE Enterprise.

Para sacar el máximo partido a este documento, debes tener conocimientos de lo siguiente:

Para que se pueda acceder a los servicios ClusterIP o NodePort desde fuera del clúster, debes exponer el servicio mediante un LoadBalancer u otro método, y registrar su dirección IP externa en Cloud DNS.

Para obtener más información sobre cómo usar kube-dns como proveedor de DNS, consulta Detección de servicios y DNS.

Para saber cómo usar una versión personalizada de kube-dns o un proveedor de DNS personalizado, consulta Configurar un despliegue personalizado de kube-dns.

Precios

Cuando Cloud DNS es el proveedor de DNS de los clústeres Estándar de GKE, las consultas de DNS de los pods que están dentro del clúster de GKE se facturan de acuerdo con los precios de Cloud DNS.

Las consultas a una zona DNS con ámbito de VPC gestionada por GKE se facturan con los precios estándar de Cloud DNS.

Restricciones y limitaciones

Se aplican las siguientes limitaciones:

  • El ámbito de VPC no se admite en los clústeres de Autopilot; solo se admite el ámbito de clúster. Si necesitas resolver nombres de servicio sin encabezado que se ejecutan en clústeres de Autopilot de GKE, debes usar el ámbito de VPC aditivo.
  • Solo puedes habilitar el ámbito de VPC aditivo en clústeres de GKE Autopilot al crear el clúster. No se puede habilitar ni inhabilitar el ámbito de VPC aditivo en clústeres Autopilot de GKE.
  • No se pueden crear clústeres de ámbito de VPC aditivos en proyectos de servicio de redes de VPC compartidas.
  • Cloud DNS para GKE no está disponible para Assured Workloads con un régimen de cumplimiento de IL4. kube-dns es obligatorio en estos entornos regulados.
  • No se admiten los cambios manuales en las zonas DNS privadas gestionadas, ya que el controlador de Cloud DNS los sobrescribe. Las modificaciones en los registros DNS de esas zonas no se conservan cuando se reinicia el controlador.
  • Después de habilitar Cloud DNS para GKE en un clúster, kube-dns sigue ejecutándose en el clúster. Puedes inhabilitar kube-dns escalando la implementación de kube-dns y el autoescalador a cero.
  • No puedes cambiar el ámbito de DNS en un clúster después de haber definido el ámbito con la marca --cluster-dns-scope. Si necesitas cambiar el ámbito de DNS, debes volver a crear el clúster con un ámbito de DNS diferente.
  • Se aplican las limitaciones de los recursos de Cloud DNS. En concreto, solo se puede vincular una zona de política de respuesta a una red de VPC a la vez. En el caso de los ámbitos de VPC y de VPC aditivos, la creación del clúster falla si ya hay una zona de política de respuesta que no sigue la convención de nomenclatura que está vinculada a la red de VPC del clúster.
  • Las configuraciones de dominios stub personalizados y servidores DNS upstream se aplican a las configuraciones de DNS de pods y nodos. Los pods que usan la red del host o los procesos que se ejecutan directamente en el host también usan el dominio stub y las configuraciones del servidor de nombres upstream. Este comportamiento solo se admite en el estándar.
  • Los dominios stub personalizados y los servidores de nombres upstream que se configuran a través del kube-dns ConfigMap se aplican automáticamente a Cloud DNS para el DNS de ámbito de clúster. El DNS de ámbito de VPC ignora el kube-dns ConfigMap y debes aplicar estas configuraciones directamente en Cloud DNS. Este comportamiento solo se admite en el modo Estándar.
  • Migrar de kube-dns a un ámbito de VPC es una operación disruptiva. Vuelve a crear el clúster cuando cambies del ámbito kube-dns al de VPC o viceversa.
  • En el caso del ámbito de VPC, el intervalo de direcciones IP secundarias de los servicios no debe compartirse con ningún otro clúster de esa subred.
  • En el caso del ámbito de VPC, la política de respuesta asociada a un registro PTR se adjunta a la red de VPC. Si se vinculan otras políticas de respuesta a la red del clúster, no se podrá resolver el registro PTR de las direcciones IP de los servicios de Kubernetes.
  • Si intentas crear un servicio sin interfaz con un número de pods que supere la cuota permitida, Cloud DNS no creará conjuntos de registros ni registros para el servicio.
  • Los nombres de servicios y puertos tienen un límite de 62 caracteres, aunque las etiquetas DNS pueden tener un máximo de 63 caracteres. Esto se debe a que GKE añade un prefijo de guion bajo a los registros DNS.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
  • Habilita la API Cloud DNS en tu proyecto:

    Habilitar la API de Cloud DNS

  • Para usar Cloud DNS en el ámbito del clúster, necesitas una de las siguientes versiones:

    • En Standard: GKE 1.24.7-gke.800 o 1.25.3-gke.700, o versiones posteriores.
    • Autopilot: versiones 1.25.9-gke.400 o 1.26.4-gke.500 de GKE, o posteriores.
    • Tener instalada la versión 411.0.0 o una posterior de la CLI de Google Cloud.
  • Para usar Cloud DNS en el ámbito de VPC aditivo, necesitas una de las siguientes versiones:

    • GKE 1.28.3-gke.1430000 o una versión posterior.
    • Tener instalada la versión 503.0.0 o una posterior de Google Cloud CLI.

Habilitar el DNS de ámbito de clúster

En el DNS de ámbito de clúster, solo los nodos que se ejecutan en el clúster de GKE pueden resolver nombres de servicio, y los nombres de servicio no entran en conflicto entre clústeres. Este comportamiento es el mismo que el de kube-dns en los clústeres de GKE, lo que significa que puedes migrar clústeres de kube-dns al ámbito de clúster de Cloud DNS sin tiempo de inactividad ni cambios en tus aplicaciones.

En el siguiente diagrama se muestra cómo crea Cloud DNS una zona de DNS privada para un clúster de GKE. Solo los procesos y los pods que se ejecutan en los nodos del clúster pueden resolver los registros DNS del clúster, ya que solo los nodos están en el ámbito del DNS.

Pods en nodos diferentes que resuelven servicios en el clúster de GKE.
Diagrama: DNS de ámbito de clúster

Habilitar el ámbito de clúster en un clúster nuevo

Los nuevos clústeres de Autopilot de las versiones 1.25.9-gke.400, 1.26.4-gke.500 o posteriores tienen de forma predeterminada el ámbito de clúster de Cloud DNS. En la siguiente sección se muestra cómo habilitar el ámbito de clúster en un clúster estándar nuevo.

Crear un clúster estándar con el ámbito de clúster habilitado

Puedes crear un clúster estándar de GKE con el permiso de clúster de Cloud DNS habilitado mediante la CLI de gcloud o la Google Cloud consola:

gcloud

Crea un clúster con la marca --cluster-dns:

gcloud container clusters create CLUSTER_NAME \
    --cluster-dns=clouddns \
    --cluster-dns-scope=cluster \
    --location=COMPUTE_LOCATION

Haz los cambios siguientes:

La marca --cluster-dns-scope=cluster es opcional en el comando porque cluster es el valor predeterminado.

Consola

  1. En la Google Cloud consola, ve a la página Crear un clúster de Kubernetes.

    Ir a Crear un clúster de Kubernetes

  2. En el panel de navegación, ve a Clúster y haz clic en Redes.

  3. En la sección Proveedor de DNS, haz clic en Cloud DNS.

  4. Selecciona Ámbito del clúster.

  5. Configura el clúster según sea necesario.

  6. Haz clic en Crear.

Habilitar el ámbito de clúster en un clúster disponible

No se puede migrar un clúster de Autopilot de kube-dns a un clúster de Cloud DNS. Para habilitar el ámbito de clúster de Cloud DNS, vuelve a crear los clústeres de Autopilot en las versiones 1.25.9-gke.400, 1.26.4-gke.500 o posteriores de GKE.

Puedes migrar un clúster estándar de kube-dns a un ámbito de clúster de Cloud DNS mediante la CLI de gcloud o laGoogle Cloud consola.

Cuando migras un clúster de kube-dns a Cloud DNS, debes volver a crear los nodos para que el cambio surta efecto. Migra los clústeres que ejecutan aplicaciones sin interrumpir la comunicación del clúster habilitando Cloud DNS como proveedor de DNS en cada grupo de nodos por separado. Un subconjunto de los nodos está operativo en todo momento porque algunos grupos de nodos usan kube-dns y otros usan Cloud DNS.

gcloud

  1. Actualiza el clúster:

    gcloud container clusters update CLUSTER_NAME \
        --cluster-dns=clouddns \
        --cluster-dns-scope=cluster \
        --location=COMPUTE_LOCATION
    

    Haz los cambios siguientes:

    La marca --cluster-dns-scope=cluster es opcional en el comando porque cluster es el valor predeterminado.

    La respuesta es similar a la siguiente:

    All the node-pools in the cluster need to be re-created by the user to start using Cloud DNS for DNS lookups. It is highly recommended to complete this step
    shortly after enabling Cloud DNS.
    Do you want to continue (Y/n)?
    

    Una vez que lo confirmes, el controlador de Cloud DNS se ejecutará en el plano de control de GKE. Sin embargo, tus pods no usarán Cloud DNS para la resolución de DNS hasta que actualices tu grupo de nodos o añadas grupos de nodos al clúster.

  2. Actualiza los grupos de nodos del clúster para que usen Cloud DNS:

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool=POOL_NAME \
        --location=COMPUTE_LOCATION
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster.
    • POOL_NAME: el nombre del grupo de nodos que se va a actualizar.

    Si el grupo de nodos y el plano de control tienen la misma versión, actualiza primero el plano de control, tal como se describe en Actualizar el plano de control manualmente. A continuación, actualiza el grupo de nodos.

    Confirma la respuesta y repite este comando en cada grupo de nodos del clúster. Si tu clúster tiene un grupo de nodos, omite la marca --node-pool.

Consola

  1. Ve a la página Google Kubernetes Engine en la Google Cloud consola.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que quieras modificar.

  3. En Redes, en el campo Proveedor de DNS, haz clic en Editar proveedor de DNS.

  4. Haz clic en Cloud DNS.

  5. Haz clic en Ámbito del clúster.

  6. Haz clic en Guardar cambios.

Habilitar el ámbito de VPC aditivo

En esta sección se describen los pasos para habilitar o inhabilitar el ámbito de VPC aditivo como complemento del ámbito de clúster de Cloud DNS.

Habilitar el ámbito de VPC aditivo en un clúster nuevo

Puedes habilitar el DNS de ámbito de VPC aditivo en un clúster de GKE nuevo mediante la CLI de gcloud o la Google Cloud consola.

Crear un clúster de Autopilot con un ámbito de VPC aditivo

gcloud container clusters create-auto CLUSTER_NAME \
    --additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster.
  • UNIQUE_CLUSTER_DOMAIN: el nombre de un dominio. Debe asegurarse de que este nombre sea único en la VPC, ya que GKE no confirma este valor. No puedes cambiar este valor una vez que lo hayas definido. No debes usar un dominio que termine en .local, ya que podrías tener problemas con la resolución de DNS.

Crear un clúster estándar con un ámbito de VPC aditivo

gcloud container clusters create CLUSTER_NAME \
    --cluster-dns=clouddns \
    --cluster-dns-scope=cluster \
    --additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN

La marca --cluster-dns-scope=cluster es opcional porque cluster es el valor predeterminado.

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster.
  • UNIQUE_CLUSTER_DOMAIN: el nombre de un dominio. Debe asegurarse de que este nombre sea único en la VPC, ya que GKE no confirma este valor. No puedes cambiar este valor una vez que lo hayas definido. No debes usar un dominio que termine en .local, ya que podrías tener problemas con la resolución de DNS.
En la consola de

Habilitar el ámbito de VPC aditivo en un clúster estándar

No se puede habilitar el ámbito de VPC aditivo en un clúster Autopilot.

Para habilitar el ámbito de VPC aditivo en un clúster Standard, ejecuta el siguiente comando:

gcloud container clusters update CLUSTER_NAME \
    --additive-vpc-scope-dns-domain=UNIQUE_CLUSTER_DOMAIN \
    --location=COMPUTE_LOCATION

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster.
  • UNIQUE_CLUSTER_DOMAIN: el nombre de un dominio. Debe asegurarse de que este nombre sea único en la VPC, ya que GKE no confirma este valor. No puedes cambiar este valor una vez que lo hayas definido. No debes usar un dominio que termine en .local, ya que podrías tener problemas con la resolución de DNS.
  • COMPUTE_LOCATION: la ubicación de Compute Engine del clúster.

Habilitar el DNS de ámbito de VPC

En el DNS de ámbito de VPC, los nombres de DNS de un clúster se pueden resolver en toda la VPC. Cualquier cliente de la VPC puede resolver registros DNS del clúster.

El DNS con ámbito de VPC permite los siguientes casos prácticos:

  • Descubrimiento de servicios sin encabezado para clientes que no son de GKE en la misma VPC.
  • Resolución de servicios de GKE desde clientes on-premise o de nubes de terceros. Para obtener más información, consulta la política de servidores entrantes.
  • Resolución de servicios en la que un cliente puede decidir con qué clúster comunicarse mediante el dominio DNS del clúster personalizado.

En el siguiente diagrama, dos clústeres de GKE usan DNS con ámbito de VPC en la misma VPC. Ambos clústeres tienen un dominio DNS personalizado, .cluster1 y .cluster2, en lugar del dominio .cluster.local predeterminado. Una máquina virtual se comunica con el servicio de backend sin interfaz gráfica resolviendo backend.default.svc.cluster1. Cloud DNS resuelve el servicio sin encabezado en las direcciones IP de los pods individuales del servicio, y la VM se comunica directamente con las direcciones IP de los pods.

Clientes que resuelven Servicios sin encabezado desde fuera del clúster de GKE.
Diagrama: DNS con ámbito de VPC

También puedes realizar este tipo de resolución desde otras redes cuando estén conectadas a la VPC a través de Cloud Interconnect o Cloud VPN. Las políticas de servidor DNS permiten que los clientes de las redes conectadas a la VPC resuelvan nombres en Cloud DNS, lo que incluye los servicios de GKE si el clúster usa DNS con ámbito de VPC.

Habilitar el ámbito de VPC en un clúster

La migración al ámbito de VPC solo se admite en el modo Estándar y no en el modo Autopilot.

Puedes migrar un clúster estándar de kube-dns a un ámbito de VPC de Cloud DNS mediante la gcloud CLI o la consola de Google Cloud .

Cuando migres al ámbito de VPC, debes volver a crear los nodos para que el cambio surta efecto.

gcloud

  1. Actualiza el clúster:

    gcloud container clusters update CLUSTER_NAME \
        --cluster-dns=clouddns \
        --cluster-dns-scope=vpc \
        --cluster-dns-domain=CUSTOM_DOMAIN \
        --location=COMPUTE_LOCATION
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster.
    • COMPUTE_LOCATION: la ubicación de Compute Engine del clúster.
    • CUSTOM_DOMAIN: el nombre de un dominio. Debe asegurarse de que este nombre sea único en la VPC, ya que GKE no confirma este valor. No puedes cambiar este valor una vez que lo hayas definido. No debes usar un dominio que termine en .local, ya que podrías tener problemas con la resolución de DNS.

    La respuesta es similar a la siguiente:

    All the node-pools in the cluster need to be re-created by the user to start using Cloud DNS for DNS lookups. It is highly recommended to complete this step
    shortly after enabling Cloud DNS.
    Do you want to continue (Y/n)?
    

    Una vez que lo confirmes, el controlador de Cloud DNS se ejecutará en el plano de control de GKE. Tus pods no usarán Cloud DNS para la resolución de DNS hasta que actualices tu grupo de nodos o añadas grupos de nodos al clúster.

  2. Actualiza los grupos de nodos del clúster para que usen Cloud DNS:

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool=POOL_NAME
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster.
    • POOL_NAME: el nombre del grupo de nodos que se va a actualizar.

    Si el grupo de nodos y el plano de control tienen la misma versión, actualiza primero el plano de control, tal como se describe en Actualizar el plano de control manualmente. A continuación, actualiza el grupo de nodos.

    Confirma la respuesta y repite este comando en cada grupo de nodos del clúster. Si tu clúster tiene un grupo de nodos, omite la marca --node-pool.

Consola

  1. Ve a la página Google Kubernetes Engine en la Google Cloud consola.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que quieras modificar.

  3. En Redes, en el campo Proveedor de DNS, haz clic en Editar proveedor de DNS.

  4. Haz clic en Cloud DNS.

  5. Haz clic en Ámbito de la VPC.

  6. Haz clic en Guardar cambios.

Verificar Cloud DNS

Verifica que Cloud DNS para GKE funcione correctamente en tu clúster:

  1. Para comprobar que tus nodos usan Cloud DNS, conéctate a un pod de un nodo y ejecuta el comando cat /etc/resolv.conf:

    kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
    

    Sustituye POD_NAME por el nombre del pod.

    En función del modo de clúster, el resultado será similar al siguiente:

    Clúster de Autopilot de GKE

    nameserver 169.254.20.10
    

    Como NodeLocal DNSCache está habilitado de forma predeterminada en Autopilot de GKE, el pod usa NodeLocal DNSCache.

    Si la caché local no tiene ninguna entrada para el nombre que se está buscando, NodeLocal DNSCache reenvía la solicitud a Cloud DNS.

    Clúster de GKE Standard

    nameserver 169.254.169.254
    

    Este pod de ejemplo usa 169.254.169.254 como nameserver, que es la dirección IP del servidor de metadatos en el que el plano de datos de Cloud DNS escucha las solicitudes en el puerto 53. Los nodos ya no usan la dirección de servicio kube-dns para la resolución de DNS y toda la resolución de DNS se produce en el nodo local.

    Si la salida es una dirección IP similar a 10.x.y.10, el pod usa kube-dns. Para saber por qué tu pod sigue usando kube-dns, consulta la sección Solución de problemas .

    Si el resultado es 169.254.20.10, significa que has habilitado NodeLocal DNSCache en tu clúster y que el pod usa NodeLocal DNSCache.

  2. Despliega una aplicación de ejemplo en tu clúster:

    kubectl run dns-test --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    
  3. Expón la aplicación de ejemplo con un servicio:

    kubectl expose pod dns-test --name dns-test-svc --port 8080
    
  4. Comprueba que el servicio se haya implementado correctamente:

    kubectl get svc dns-test-svc
    

    El resultado debería ser similar al siguiente:

    NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    dns-test-svc   ClusterIP   10.47.255.11    <none>        8080/TCP   6m10s
    

    El valor de la columna CLUSTER-IP es la dirección IP virtual de tu clúster. En este ejemplo, la dirección IP virtual es 10.47.255.11.

  5. Verifica que el nombre del servicio se haya creado como un registro en la zona DNS privada de tu clúster:

    gcloud dns record-sets list \
        --zone=PRIVATE_DNS_ZONE \
        --name=dns-test-svc.default.svc.DOMAIN_NAME.
    

    Haz los cambios siguientes:

    • PRIVATE_DNS_ZONE: el nombre de la zona DNS gestionada creada por GKE. Puedes encontrar los nombres de las zonas en la página de zonas de Cloud DNS de la Google Cloud consola o consultando la convención de nomenclatura.
    • DOMAIN_NAME: cluster.local si usas Cluster Scope sin Additive VPC Scope o el dominio personalizado que configuraste al habilitar VPC Scope o Additive VPC Scope.

    El resultado debería ser similar al siguiente:

    NAME: dns-test-svc.default.svc.cluster.local.
    TYPE: A
    TTL: 30
    DATA: 10.47.255.11
    

Inhabilitar Cloud DNS en clústeres estándar

No se puede inhabilitar Cloud DNS en clústeres de Autopilot que se hayan creado con Cloud DNS habilitado de forma predeterminada.

No se puede inhabilitar el ámbito de VPC en la edición Standard. Debes volver a crear el clúster con kube-dns como proveedor de DNS.

Puedes inhabilitar el ámbito de clúster y volver a kube-dns en un clúster estándar mediante la CLI de gcloud o la consola deGoogle Cloud .

gcloud

Actualiza el clúster para usar kube-dns:

gcloud container clusters update CLUSTER_NAME \
    --cluster-dns=kube-dns \
    --location=COMPUTE_LOCATION

Haz los cambios siguientes:

Consola

  1. Ve a la página Google Kubernetes Engine en la Google Cloud consola.

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que quieras modificar.

  3. En Redes, en el campo Proveedor de DNS, haz clic en Editar proveedor de DNS.

  4. Haz clic en Kube-dns.

  5. Haz clic en Guardar cambios.

Después de inhabilitar Cloud DNS, debes volver a crear tus grupos de nodos para que los nodos puedan usar kube-dns para la resolución. Si anteriormente has reducido kube-dns a cero nodos, debes aumentar kube-dns para que los nodos puedan usarlo para la resolución de DNS. Si no vuelves a crear tus grupos de nodos, los pods de los nodos actuales seguirán usando Cloud DNS para la resolución de DNS, ya que su archivo /etc/resolv.conf no se actualizará hasta que se vuelva a crear el nodo.

Inhabilitar el ámbito de VPC aditivo

Cuando inhabilitas el ámbito de VPC aditivo de tu clúster, solo se eliminan los registros DNS de las zonas privadas asociadas a la red VPC. Los registros de las zonas DNS privadas del clúster de GKE se conservarán y los gestionará Cloud DNS para GKE hasta que se elimine el servicio sin encabezado del clúster.

Para inhabilitar el ámbito de VPC aditivo, ejecuta el siguiente comando:

gcloud container clusters update CLUSTER_NAME \
    --disable-additive-vpc-scope

Sustituye CLUSTER_NAME por el nombre del clúster.

Este ajuste mantiene habilitado el ámbito de clúster de Cloud DNS en tu clúster, lo que proporciona resolución de DNS desde el clúster.

Limpieza

Después de completar los ejercicios de este documento, siga estos pasos para quitar recursos y evitar que se apliquen cargos no deseados a su cuenta:

  1. Elimina el servicio:

    kubectl delete service dns-test-svc
    
  2. Elimina el pod:

    kubectl delete Pod dns-test
    
  3. También puedes eliminar el clúster.

Solución de problemas

Para obtener información sobre cómo solucionar problemas de Cloud DNS, consulta las siguientes páginas:

Siguientes pasos