Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Troubleshoot DNS resolution errors

Última actualización: Sep 04, 2026

Diagnostique y corrija fallos de DNS en clústeres de ACK causados por CoreDNS, problemas de red, directivas o el kernel.

Funcionamiento de la resolución DNS

Cuando un pod de aplicación envía una consulta DNS, sigue esta ruta:

  1. El pod envía una consulta DNS a la dirección definida en /etc/resolv.conf, que normalmente es la IP del Service kube-dns.

  2. kube-dns reenvía la consulta a un pod de CoreDNS en el namespace kube-system.

  3. Para nombres de dominio internos que terminan con .cluster.local, CoreDNS resuelve desde su caché sin contactar a los servidores upstream.

  4. Para nombres de dominio externos, CoreDNS reenvía la consulta a los servidores DNS upstream especificados en su configuración. Los servidores upstream predeterminados son 100.100.2.136 y 100.100.2.138, ambos desplegados en la virtual private cloud (VPC).

Con NodeLocal DNSCache, las consultas se dirigen primero a la caché local (169.254.20.10) y solo recurren a kube-dns si no se pueden resolver.

Conceptos clave

Term

Description

Nombre de dominio interno

Dominio que termina con .cluster.local. CoreDNS lo resuelve desde la caché, no desde los servidores upstream.

Nombre de dominio externo

Dominio que no termina con .cluster.local. CoreDNS lo reenvía a los servidores DNS upstream.

Pod de aplicación

Cualquier pod que no sea un componente del sistema.

Service kube-dns

Service de Kubernetes que enruta el tráfico DNS hacia los pods de CoreDNS. Su IP es el servidor de nombres predeterminado para los pods de aplicación.

NodeLocal DNSCache

DaemonSet que ejecuta una caché DNS local en cada nodo. Cuando está habilitado, los pods consultan la caché local (169.254.20.10) en lugar de kube-dns.

Servidor DNS upstream

Servidor DNS al que CoreDNS contacta para dominios externos. De forma predeterminada son 100.100.2.136 y 100.100.2.138.

Paso 1: Identifique su mensaje de error

Compare su mensaje de error para determinar la categoría probable del fallo.

Client

Error message

Likely cause

ping

ping: xxx.yyy.zzz: Name or service not known

El dominio no existe o el servidor DNS es inalcanzable. Una latencia >5s indica que el servidor es inalcanzable.

curl

curl: (6) Could not resolve host: xxx.yyy.zzz

Igual que el anterior.

Cliente HTTP de PHP

php_network_getaddresses: getaddrinfo failed: Name or service not known in xxx.php on line yyy

Igual que el anterior.

Cliente HTTP de Golang

dial tcp: lookup xxx.yyy.zzz on 100.100.2.136:53: no such host

El dominio no existe.

dig

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: xxxxx

El dominio no existe.

Cliente HTTP de Golang

dial tcp: lookup xxx.yyy.zzz on 100.100.2.139:53: read udp 192.168.0.100:42922->100.100.2.139:53: i/o timeout

El servidor DNS es inalcanzable.

dig

;; connection timed out; no servers could be reached

El servidor DNS es inalcanzable.

Paso 2: Verifique la directiva de DNS y la dirección del servidor

Compruebe que el pod utiliza CoreDNS como su servidor DNS.

Obtenga la directiva de DNS y la configuración:

# View the pod's DNS policy
kubectl get pod <pod-name> -o yaml

# Log in to the pod and inspect the DNS configuration
kubectl exec -it <pod-name> -- cat /etc/resolv.conf

Revise el campo dnsPolicy y las entradas de nameserver en /etc/resolv.conf.

dnsPolicy value

Behavior

ClusterFirst

Predeterminado. El pod usa la IP del Service kube-dns como servidor DNS.

ClusterFirstWithHostNet

Igual que ClusterFirst para pods con red de host.

Default

El pod hereda la configuración DNS del nodo de Elastic Compute Service (ECS). Úselo solo cuando el pod no resuelva nombres internos del clúster.

None

DNS configurado completamente mediante dnsConfig. NodeLocal DNSCache usa esto para inyectar 169.254.20.10 y la IP de kube-dns como servidores de nombres.

Si el pod no usa CoreDNS (el nameserver no es la IP del Service kube-dns), es posible que el pod esté sobrecargado o que la tabla conntrack esté llena. Consulte Client is overloaded y Conntrack table is full.

Si el pod usa NodeLocal DNSCache (el nameserver es 169.254.20.10), consulte NodeLocal DNSCache does not work y Alibaba Cloud DNS PrivateZone names cannot be resolved.

Si el pod usa CoreDNS, continúe con el Paso 3.

Paso 3: Verifique el estado de los pods de CoreDNS

Inspeccione los pods de CoreDNS:

# View CoreDNS pod status and placement
kubectl -n kube-system get pod -o wide -l k8s-app=kube-dns

Salida esperada:

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE
coredns-xxxxxxxxx-xxxxx   1/1     Running   0          25h   172.20.6.53   cn-hangzhou.192.168.0.198
# View real-time CPU and memory usage
kubectl -n kube-system top pod -l k8s-app=kube-dns

Salida esperada:

NAME                      CPU(cores)   MEMORY(bytes)
coredns-xxxxxxxxx-xxxxx   3m           18Mi

Paso 4: Revise los registros operativos de CoreDNS

kubectl -n kube-system logs -f --tail=500 --timestamps <coredns-pod-name>

Flag

Description

-f

Transmite la salida del registro en tiempo real.

--tail=500

Muestra las últimas 500 líneas.

--timestamps

Incluye marcas de tiempo en cada línea del registro.

Busque patrones de error que coincidan con problemas conocidos. Para obtener registros a nivel de consulta DNS, primero habilite el plugin de registro de CoreDNS. Consulte Configure DNS resolution.

Con el plugin de registro habilitado, cada consulta resuelta genera una entrada similar a:

[INFO] 172.20.2.25:44525 - 36259 "A IN redis-master.default.svc.cluster.local. udp 56 false 512" NOERROR qr,aa,rd 110 0.000116946s

Códigos de respuesta comunes:

Response code

Meaning

What to do

NOERROR

Resuelto correctamente.

No se requiere ninguna acción.

NXDOMAIN

El dominio no existe en el servidor upstream.

Compruebe si el nombre de dominio incluye un sufijo de búsqueda que no se resuelve.

SERVFAIL

El servidor DNS upstream devolvió un error.

Verifique la conectividad de CoreDNS con los servidores upstream.

REFUSED

El servidor upstream rechazó la consulta.

Revise la configuración del Corefile de CoreDNS y el archivo /etc/resolv.conf del nodo.

Los códigos de respuesta DNS se definen en RFC 1035.

Paso 5: Reproduzca el error y aísle la causa

Si el error ocurre de manera constante:

  1. Revise el registro de consultas DNS en busca de códigos de respuesta de error. Consulte External domain name cannot be resolved.

  2. Pruebe la conectividad de red entre los pods de aplicación y CoreDNS. Consulte Prueba de conectividad de red entre pods de aplicación y CoreDNS.

  3. Diagnostique la red de contenedores. Consulte Diagnose the container network.

Si el error ocurre de manera intermitente:

Capture paquetes para recopilar evidencia. Consulte Captura de paquetes.

Métodos de diagnóstico

Prueba de conectividad de red entre pods de aplicación y CoreDNS

Ingrese al namespace de red del pod de aplicación mediante uno de estos métodos:

  • Método 1 (recomendado): Ejecute kubectl exec -it <pod-name> -- bash para ingresar al pod.

  • Método 2: Inicie sesión en el nodo, busque el ID del proceso con ps aux | grep <application-process-name> y luego ingrese al namespace de red con nsenter -t <pid> -n bash.

  • Método 3 (para pods que se reinician frecuentemente):

    1. Inicie sesión en el nodo.

    2. Ejecute docker ps -a | grep <application-container-name> para encontrar los ID de los contenedores sandbox (los nombres comienzan con k8s_POD_).

    3. Ejecute docker inspect <sandboxed-container-ID> | grep netns para encontrar la ruta del namespace de red en /var/run/docker/netns/xxxx.

    4. Ejecute nsenter -n bash para ingresar al namespace. > Note: No agregue un espacio entre -n y <netns-path>.

Desde el namespace de red del pod, pruebe la conectividad:

# Test connectivity to the kube-dns Service
dig <domain> @<kube-dns-svc-ip>

# Test Internet Control Message Protocol (ICMP) connectivity to the CoreDNS pod
ping <coredns-pod-ip>

# Test DNS query directly to the CoreDNS pod
dig <domain> @<coredns-pod-ip>

Reemplace <kube-dns-svc-ip> con la IP del Service kube-dns en el namespace kube-system, y <coredns-pod-ip> con la IP de un pod de CoreDNS.

Symptom

Likely cause

Next step

No se puede alcanzar el Service kube-dns

Nodo sobrecargado, kube-proxy inactivo o security group que bloquea el puerto 53 del User Datagram Protocol (UDP)

Verifique que las reglas del security group permitan el puerto UDP 53.

No se puede alcanzar el pod de CoreDNS (ICMP)

Error en la red de contenedores o security group que bloquea ICMP

Diagnostique la red de contenedores.

No se puede alcanzar el pod de CoreDNS (DNS)

Nodo sobrecargado o security group que bloquea el puerto UDP 53

Verifique que las reglas del security group permitan el puerto UDP 53.

Prueba de conectividad de red de CoreDNS

  1. Inicie sesión en el nodo donde se ejecuta el pod de CoreDNS.

  2. Ejecute ps aux | grep coredns para obtener el ID del proceso de CoreDNS.

  3. Ejecute nsenter -t <pid> -n bash para ingresar al namespace de red de CoreDNS.

  4. Pruebe la conectividad:

    # Test connectivity to the Kubernetes API server
    telnet <apiserver_clusterip> 6443  # apiserver_clusterip is the ClusterIP of the kubernetes Service in the default namespace.
    
    # Test connectivity to upstream DNS servers
    dig <domain> @100.100.2.136
    dig <domain> @100.100.2.138

Symptom

Likely cause

Next step

No se puede alcanzar el servidor de API de Kubernetes

Error del servidor de API, nodo sobrecargado o kube-proxy inactivo

Compruebe la disponibilidad del servidor de API.

No se pueden alcanzar los servidores DNS upstream

Nodo sobrecargado, CoreDNS mal configurado o error de enrutamiento de Express Connect

Envíe un ticket de soporte.

Diagnóstico de la red de contenedores

  1. Inicie sesión en la consola de ACKconsola de ACK.

  2. En la página Clusters, haga clic en el nombre de su clúster o haga clic en Details en la columna Actions.

  3. En el panel de navegación izquierdo, seleccione Operations > Cluster Check.

  4. En la página de Container Intelligence Service, seleccione Cluster Check > Diagnosis.

  5. En la página Diagnosis, haga clic en la pestaña Network Diagnosis.

  6. Establezca Source address como la IP del pod de aplicación, Destination address como la IP del Service kube-dns y Destination port como 53. Seleccione Enable packet tracing y I know and agree, luego haga clic en Create diagnosis.

  7. En la lista de diagnósticos, haga clic en Diagnosis details para ver su registro.

Los resultados muestran Diagnosis result, Packet paths y All possible paths, junto con las causas de error identificadas. Consulte Uso de la función de diagnóstico de clústeres para solucionar problemas del clúster.

Captura de paquetes

Utilice la captura de paquetes cuando los errores sean intermitentes y difíciles de reproducir.

  1. Inicie sesión en los nodos donde se ejecutan los pods de aplicación y el pod de CoreDNS.

  2. Capture el tráfico DNS en cada instancia de ECS:

    tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcap

    Esto captura todo el tráfico en el puerto 53, rotando hasta 200 archivos de 20 MB cada uno.

  3. Reproduzca el error y analice los paquetes de la ventana de tiempo del fallo. Revise los registros de la aplicación para obtener las marcas de tiempo exactas.

La captura de paquetes tiene un impacto insignificante en el servicio: solo un ligero aumento en la utilización de la CPU y la E/S del disco.

Problemas conocidos

Verifique estos problemas específicos del entorno antes de realizar una investigación más profunda.

Issue

Affected environments

Quick identification

Concurrent A and AAAA record queries

Todos (especialmente imágenes basadas en Alpine y aplicaciones PHP)

Fallos intermitentes; la captura de paquetes muestra consultas A/AAAA simultáneas en el mismo puerto

IPVS UDP source port conflicts

kube-proxy en modo IP Virtual Server (IPVS); CentOS o Alibaba Cloud Linux 2 con kernel anterior a 4.19.91-25.1.al7.x86_64

Los fallos duran aproximadamente 5 minutos durante el escalado de nodos o de CoreDNS

Conntrack table full

Nodos con alto tráfico

dmesg -H muestra conntrack full; fallos durante las horas pico

Alibaba Cloud DNS PrivateZone with NodeLocal DNSCache

Clústeres que usan tanto NodeLocal DNSCache como DNS PrivateZone

Los nombres de dominio de PrivateZone o vpc-proxy no se resuelven o se resuelven a direcciones incorrectas

autopath plugin bug

Clústeres que crean contenedores con alta frecuencia

Los nombres externos fallan intermitentemente o se resuelven a IPs incorrectas; los nombres internos suelen resolverse normalmente, excepto en clústeres que crean contenedores con alta frecuencia, donde los nombres de servicios internos también pueden resolverse a IPs incorrectas

DNS PrivateZone and vpc-proxy names

Clústeres donde fallan tanto los nombres de dominio internos como externos

Errores de resolución solo en nombres de dominio agregados a Alibaba Cloud DNS PrivateZone y nombres de dominio que contienen vpc-proxy

Preguntas frecuentes

No se puede resolver un nombre de dominio externo

Revise el registro de consultas de CoreDNS para ver el código de respuesta. Habilite el plugin de registro si aún no está activo (consulte Configure DNS resolution) y luego busque el dominio que falla. NXDOMAIN significa que el dominio no existe en el upstream; a menudo se debe a que se agregó un sufijo de búsqueda, creando un FQDN no válido. SERVFAIL o REFUSED indican que el servidor upstream tiene un problema; revise la configuración de CoreDNS y la conectividad con 100.100.2.136 y 100.100.2.138.

No se pueden resolver los nombres de dominio de Services headless

En versiones de CoreDNS anteriores a la 1.7.0, la inestabilidad de la red del servidor de API puede provocar que CoreDNS se cierre, deteniendo las actualizaciones de registros de Services headless. Actualice a la versión 1.7.0 o posterior. Consulte [\[Component Updates\] Update CoreDNS](t1964489.dita#task_1964489).

No se pueden resolver los nombres de dominio de los pods de StatefulSet

La plantilla del pod de StatefulSet debe tener serviceName configurado con el nombre del Service headless. Sin esto, los nombres DNS por pod (por ejemplo, pod.headless-svc.ns.svc.cluster.local) no se pueden resolver, aunque el nombre a nivel de Service (por ejemplo, headless-svc.ns.svc.cluster.local) funcione. Configure serviceName en la especificación del StatefulSet.

Las consultas DNS están bloqueadas por reglas de security group o ACL de red

Las reglas de security group o las listas de control de acceso (ACL) de red están bloqueando el puerto UDP 53, lo que causa fallos de DNS en los nodos afectados. Permita el tráfico entrante y saliente por el puerto UDP 53.

Los errores de conectividad de la red de contenedores causan fallos de DNS

Los errores en la red de contenedores bloquean el puerto UDP 53. Utilice Network Diagnosis feature para identificar la ruta rota y la causa raíz.

Los pods de CoreDNS están sobrecargados

Cuando el volumen de consultas supera la capacidad de las réplicas de CoreDNS, la latencia aumenta y se producen fallos. Compruebe si el uso de CPU y memoria está cerca del límite (kubectl -n kube-system top pod -l k8s-app=kube-dns).

Dos soluciones:

  • Despliegue NodeLocal DNSCache para absorber las consultas localmente y reducir la carga en CoreDNS. Consulte Configure NodeLocal DNSCache.

  • Escale horizontalmente las réplicas de CoreDNS para que la utilización máxima de CPU por pod se mantenga muy por debajo de la CPU disponible del nodo.

Las consultas DNS no se distribuyen uniformemente entre los pods de CoreDNS

Una programación desequilibrada de pods o una configuración de sessionAffinity en kube-dns pueden causar una distribución desigual de las consultas. Síntoma: utilización de CPU notablemente diferente entre los pods de CoreDNS.

Dos soluciones:

  • Escale horizontalmente los pods de CoreDNS y distribúyalos en diferentes nodos.

  • Elimine la configuración de sessionAffinity del Service kube-dns. Consulte Configure the kube-dns Service.

Los pods de CoreDNS no se ejecutan con normalidad

Un YAML o ConfigMap mal configurado puede impedir que CoreDNS se inicie o provocar cierres inesperados. Síntomas: pods que no están en estado Running, recuento de reinicios en aumento o errores en los registros.

Busque estos errores comunes en el registro de CoreDNS:

Error

Cause

Fix

/etc/coredns/Corefile:4 - Error during parsing: Unknown directive 'ready'

El ConfigMap de CoreDNS contiene un plugin no compatible con la versión actual.

Elimine el plugin no compatible (por ejemplo, ready) del ConfigMap en el namespace kube-system. Repita el proceso para otros plugins mencionados en el error.

Failed to watch *v1.Pod: ... connect: connection refused

Las conexiones al servidor de API se interrumpieron cuando se generó el registro.

Si no hubo fallos de DNS, esta no es la causa raíz. De lo contrario, pruebe la conectividad de CoreDNS. Consulte Prueba de conectividad de red de CoreDNS.

[ERROR] plugin/errors: 2 www.aliyun.com. A: read udp ...->100.100.2.136:53: i/o timeout

CoreDNS no pudo alcanzar los servidores DNS upstream.

Pruebe la conectividad desde el pod de CoreDNS hacia 100.100.2.136 y 100.100.2.138.

Las resoluciones DNS fallan porque el cliente está sobrecargado

Cuando la instancia de ECS está completamente cargada, los paquetes UDP pueden descartarse antes de llegar a CoreDNS. Busque una tasa anormal de retransmisión del controlador de interfaz de red (NIC) y una alta utilización de CPU en los datos de monitoreo.

Despliegue NodeLocal DNSCache para reducir el tráfico DNS entre nodos. Consulte Configure NodeLocal DNSCache.

La tabla conntrack está llena

Cuando la tabla conntrack está llena, las nuevas conexiones UDP y TCP se descartan. Esto suele causar fallos de DNS en horas pico que se recuperan fuera de ese horario. Para confirmarlo, ejecute dmesg -H en el nodo afectado y busque conntrack full durante la ventana del fallo.

Aumente el número máximo de entradas en la tabla conntrack. Consulte How do I increase the maximum number of tracked connections in the conntrack table of the Linux kernel?

El plugin autopath no funciona con normalidad

Un defecto conocido del plugin autopath provoca fallos ocasionales en la resolución o IPs incorrectas para dominios externos. Los dominios internos se resuelven correctamente. El problema empeora en clústeres con altas tasas de creación de contenedores.

Deshabilite el plugin autopath:

  1. Edite el ConfigMap de CoreDNS con kubectl -n kube-system edit configmap coredns.

  2. Elimine la línea autopath @kubernetes. Guarde y salga.

  3. Verifique que la configuración se haya cargado revisando los registros de CoreDNS en busca de reload.

Las resoluciones DNS fallan debido a consultas concurrentes de registros A y AAAA

Algunas distribuciones de Linux envían consultas A y AAAA simultáneamente por el mismo puerto, lo que desencadena conflictos en conntrack que descartan paquetes UDP.

Síntomas: fallos de resolución intermitentes; la captura de paquetes muestra consultas A y AAAA simultáneas desde el mismo puerto de origen.

Las soluciones dependen de la base de su imagen:

  • CentOS o Ubuntu: Agregue options timeout:2 attempts:3 rotate single-request-reopen a la configuración del resolvedor DNS.

  • Alpine Linux: Reemplace la imagen basada en Alpine por una basada en otro sistema operativo. Consulte Advertencias de Alpine.

  • PHP con cURL: Agregue CURL_IPRESOLVE_V4 para forzar la resolución solo en IPv4. Consulte Funciones de cURL.

  • Todos los entornos: Despliegue NodeLocal DNSCache, que mitiga la condición de carrera. Consulte Configure NodeLocal DNSCache.

Las resoluciones DNS fallan debido a errores de IPVS

En modo IPVS con CentOS o Alibaba Cloud Linux 2 (kernel anterior a 4.19.91-25.1.al7.x86_64), eliminar pods de backend UDP causa conflictos de puerto de origen que descartan paquetes. Los fallos de DNS duran ~5 minutos durante eventos de escalado de nodos o de CoreDNS.

Dos soluciones:

NodeLocal DNSCache no funciona

Las consultas DNS omiten NodeLocal DNSCache cuando se cumple alguna de estas condiciones:

  • No se inyectó dnsConfig en los pods de aplicación, por lo que siguen apuntando a la IP del Service kube-dns.

  • Los pods usan una imagen base de Alpine Linux, que consulta todos los servidores de nombres simultáneamente, incluido CoreDNS directamente.

Para el primer caso, habilite la inyección automática de dnsConfig. Consulte Configure NodeLocal DNSCache. Para imágenes Alpine, use una imagen construida sobre otro sistema operativo. Consulte Advertencias de Alpine.

No se pueden resolver los nombres de Alibaba Cloud DNS PrivateZone

Alibaba Cloud DNS PrivateZone requiere UDP, no TCP. Con NodeLocal DNSCache, los dominios de PrivateZone, los endpoints de la API vpc-proxy u otros nombres de dominio pueden no resolverse o resolverse a IPs incorrectas.

Agregue prefer_udp a la configuración de CoreDNS para forzar UDP en las consultas upstream. Consulte Configure CoreDNS.

Siguientes pasos