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:
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.kube-dns reenvía la consulta a un pod de CoreDNS en el namespace
kube-system.Para nombres de dominio internos que terminan con
.cluster.local, CoreDNS resuelve desde su caché sin contactar a los servidores upstream.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.136y100.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 |
|
Nombre de dominio externo |
Dominio que no termina con |
|
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 ( |
|
Servidor DNS upstream |
Servidor DNS al que CoreDNS contacta para dominios externos. De forma predeterminada son |
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 |
|
El dominio no existe o el servidor DNS es inalcanzable. Una latencia >5s indica que el servidor es inalcanzable. |
|
curl |
|
Igual que el anterior. |
|
Cliente HTTP de PHP |
|
Igual que el anterior. |
|
Cliente HTTP de Golang |
|
El dominio no existe. |
|
dig |
|
El dominio no existe. |
|
Cliente HTTP de Golang |
|
El servidor DNS es inalcanzable. |
|
dig |
|
El servidor DNS es inalcanzable. |
Domain does not exist → Compruebe si el nombre de dominio es correcto. Si solo fallan los dominios externos, consulte External domain name cannot be resolved.
DNS server unreachable → Continúe con el Paso 2.
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.
|
|
Behavior |
|
|
Predeterminado. El pod usa la IP del Service kube-dns como servidor DNS. |
|
|
Igual que |
|
|
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. |
|
|
DNS configurado completamente mediante |
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
Pods not in Running state → Ejecute
kubectl -n kube-system describe pod <CoreDNS-pod-name>para identificar la causa. Consulte CoreDNS pods do not run as normal.CPU or memory near the limit → Consulte CoreDNS pods are overloaded.
CPU usage uneven across pods → Consulte Las consultas DNS no se distribuyen uniformemente.
Paso 4: Revise los registros operativos de CoreDNS
kubectl -n kube-system logs -f --tail=500 --timestamps <coredns-pod-name>
|
Flag |
Description |
|
|
Transmite la salida del registro en tiempo real. |
|
|
Muestra las últimas 500 líneas. |
|
|
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 |
|
|
Resuelto correctamente. |
No se requiere ninguna acción. |
|
|
El dominio no existe en el servidor upstream. |
Compruebe si el nombre de dominio incluye un sufijo de búsqueda que no se resuelve. |
|
|
El servidor DNS upstream devolvió un error. |
Verifique la conectividad de CoreDNS con los servidores upstream. |
|
|
El servidor upstream rechazó la consulta. |
Revise la configuración del Corefile de CoreDNS y el archivo |
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:
Revise el registro de consultas DNS en busca de códigos de respuesta de error. Consulte External domain name cannot be resolved.
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.
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> -- bashpara 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 connsenter -t <pid> -n bash.-
Método 3 (para pods que se reinician frecuentemente):
Inicie sesión en el nodo.
Ejecute
docker ps -a | grep <application-container-name>para encontrar los ID de los contenedores sandbox (los nombres comienzan conk8s_POD_).Ejecute
docker inspect <sandboxed-container-ID> | grep netnspara encontrar la ruta del namespace de red en/var/run/docker/netns/xxxx.Ejecute
nsenter -n bashpara ingresar al namespace. > Note: No agregue un espacio entre-ny<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
Inicie sesión en el nodo donde se ejecuta el pod de CoreDNS.
Ejecute
ps aux | grep corednspara obtener el ID del proceso de CoreDNS.Ejecute
nsenter -t <pid> -n bashpara ingresar al namespace de red de CoreDNS.-
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
Inicie sesión en la consola de ACKconsola de ACK.
En la página Clusters, haga clic en el nombre de su clúster o haga clic en Details en la columna Actions.
En el panel de navegación izquierdo, seleccione Operations > Cluster Check.
En la página de Container Intelligence Service, seleccione Cluster Check > Diagnosis.
En la página Diagnosis, haga clic en la pestaña Network Diagnosis.
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.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.
Inicie sesión en los nodos donde se ejecutan los pods de aplicación y el pod de CoreDNS.
-
Capture el tráfico DNS en cada instancia de ECS:
tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcapEsto captura todo el tráfico en el puerto 53, rotando hasta 200 archivos de 20 MB cada uno.
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 |
|
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 |
|
|
kube-proxy en modo IP Virtual Server (IPVS); CentOS o Alibaba Cloud Linux 2 con kernel anterior a |
Los fallos duran aproximadamente 5 minutos durante el escalado de nodos o de CoreDNS |
|
|
Nodos con alto tráfico |
|
|
|
Clústeres que usan tanto NodeLocal DNSCache como DNS PrivateZone |
Los nombres de dominio de PrivateZone o |
|
|
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 |
|
|
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
sessionAffinitydel 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 |
|
|
El ConfigMap de CoreDNS contiene un plugin no compatible con la versión actual. |
Elimine el plugin no compatible (por ejemplo, |
|
|
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. |
|
|
CoreDNS no pudo alcanzar los servidores DNS upstream. |
Pruebe la conectividad desde el pod de CoreDNS hacia |
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:
Edite el ConfigMap de CoreDNS con
kubectl -n kube-system edit configmap coredns.Elimine la línea
autopath @kubernetes. Guarde y salga.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-reopena 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_V4para 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:
Despliegue NodeLocal DNSCache para omitir la ruta IPVS en las consultas DNS. Consulte Configure NodeLocal DNSCache.
Reduzca el tiempo de espera de la sesión UDP en modo IPVS. Consulte Change the UDP timeout period in IPVS mode.
NodeLocal DNSCache no funciona
Las consultas DNS omiten NodeLocal DNSCache cuando se cumple alguna de estas condiciones:
No se inyectó
dnsConfigen 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.