Поделиться через


Устранение ошибок разрешения DNS в модуле pod, но в рабочем узле

В этой статье описывается, как устранять сбои разрешения системы доменных имен (DNS), возникающие из модуля pod, но не из рабочего узла, при попытке установить исходящее подключение из кластера Microsoft Служба Azure Kubernetes (AKS).

Предварительные требования

Общие сведения

Для разрешения DNS модули pod отправляют запросы в модули pod CoreDNS в kube-system пространстве имен.

Если DNS-запрос предназначен для внутреннего компонента, например имени службы, модуль pod CoreDNS отвечает самостоятельно. Однако если запрос предназначен для внешнего домена, модуль Pod CoreDNS отправляет запрос на вышестоящий DNS-сервер.

Исходящие DNS-серверы получаются на основе файла resolv.conf рабочего узла, в котором выполняется модуль pod. Файл resolve.conf ( /run/systemd/resolve/resolve.conf) обновляется на основе параметров DNS виртуальной сети, в которой выполняется рабочий узел.

Контрольный список по устранению неполадок

Чтобы устранить проблемы с DNS из модуля pod, используйте инструкции в следующих разделах.

Шаг 1. Устранение неполадок с DNS из модуля pod

Команды kubectl можно использовать для устранения проблем с DNS из pod, как показано на следующих шагах:

  1. Убедитесь, что модули pod CoreDNS выполняются:

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. Проверьте, используются ли модули pod CoreDNS:

    $ 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. Убедитесь, что узлы, на которых размещаются модули pod CoreDNS, не переиспользуются. Кроме того, получите узлы, на которых размещаются модули pod CoreDNS:

    kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
    
  4. Проверьте использование этих узлов:

    kubectl top nodes
    
  5. Проверьте журналы для модулей pod CoreDNS:

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

Примечание.

Чтобы просмотреть дополнительные сведения об отладке, включите подробные журналы в CoreDNS. Чтобы включить подробное ведение журнала в CoreDNS, см. раздел "Устранение неполадок с настройками CoreDNS" в AKS.

Шаг 2. Создание тестового модуля pod для выполнения команд

Если разрешение DNS завершается ошибкой, выполните следующие действия.

  1. Запустите тестовый модуль pod в том же пространстве имен, что и проблематичный модуль pod.

  2. Запустите тестовый модуль pod в кластере:

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

    При запуске тестового модуля pod вы получите доступ к модулю pod.

  3. Чтобы установить необходимые пакеты, выполните следующие команды:

    apt-get update -y
    apt-get install dnsutils -y
    
  4. Убедитесь, что файл resolv.conf содержит правильные записи:

    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. host Используйте команду, чтобы определить, направляются ли DNS-запросы на вышестоящий сервер:

    $ 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. Проверьте вышестоящий DNS-сервер из модуля pod, чтобы определить, работает ли разрешение DNS правильно. Например, для Azure DNS выполните следующую команду nslookup :

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

Шаг 3. Проверка того, работают ли DNS-запросы при явном указании вышестоящего DNS-сервера.

Если dns-запросы из модулей pod работают при явном указании вышестоящего DNS-сервера, проверьте следующие условия:

  1. Проверьте настраиваемый ConfigMap для CoreDNS:

    kubectl describe cm coredns-custom -n kube-system
    

    Если пользовательский ConfigMap присутствует, убедитесь, что конфигурация правильна. Дополнительные сведения см. в разделе "Настройка CoreDNS с помощью Служба Azure Kubernetes".

  2. Проверьте, блокирует ли сетевая политика трафик через порт UDP (UDP) в модули pod CoreDNS в kube-system пространстве имен.

  3. Проверьте, находятся ли модули pod CoreDNS в другом пуле узлов (пул системных узлов). Если они есть, проверьте, связана ли группа безопасности сети (NSG) с пулом системных узлов, блокирующим трафик через порт UDP 53.

  4. Проверьте, обновлена ли виртуальная сеть недавно, чтобы добавить новые DNS-серверы.

    Если произошло обновление виртуальной сети, проверьте, произошло ли одно из следующих событий:

    • Узлы были перезапущены.
    • Сетевая служба на узле была перезапущена.

    Чтобы обновление параметров DNS вступило в силу, необходимо перезапустить сетевую службу на узле и модули pod CoreDNS. Чтобы перезапустить сетевую службу или модули pod, используйте один из следующих методов:

    • Перезапустите узел.

    • Масштабирование новых узлов. (Новые узлы будут иметь обновленную конфигурацию.)

    • Перезапустите сетевую службу на узлах, а затем перезапустите модули pod CoreDNS. Выполните следующие действия:

      1. Подключение Secure Shell (SSH) к узлам. Дополнительные сведения см. в статье Подключение к узлам кластера Службы Azure Kubernetes (AKS) для обслуживания или устранения неполадок.

      2. В узле перезапустите сетевую службу:

        systemctl restart systemd-networkd
        
      3. Проверьте, обновляются ли параметры:

        cat /run/systemd/resolve/resolv.conf
        
      4. После перезапуска сетевой службы используйте kubectl для перезапуска модулей pod CoreDNS:

        kubectl delete pods -l k8s-app=kube-dns -n kube-system
        
  5. Проверьте, указано ли более одного DNS-сервера в параметрах DNS виртуальной сети.

    Если несколько DNS-серверов указаны в виртуальной сети AKS, происходит одна из следующих последовательностей:

    • Узел AKS отправляет запрос на вышестоящий DNS-сервер в рамках ряда. В этой последовательности запрос отправляется на первый DNS-сервер, настроенный в виртуальной сети (если DNS-серверы доступны и выполняются). Если первый DNS-сервер недоступен и не отвечает, запрос отправляется на следующий DNS-сервер.

      Узлы AKS используют команду сопоставителя для отправки запросов на DNS-серверы. Файл конфигурации для этого сопоставителя можно найти в файле /run/systemd/resolve/resolve.conf на узлах AKS.

      Есть ли несколько серверов? В этом случае библиотека сопоставителя запрашивает их в указанном порядке. (Используемая стратегия — сначала попробовать сервер имен. Если время ожидания запроса истекает, попробуйте использовать следующий сервер имен и продолжить, пока не будет исчерпан список серверов имен. Затем запрос продолжает пытаться подключиться к серверам имен до тех пор, пока не будет выполнено максимальное количество повторных попыток.)

    • CoreDNS использует подключаемый модуль пересылки для отправки запросов на вышестоящий DNS-сервер. Этот подключаемый модуль использует случайный алгоритм для выбора вышестоящего DNS-сервера. В этой последовательности запрос может перейти на любой из DNS-серверов, упомянутых в виртуальной сети. Например, вы можете получить следующие выходные данные:

      $ 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>
      

    В подключаемом модуле CoreDNS forward policy указывает политику, которая будет использоваться для выбора вышестоящих серверов. Определения политик приведены в следующей таблице.

    Имя политики Описание
    random Политика, реализующая случайный выбор вышестоящих серверов. Это политика по умолчанию.
    round_robin Политика, которая отвечает за выбор узлов в порядке циклического перебора.
    sequential Политика, которая отвечает за выбор узлов в последовательном порядке.

    Если виртуальная сеть AKS содержит несколько DNS-серверов, запросы с узла AKS могут перейти на первый DNS-сервер. Однако запросы из pod могут переходить на второй DNS-сервер.

Причина: несколько назначений для DNS-запросов

Если указаны два пользовательских DNS-сервера, а третий DNS-сервер указан как Azure DNS (168.63.129.16), узел отправляет запросы на первый пользовательский DNS-сервер, если он работает и доступен. В этой настройке узел может разрешить личный домен. Однако некоторые запросы DNS из модуля pod могут направляться в Azure DNS. Это связано с тем, что CoreDNS может выбрать вышестоящий сервер случайным образом. В этом сценарии не удается разрешить личный домен. Поэтому запрос DNS завершается ошибкой.

Решение. Удаление Azure DNS из параметров виртуальной сети

Рекомендуется не объединять Azure DNS с пользовательскими DNS-серверами в параметрах виртуальной сети. Если вы хотите использовать настраиваемые DNS-серверы, добавьте только пользовательские DNS-серверы в параметры виртуальной сети. Затем настройте Azure DNS в параметрах пересылки пользовательских DNS-серверов.

Дополнительные сведения см. в разделе Разрешение имен с помощью собственного DNS-сервера.

Заявление об отказе от ответственности за контактные данные сторонней организации

Корпорация Майкрософт предоставляет контактные данные сторонних производителей в целях получения дополнительных сведений по данной теме. Эти данные могут быть изменены без предварительного уведомления. Корпорация Майкрософт не гарантирует точность контактных данных сторонних производителей.

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.