Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как устранять сбои разрешения системы доменных имен (DNS), возникающие из модуля pod, но не из рабочего узла, при попытке установить исходящее подключение из кластера Службы Microsoft Azure Kubernetes (AKS).
Предпосылки
Средство Kubernetes kubectl или аналогичное средство для подключения к кластеру. Чтобы установить kubectl с помощью Azure CLI, выполните команду az aks install-cli.
Средство командной строки apt-get для обработки пакетов.
Средство командной строки хост для DNS-запросов.
Средство командной строки systemctl .
Предыстория
Для разрешения 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, как показано на следующих шагах:
Убедитесь, что поды CoreDNS запущены:
kubectl get pods -l k8s-app=kube-dns -n kube-system
Проверьте, не перегружены ли поды 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
Убедитесь, что узлы, на которых размещаются модули pod CoreDNS, не переиспользуются. Кроме того, получите узлы, на которых размещаются Pod-ы CoreDNS.
kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
Проверьте использование этих узлов:
kubectl top nodes
Проверьте журналы для подов CoreDNS.
kubectl logs -l k8s-app=kube-dns -n kube-system
Замечание
Чтобы просмотреть дополнительные сведения об отладке, включите подробные журналы в CoreDNS. Чтобы включить подробное логирование в CoreDNS, ознакомьтесь с разделом "Устранение неполадок с настройками CoreDNS" в AKS.
Шаг 2. Создание тестового модуля pod для выполнения команд
Если не удается разрешить DNS, выполните следующие действия.
Запустите тестовый модуль pod в том же пространстве имен, что и проблематичный модуль pod.
Запустите тестовый модуль pod в кластере:
kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
Когда тестовый pod запущен, вы получите к нему доступ.
Чтобы установить необходимые пакеты, выполните следующие команды:
apt-get update -y apt-get install dnsutils -y
Убедитесь, что файл 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
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
Проверьте верхний 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-сервера, проверьте следующие условия:
Проверьте, существует ли настраиваемый ConfigMap для CoreDNS.
kubectl describe cm coredns-custom -n kube-system
Если пользовательский ConfigMap присутствует, убедитесь, что конфигурация правильна. Дополнительные сведения см. в статье "Настройка CoreDNS" с помощью службы Azure Kubernetes.
Проверьте, блокирует ли сетевая политика трафик по порту UDP 53 к подам CoreDNS в пространстве имен
kube-system
.Проверьте, находятся ли поды CoreDNS в другом пуле узлов (системном пуле узлов). Если они есть, проверьте, связана ли группа безопасности сети (NSG) с пулом системных узлов, блокирующим трафик через порт UDP 53.
Проверьте, обновлена ли виртуальная сеть недавно, чтобы добавить новые DNS-серверы.
Если произошло обновление виртуальной сети, проверьте, произошло ли одно из следующих событий:
- Узлы были перезапущены.
- Сетевая служба на узле была перезапущена.
Чтобы обновление параметров DNS вступило в силу, необходимо перезапустить сетевую службу на узле и модули pod CoreDNS. Чтобы перезапустить сетевую службу или модули pod, используйте один из следующих методов:
Перезапустите узел.
Масштабирование новых узлов. (Новые узлы будут иметь обновленную конфигурацию.)
Перезапустите сетевую службу на узлах, а затем перезапустите поды CoreDNS. Выполните следующие действия.
Установите соединение через Secure Shell (SSH) с узлами. Дополнительные сведения см. в статье Подключение к узлам кластера Службы Azure Kubernetes (AKS) для обслуживания или устранения неполадок.
В узле перезапустите сетевую службу:
systemctl restart systemd-networkd
Проверьте, обновляются ли параметры:
cat /run/systemd/resolve/resolv.conf
После перезапуска сетевой службы используйте kubectl для перезапуска модулей pod CoreDNS:
kubectl delete pods -l k8s-app=kube-dns -n kube-system
Проверьте, указано ли более одного 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-сервера.
Отказ от ответственности за контакт с третьими лицами
Microsoft предоставляет контактную информацию сторонних организаций, чтобы помочь вам найти дополнительную информацию по этой теме. Эти контактные данные могут изменяться без уведомления. Корпорация Майкрософт не гарантирует точность сторонних контактных данных.
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или нужна помощь, создайте запрос на поддержку или обратитесь к поддержке сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.