Compartir a través de


Solución de problemas de errores de resolución de DNS desde dentro del pod, pero no desde el nodo de trabajo

En este artículo se describe cómo solucionar errores de resolución del sistema de nombres de dominio (DNS) que se producen desde dentro del pod, pero no desde el nodo de trabajo, al intentar establecer una conexión saliente desde un clúster de Microsoft Azure Kubernetes Service (AKS).

Requisitos previos

  • La herramienta kubectl de Kubernetes o una herramienta similar para conectarse al clúster. Para instalar kubectl mediante la CLI de Azure, ejecute el comando az aks install-cli .

  • La herramienta de línea de comandos apt-get para controlar paquetes.

  • Herramienta de línea de comandos de host para las búsquedas dns.

  • Herramienta de línea de comandos systemctl .

Información previa

Para la resolución DNS, los pods envían solicitudes a los pods CoreDNS del kube-system espacio de nombres.

Si la consulta DNS es para un componente interno, como un nombre de servicio, el pod CoreDNS responde por sí mismo. Sin embargo, si la solicitud es para un dominio externo, el pod CoreDNS envía la solicitud al servidor DNS ascendente.

Los servidores DNS ascendentes se obtienen en función del archivo resolv.conf del nodo de trabajo en el que se ejecuta el pod. El archivo resolv.conf (/run/systemd/resolve/resolv.conf) se actualiza en función de la configuración dns de la red virtual en la que se ejecuta el nodo de trabajo.

Lista de comprobación para la solución de problemas

Para solucionar problemas de DNS desde dentro del pod, use las instrucciones de las secciones siguientes.

Paso 1: Solución de problemas de DNS desde el pod

Puede usar comandos kubectl para solucionar problemas de DNS desde el pod, como se muestra en los pasos siguientes:

  1. Compruebe que los pods CoreDNS están en ejecución:

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. Compruebe si los pods CoreDNS se usan en exceso:

    $ kubectl top pods -n kube-system -l k8s-app=kube-dns
    NAME                      CPU(cores)   MEMORY(bytes)
    coredns-dc97c5f55-424f7   3m           23Mi
    coredns-dc97c5f55-wbh4q   3m           25Mi
    
  3. Compruebe que los nodos que hospedan los pods CoreDNS no se usan en exceso. Además, obtenga los nodos que hospedan los pods CoreDNS:

    kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
    
  4. Compruebe el uso de estos nodos:

    kubectl top nodes
    
  5. Compruebe los registros de los pods CoreDNS:

    kubectl logs -l k8s-app=kube-dns -n kube-system
    

Nota:

Para ver más información de depuración, habilite los registros detallados en CoreDNS. Para habilitar el registro detallado en CoreDNS, consulte Solución de problemas de personalizaciones de CoreDNS en AKS.

Paso 2: Creación de un pod de prueba para ejecutar comandos

Si se produce un error en la resolución dns, siga estos pasos:

  1. Ejecute un pod de prueba en el mismo espacio de nombres que el pod problemático.

  2. Inicie un pod de prueba en el clúster:

    kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
    

    Cuando se ejecute el pod de prueba, obtendrá acceso al pod.

  3. Ejecute los siguientes comandos para instalar los paquetes necesarios:

    apt-get update -y
    apt-get install dnsutils -y
    
  4. Compruebe que el archivo resolv.conf tiene las entradas correctas:

    cat /etc/resolv.conf
    search default.svc.cluster.local svc.cluster.local cluster.local 00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net
    nameserver 10.0.0.10
    options ndots:5
    
  5. Use el host comando para determinar si las solicitudes DNS se enrutan al servidor ascendente:

    $ host -a microsoft.com
    Trying "microsoft.com.default.svc.cluster.local"
    Trying "microsoft.com.svc.cluster.local"
    Trying "microsoft.com.cluster.local"
    Trying "microsoft.com.00idcnmrrm4edot5s2or1onxsc.bx.internal.cloudapp.net"
    Trying "microsoft.com"
    Trying "microsoft.com"
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62884
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 27, AUTHORITY: 0, ADDITIONAL: 5
    
    ;; QUESTION SECTION:
    ;microsoft.com.                 IN      ANY
    
    ;; ANSWER SECTION:
    microsoft.com.          30      IN      NS      ns1-39.azure-dns.com.
    ...
    ...
    ns4-39.azure-dns.info.  30      IN      A       13.107.206.39
    
    Received 2121 bytes from 10.0.0.10#53 in 232 ms
    
  6. Compruebe el servidor DNS ascendente del pod para determinar si la resolución DNS funciona correctamente. Por ejemplo, para Azure DNS, ejecute el siguiente comando nslookup :

    $ nslookup microsoft.com 168.63.129.16
    Server:         168.63.129.16
    Address:        168.63.129.16#53
    ...
    ...
    Address: 20.81.111.85
    

Paso 3: Comprobar si las solicitudes DNS funcionan cuando se especifica explícitamente el servidor DNS ascendente

Si las solicitudes DNS de los pods funcionan cuando se especifica explícitamente el servidor DNS ascendente, compruebe las condiciones siguientes:

  1. Compruebe si hay un configMap personalizado para CoreDNS:

    kubectl describe cm coredns-custom -n kube-system
    

    Si hay un objeto ConfigMap personalizado, compruebe que la configuración es correcta. Para obtener más información, consulte Personalización de CoreDNS con Azure Kubernetes Service.

  2. Compruebe si una directiva de red está bloqueando el tráfico en el puerto 53 del Protocolo de datagramas de usuario (UDP) a los pods CoreDNS del espacio de kube-system nombres.

  3. Compruebe si los pods CoreDNS están en un grupo de nodos diferente (grupo de nodos del sistema). Si es así, compruebe si un grupo de seguridad de red (NSG) está asociado al grupo de nodos del sistema que bloquea el tráfico en el puerto UDP 53.

  4. Compruebe si la red virtual se actualizó recientemente para agregar los nuevos servidores DNS.

    Si se ha producido una actualización de red virtual, compruebe si también se ha producido uno de los siguientes eventos:

    • Se reiniciaron los nodos.
    • Se ha reiniciado el servicio de red del nodo.

    Para que la actualización de la configuración de DNS surta efecto, es preciso reiniciar el servicio de red en el nodo y los pods coreDNS. Para reiniciar el servicio de red o los pods, use uno de los métodos siguientes:

    • Reinicie el nodo.

    • Escalado de nuevos nodos. (Los nuevos nodos tendrán la configuración actualizada).

    • Reinicie el servicio de red en los nodos y, a continuación, reinicie los pods CoreDNS. Siga estos pasos:

      1. Realice una conexión de Secure Shell (SSH) a los nodos. Para obtener más información, consulte Conexión a nodos de clúster de Azure Kubernetes Service (AKS) para mantenimiento o solución de problemas.

      2. Desde dentro del nodo, reinicie el servicio de red:

        systemctl restart systemd-networkd
        
      3. Compruebe si la configuración se ha actualizado:

        cat /run/systemd/resolve/resolv.conf
        
      4. Una vez reiniciado el servicio de red, use kubectl para reiniciar los pods de CoreDNS:

        kubectl delete pods -l k8s-app=kube-dns -n kube-system
        
  5. Compruebe si se especifica más de un servidor DNS en la configuración de DNS de red virtual.

    Si se especifican varios servidores DNS en la red virtual de AKS, se produce una de las secuencias siguientes:

    • El nodo de AKS envía una solicitud al servidor DNS ascendente como parte de una serie. En esta secuencia, la solicitud se envía al primer servidor DNS configurado en la red virtual (si los servidores DNS son accesibles y en ejecución). Si el primer servidor DNS no es accesible y no responde, la solicitud se envía al siguiente servidor DNS.

      Los nodos de AKS usan el comando resolver para enviar solicitudes a los servidores DNS. El archivo de configuración de este solucionador se puede encontrar en /run/systemd/resolve/resolv.conf en los nodos de AKS.

      ¿Hay varios servidores? En este caso, la biblioteca de resolución los consulta en el orden que se muestra. (La estrategia usada es probar primero un servidor de nombres. Si la consulta agota el tiempo de espera, pruebe con el servidor de nombres siguiente y continúe hasta que se agote la lista de servidores de nombres. A continuación, la consulta sigue intentando conectarse a los servidores de nombres hasta que se realiza el número máximo de reintentos).

    • CoreDNS usa el complemento de reenvío para enviar solicitudes a servidores DNS ascendentes. Este complemento usa un algoritmo aleatorio para seleccionar el servidor DNS ascendente. En esta secuencia, la solicitud podría ir a cualquiera de los servidores DNS que se mencionan en la red virtual. Por ejemplo, puede recibir la siguiente salida:

      $ kubectl describe cm coredns -n kube-system
      Name:         coredns
      Namespace:    kube-system
      Labels:       addonmanager.kubernetes.io/mode=Reconcile
                    k8s-app=kube-dns
                    kubernetes.io/cluster-service=true
      Annotations:  <none>
      
      Data
      ====
      Corefile:
      ----
      .:53 {
          errors
          ready
          health
          kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
          }
          prometheus :9153
          forward . /etc/resolv.conf                            # Here!
          cache 30
          loop
          reload
          loadbalance
          import custom/*.override
      }
      import custom/*.server
      
      
      BinaryData
      ====
      
      Events:  <none>
      

    En el complemento CoreDNS forward , policy especifica la directiva que se va a usar para seleccionar servidores ascendentes. Las directivas se definen en la tabla siguiente.

    Nombre de la directiva Descripción
    random Directiva que implementa la selección ascendente aleatoria. Esta directiva es la directiva predeterminada.
    round_robin Directiva que selecciona hosts en función de la ordenación round robin.
    sequential Directiva que selecciona hosts en función del orden secuencial.

    Si la red virtual de AKS contiene varios servidores DNS, las solicitudes del nodo de AKS pueden ir al primer servidor DNS. Sin embargo, las solicitudes del pod pueden ir al segundo servidor DNS.

Causa: Varios destinos para solicitudes DNS

Si se especifican dos servidores DNS personalizados y el tercer servidor DNS se especifica como DNS de Azure (168.63.129.16), el nodo enviará solicitudes al primer servidor DNS personalizado si se ejecuta y es accesible. En esta configuración, el nodo puede resolver el dominio personalizado. Sin embargo, algunas de las solicitudes DNS del pod pueden dirigirse a Azure DNS. Esto se debe a que CoreDNS puede seleccionar el servidor ascendente de forma aleatoria. En este escenario, no se puede resolver el dominio personalizado. Por lo tanto, se produce un error en la solicitud DNS.

Solución: Eliminación de Azure DNS de la configuración de red virtual

Se recomienda no combinar Azure DNS con servidores DNS personalizados en la configuración de red virtual. Si desea usar los servidores DNS personalizados, agregue solo los servidores DNS personalizados en la configuración de red virtual. A continuación, configure Azure DNS en la configuración del reenviador de los servidores DNS personalizados.

Para obtener más información, consulte Resolución de nombres que usa su propio servidor DNS.

Aviso de declinación de responsabilidades sobre la información de contacto de terceros

Microsoft proporciona información de contacto de otros proveedores para ayudarle a encontrar información adicional sobre este tema. Dicha información de contacto puede cambiar sin notificación previa. Microsoft no garantiza la precisión de esta información de contacto de terceros.

Ponte en contacto con nosotros para obtener ayuda

Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.