Soluciona problemas de Cloud DNS en GKE


En esta página, se muestra cómo resolver problemas con Cloud DNS en Google Kubernetes Engine (GKE).

Identifica la fuente de los problemas de DNS en Cloud DNS

Los errores como dial tcp: i/o timeout, no such host o Could not resolve host suelen indicar problemas con la capacidad de Cloud DNS para resolver consultas.

Si ves uno de esos errores, pero no conoces la causa, usa las siguientes secciones para encontrarla. Las secciones están organizadas para comenzar con los pasos que tienen más probabilidades de ayudarte, así que prueba cada sección en orden.

Verifica la configuración básica

Si tu Pod no puede resolver las búsquedas de DNS, asegúrate de que Cloud DNS esté configurado de la manera que deseas. Esta sección te ayuda a verificar si usas Cloud DNS, confirmar la existencia de una zona de DNS privada para el clúster de GKE y garantizar la precisión de los registros DNS del servicio de destino.

Para verificar esta configuración, completa los siguientes comandos:

  1. Verifica qué servidor DNS usa tu Pod:

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

    Reemplaza POD_NAME por el nombre del pod que tiene problemas con la resolución de DNS.

    Si usas Cloud DNS, el resultado es el siguiente:

    nameserver 169.254.169.254
    

    Si ves cualquier otro valor, significa que no estás usando Cloud DNS. Verifica que Cloud DNS se haya habilitado correctamente.

  2. Verifica que las zonas administradas existan:

    gcloud dns managed-zones list --format list
    

    El resultado es similar a este:

    - creationTime: 2021-02-12T19:24:37.045Z
      description: Private zone for GKE cluster "" with cluster suffix "CLUSTER_DOMAIN" in project "PROJECT_ID"
      dnsName: CLUSTER_DOMAIN.
      id: 5887499284756055830
      kind: dns#managedZone
      name: gke-CLUSTER_NAME-aa94c1f9-dns
      nameServers: ['ns-gcp-private.googledomains.com.']
      privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'}
      visibility: private
    

    En esta salida, se incluyen los siguientes valores:

    • CLUSTER_DOMAIN: Es el sufijo de dominio DNS que se asignó automáticamente a tu clúster.
    • PROJECT_ID: el ID de tu proyecto
    • CLUSTER_NAME: Es el nombre del clúster con la zona privada.

    En este resultado, el valor del campo name muestra queGoogle Cloud creó una zona llamada gke-CLUSTER_NAME-aa94c1f9-dns.

    Si no ves una zona administrada, significa que no se creó una zona privada para tu clúster o que es posible que no se haya autenticado correctamente. Para solucionar problemas, consulta Zonas privadas en la documentación de Cloud DNS.

  3. Verifica los registros DNS de tu servicio:

    gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
    

    Reemplaza lo siguiente:

    • ZONE_NAME: El nombre de la zona privada
    • SERVICE_NAME: El nombre del servicio

    El resultado es similar al siguiente:

    dns-test.default.svc.cluster.local.                A     30     10.47.255.11
    

    En este resultado, se muestra que Cloud DNS contiene un registro A para el dominio dns-test.default.svc.cluster.local. y que la dirección IP de tu clúster es 10.47.255.11.

    Si los registros parecen incorrectos, consulta Cómo aplicar un parche a un conjunto de registros de recursos en la documentación de Cloud DNS para actualizarlos.

Verifica las políticas de respuesta

Verifica que tus políticas de respuesta existan y tengan el nombre correcto:

  1. Consulta una lista de todas tus políticas de respuesta:

    gcloud dns response-policies list --format="table(responsePolicyName, description)"
    

    El resultado es similar a este:

    RESPONSE_POLICY_NAME          DESCRIPTION
    gke-CLUSTER_NAME-52c8f518-rp  Response Policy for GKE cluster "CLUSTER_NAME" with cluster suffix "cluster.local." in project "gke-dev" with scope "CLUSTER_SCOPE".
    

    En este resultado, gke-CLUSTER_NAME-52c8f518-rp muestra queGoogle Cloud creó una zona privada llamada gke-CLUSTER_NAME-aa94c1f9-rp. Las políticas de respuesta que creaGoogle Cloud tienen el prefijo gke-.

  2. Visualiza las políticas de respuesta en una zona privada específica:

    gcloud dns response-policies rules list ZONE_NAME \
        --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
    

    Reemplaza ZONE_NAME por el nombre de la zona privada que tiene problemas.

    El resultado es similar a este:

    1.240.27.10.in-addr.arpa.    kubernetes.default.svc.cluster.local.
    52.252.27.10.in-addr.arpa.   default-http-backend.kube-system.svc.cluster.local.
    10.240.27.10.in-addr.arpa.   kube-dns.kube-system.svc.cluster.local.
    146.250.27.10.in-addr.arpa.  metrics-server.kube-system.svc.cluster.local.
    

    En la primera columna, se muestra la dirección IP o el patrón de nombre de dominio con el que coincide la regla. La segunda columna es el nombre de host asociado con la dirección IP.

Si observas algún problema en el resultado de estos comandos, consulta Cómo actualizar una regla de política de respuesta en la documentación de Cloud DNS.

Realiza investigaciones con registros, paneles y métricas

Cloud DNS incluye varias opciones de registro y supervisión para ayudarte a investigar mejor tus problemas de DNS:

Cómo buscar registros nuevos

Revisa los registros para ver si se crearon registros nuevos en la zona privada de Cloud DNS administrada. Esto puede ser útil si, de repente, experimentas resoluciones de DNS con errores en el clúster.

Para verificar si hay registros nuevos, completa los siguientes pasos:

  1. En la consola de Google Cloud , ve a la página Explorador de registros.

    Ir al Explorador de registros

  2. En el panel de consultas, ingresa la siguiente consulta:

    resource.type="dns_managed_zone"
    protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local."
    protoPayload.methodName="dns.changes.create"
    
  3. Haz clic en Ejecutar consulta.

  4. Revise el resultado. Si encuentras cambios que corresponden al momento en que primero notaste errores, considera revertirlos.

Verifica los dominios de stub y los servidores de nombres personalizados

Si usas un clúster de GKE estándar con un dominio de stub personalizado o un servidor de nombres upstream, revisa el ConfigMap y verifica que los valores sean correctos.

Cloud DNS traduce los valores stubDomains y upstreamNameservers en zonas de reenvío de Cloud DNS. Google administra estos recursos, por lo que, si notas algún error, comunícate con el servicio de Atención al cliente de Cloud para obtener asistencia.

Comunícate con Atención al cliente de Cloud

Si seguiste las secciones anteriores, pero aún no puedes diagnosticar la causa del problema, comunícate con Atención al cliente de Cloud.

Cómo resolver errores específicos

Si experimentas un error o un problema específico, sigue los consejos de las siguientes secciones.

Problema: No se puede resolver el servicio de clúster de GKE desde una VM de Compute Engine

Si no puedes resolver un servicio de clúster de GKE desde una VM de Compute Engine, verifica el alcance de Cloud DNS del clúster.

El alcance que usas con Cloud DNS determina qué recursos se pueden resolver:

  • Permiso de clúster: La resolución de DNS se restringe a los recursos dentro del clúster de Kubernetes (Pods y servicios). Este es el parámetro de configuración predeterminado y es adecuado cuando no necesitas resolver recursos externos fuera del clúster de Kubernetes o la nube privada virtual (VPC) de GKE.

  • Permiso de la VPC: La resolución de DNS se extiende a toda la VPC, incluidos los recursos como las VMs de Compute Engine. Esto permite que el clúster resuelva registros DNS internos para recursos fuera del clúster de GKE, pero dentro de la misma VPC, como las VMs de Google Cloud .

Para verificar el alcance de Cloud DNS de tu clúster, completa los siguientes pasos:

  1. En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.

    Ir a clústeres de Kubernetes

  2. Haz clic en el nombre del clúster que tiene problemas con el DNS.

  3. En la sección Redes del clúster de la página de detalles del clúster, revisa la información de la fila Proveedor de DNS.

  4. Si ves Cloud DNS (permiso del clúster), significa que estás usando el permiso del clúster. Para cambiar el permiso de DNS, vuelve a crear el clúster con el permiso de DNS adecuado.

Problema: Los Pods siguen usando kube-dns después de habilitar Cloud DNS

Si tus Pods usan kube-dns incluso después de que se habilita Cloud DNS en un clúster existente, asegúrate de haber actualizado o recreado tus grupos de nodos después de habilitar Cloud DNS en el clúster. Hasta que este paso esté completo, los Pods seguirán usando kube-dns.

Problema: No se puede actualizar el clúster existente ni crear uno con Cloud DNS habilitado

Asegúrate de usar la versión correcta. Cloud DNS para GKE requiere la versión 1.19 o posterior de GKE para los clústeres que usan el permiso de VPC, o la versión 1.24.7-gke.800, 1.25.3-gke.700 o posterior para los clústeres que usan el permiso del clúster.

Problema: Las búsquedas de DNS en los nodos fallan después de habilitar Cloud DNS en un clúster

Si habilitas el permiso del clúster de Cloud DNS en un clúster de GKE que tiene dominios de stub personalizados o servidores de nombres ascendentes, la configuración personalizada se aplica a los nodos y a los Pods del clúster porque Cloud DNS no puede distinguir entre un Pod y un nodo de solicitudes de DNS Las búsquedas de DNS en los nodos pueden fallar si el servidor ascendente personalizado no puede resolver las consultas.

Problema: No se puede actualizar ni crear un clúster con el permiso adicional de VPC de Cloud DNS habilitado

Asegúrate de usar la versión correcta. El permiso adicional de VPC de Cloud DNS requiere la versión de GKE 1.28 o posterior.

Error: Cloud DNS inhabilitado

El siguiente evento ocurre cuando se inhabilita la API de Cloud DNS:

Warning   FailedPrecondition        service/default-http-backend
Failed to send requests to Cloud DNS: Cloud DNS API Disabled. Please enable the Cloud DNS API in your project PROJECT_NAME: Cloud DNS API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dns.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Este error se produce porque la API de Cloud DNS no está habilitada de forma predeterminada. Debes habilitar la API de Cloud DNS de forma manual.

Para resolver el problema, habilita la API de Cloud DNS.

Error: No se pudieron enviar solicitudes a Cloud DNS: se superó el límite de frecuencia de la API.

El siguiente evento ocurre cuando un proyecto superó un límite o una cuota de Cloud DNS:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.

Para resolver este problema, revisa las cuotas de Cloud DNS y las cuotas y límites de Compute Engine. Puedes aumentar la cuota con la consola de Google Cloud .

Error: No se pudieron enviar a las solicitudes a Cloud DNS debido a un error anterior

El siguiente evento ocurre cuando los errores causan fallas en cascada:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
kube-system   27s         Warning   FailedPrecondition               service/default-http-backend                         Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Para resolver este problema, verifica los eventos del clúster para encontrar la fuente del error original y sigue las instrucciones para resolver ese problema raíz.

En el ejemplo anterior, el error InsufficientQuota para la zona administrada activó fallas en cascada. El segundo error de FailedPrecondition indica que se produjo un error anterior, que fue ese problema de cuota inicial insuficiente. Para resolver este problema de ejemplo, debes seguir las directrices del error de cuota de Cloud DNS.

Error: No se pudo vincular la política de respuesta

El siguiente evento ocurre cuando una política de respuesta está vinculada a la red del clúster y Cloud DNS para GKE intenta vincular una política de respuesta a la red:

kube-system   9s          Warning   FailedPrecondition               responsepolicy/gke-2949673445-rp
Failed to bind response policy gke-2949673445-rp to test. Please verify that another Response Policy is not already associated with the network: Network 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/NETWORK_NAME' cannot be bound to this response policy because it is already bound to another response policy.
kube-system   9s          Warning   FailedPrecondition               service/kube-dns
Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Para resolver el problema, completa los siguientes pasos:

  1. Obtén la política de respuesta vinculada a la red:

    gcloud dns response-policies list --filter='networks.networkUrl: NETWORK_URL'
    

    Reemplaza NETWORK_URL por la URL de la red del error, como https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME.

    Si el resultado está vacío, es posible que la política de respuesta no esté en el mismo proyecto. Continúa con el paso siguiente para buscar la política de respuesta.

    Si el resultado es similar al siguiente, ve al paso 4 para borrar la política de respuesta.

    [
       {
          "description": "Response Policy for GKE cluster \"CLUSTER_NAME\" with cluster suffix \"cluster.local.\" in project \"PROJECT_ID\" with scope \"CLUSTER_SCOPE\".",
          ...
          "kind": "dns#responsePolicy",
          "responsePolicyName": "gke-CLUSTER_NAME-POLICY_ID-rp"
       }
    ]
    
  2. Obtén una lista de proyectos con el permiso dns.networks.bindDNSResponsePolicy a través del Analizador de políticas de IAM.

  3. Comprueba si cada proyecto tiene la política de respuesta que está vinculada a la red:

    gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \
        --project=PROJECT_NAME
    
  4. Borra la política de respuesta.

Error: Se especificó una configuración no válida en kube-dns

El siguiente evento ocurre cuando aplicas un Config-kube-dns personalizado que no es válido para Cloud DNS para GKE:

kube-system   49s         Warning   FailedValidation                 configmap/kube-dns
Invalid configuration specified in kube-dns: error parsing stubDomains for ConfigMap kube-dns: dnsServer [8.8.8.256] validation: IP address "8.8.8.256" invalid

Para resolver este problema, revisa los detalles del error de la parte no válida del ConfigMap. En el ejemplo anterior, 8.8.8.256 no es una dirección IP válida.

¿Qué sigue?