Compartir a través de


Solución de errores de resolución de DNS desde el 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

Fondo

En el caso de la resolución DNS, los pods envían solicitudes a los pods de CoreDNS en el 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 de DNS de la red virtual en la que se ejecuta el nodo de trabajo.

Lista de comprobación de solución de problemas

Para solucionar problemas de DNS desde el pod, siga 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 de CoreDNS se están ejecutando:

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. Compruebe si los pods de CoreDNS están sobreutilizados:

    $ 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 de CoreDNS no se sobreutilizan. Además, obtenga los nodos que hospedan los pods de 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 de 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 comandos siguientes 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 pods funcionan al especificar explícitamente el servidor DNS ascendente, compruebe las condiciones siguientes:

  1. Busque un configMap personalizado para CoreDNS:

    kubectl describe cm coredns-custom -n kube-system
    

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

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

  3. Compruebe si los pods de CoreDNS están en un grupo de nodos diferente (grupo de nodos del sistema). Si lo son, 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 reinició el servicio de red en el nodo.

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

    • Reiniciar 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 de CoreDNS. Siga estos pasos:

      1. Realice una conexión de Secure Shell (SSH) a los nodos. para más información, consulte Conexión a los 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 actualiza:

        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 dns de la red virtual.

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

    • 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 de resolución 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 solucionadores las consulta en el orden que aparece. (La estrategia utilizada es probar primero un servidor de nombres. Si se agota el tiempo de espera de la consulta, pruebe el siguiente servidor de nombres y continúe hasta que se agote la lista de servidores de nombres. A continuación, la consulta continúa intentando conectarse a los servidores de nombres hasta que se realice 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 forwardcomplementopolicy CoreDNS, 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 del orden 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 podrían 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 Azure DNS (168.63.129.16), el nodo enviará solicitudes al primer servidor DNS personalizado si se está ejecutando y es accesible. En esta configuración, el nodo puede resolver el dominio personalizado. Sin embargo, algunas de las solicitudes DNS del pod podrían dirigirse a Azure DNS. Esto se debe a que CoreDNS puede seleccionar el servidor ascendente al azar. 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 más información, consulte Resolución de nombres con 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. Esta información de contacto puede cambiar sin previo aviso. 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.