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 viste uno de esos errores, pero no conoces la causa, usa las siguientes secciones para ayudarte a encontrarla. Las secciones están organizadas para comenzar con los pasos que probablemente te ayudarán más, 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. En esta sección, se te ayudará 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 de DNS para el servicio de destino.
Para verificar estos parámetros de configuración, completa los siguientes comandos:
Comprueba 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 será 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 existan las zonas administradas:
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 te hayas 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
Este resultado 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 parchear 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:
Sigue estos pasos para ver 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 queGoogle Cloud crea 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 el patrón de dirección IP o 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 actualiza una regla de política de respuesta en la documentación de Cloud DNS.
Investiga con registros, paneles y métricas
Cloud DNS incluye varias opciones de registro y supervisión para ayudarte a investigar más a fondo tus problemas de DNS:
Para ver los registros de recursos como zonas y registros, habilita Cloud Logging para Cloud DNS.
Para ver gráficos de las consultas de DNS y datos sobre 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 las tasas 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 administrada de Cloud DNS. Esto puede ser útil si, de repente, experimentas errores en la resolución de DNS en el clúster.
Para verificar si hay registros nuevos, completa los siguientes pasos:
En la Google Cloud consola, 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 coinciden con el momento en que notaste los errores por primera vez, considera revertirlos.
Verifica los dominios de stub personalizados y los servidores de nombres
Si usas un clúster de GKE Standard con un dominio de zona auxiliar 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 observas algún error, comunícate con Atención al cliente de Cloud para obtener asistencia.
Comunícate con Atención al cliente de Cloud
Si completaste 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 experimentaste un error o problema específico, sigue las recomendaciones de las siguientes secciones.
Problema: No se puede resolver el servicio del clúster de GKE desde una VM de Compute Engine
Si no puedes resolver un Service 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:
Alcance del clúster: La resolución de DNS se restringe a los recursos dentro del clúster de Kubernetes (Pods y Services). Esta es la configuración predeterminada y es adecuada 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 Google Cloud VMs.
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 de 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 usas 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 que se habilitó Cloud DNS
Si tus Pods usan kube-dns incluso después de que se habilite 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 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 no encuentras una solución a tu problema en la documentación, consulta Obtener asistencia para obtener más ayuda, incluidos consejos sobre los siguientes temas:
- Abrir un caso de asistencia comunicándose con Atención al cliente de Cloud
- Obtén asistencia de la comunidad haciendo preguntas en StackOverflow y usando la etiqueta
google-kubernetes-engine
para buscar problemas similares. También puedes unirte al canal de Slack#kubernetes-engine
para obtener más asistencia de la comunidad. - Abrir errores o solicitudes de funciones con la herramienta de seguimiento de errores pública