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:
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.
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 proyectoCLUSTER_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 llamadagke-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.
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 privadaSERVICE_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 es10.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:
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 llamadagke-CLUSTER_NAME-aa94c1f9-rp
. Las políticas de respuesta que creaGoogle Cloud tienen el prefijogke-
.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:
Para ver los registros de recursos, como zonas y registros, habilita Cloud Logging para Cloud DNS.
Para ver los gráficos de las consultas de DNS y los datos de la tasa de errores, la QPS y la latencia del percentil 99 de tus zonas privadas, usa el panel de supervisión de Cloud DNS.
Para visualizar la latencia y los porcentajes de éxito de tus consultas de DNS, usa las métricas
query/latencies
yquery/response_count
en el Explorador de métricas.
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:
En la consola de Google Cloud , ve a la página Explorador de registros.
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"
Haz clic en Ejecutar consulta.
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:
En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.
Haz clic en el nombre del clúster que tiene problemas con el DNS.
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.
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:
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, comohttps://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" } ]
Obtén una lista de proyectos con el permiso
dns.networks.bindDNSResponsePolicy
a través del Analizador de políticas de IAM.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
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?
Para obtener información general sobre el diagnóstico de problemas de DNS de Kubernetes, consulta Depuración de la resolución de DNS.
Revisa la solución de problemas de Cloud DNS.
- Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.