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


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

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

Предпосылки

Предыстория

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

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. Проверьте, не перегружены ли поды 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. Проверьте журналы для подов 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 запущен, вы получите к нему доступ.

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

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

    kubectl describe cm coredns-custom -n kube-system
    

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

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

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

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

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

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

    Чтобы обновление параметров DNS вступило в силу, необходимо перезапустить сетевую службу на узле и модули pod CoreDNS. Чтобы перезапустить сетевую службу или модули 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 forwardpolicy указывает политику, которая будет использоваться для выбора вышестоящих серверов. Определения политик приведены в следующей таблице.

    Имя политики Описание
    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-сервера.

Отказ от ответственности за контакт с третьими лицами

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

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

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