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


Устранение неполадок DNS в кластере AKS в режиме реального времени

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

Примечание.

В этой статье описывается устранение неполадок с разрешением DNS из руководства pod .

Симптомы

В следующей таблице описаны распространенные симптомы, которые могут наблюдаться в кластере AKS:

Симптом Description
Высокая частота ошибок Запросы DNS завершаются ошибкой или возвращают непредвиденные результаты, что может повлиять на производительность и надежность приложений, которые зависят от них.
Неответственные службы Для устранения запросов DNS требуется больше времени, чем обычно, что может привести к задержкам или истечению времени ожидания в приложениях, которые используют их.
Обнаружение служб влияет Приложения не могут находить другие приложения в кластере из-за проблем с DNS, что может привести к сбоям или сбоям службы.
Внешний обмен данными влияет Приложения имеют проблемы с доступом к внешним ресурсам или конечным точкам за пределами кластера из-за проблем DNS, что может привести к ошибкам или снижению производительности.

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

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

Шаг 1. Определение неудачных ответов DNS в кластере

Вы можете использовать гаджет DNS для идентификации всех неудачных ответов DNS в кластере. Чтобы выполнить эту проверку, трассировка пакетов DNS на всех узлах и фильтрация неудачных ответов с помощью следующей команды:

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,qtype,rcode --filter qr:R --filter qtype:A --filter 'rcode:!No Error'
K8S.NODE         K8S.NAMESPACE    K8S.POD     K8S.CONTAINER    NAME                  QTYPE        RCODE 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 

Ниже приведены объяснения параметров команды:

  • --all-namespaces: показывает данные из модулей pod во всех пространствах имен.
  • -output columns=k8s,name,qtype,rcode: отображает только данные Kubernetes, DNS-имя, тип запроса и результат DNS-запроса.
  • --filter qr:R: соответствует только ответам DNS.
  • --filter qtype:A: соответствует только адресам узла IPv4.
  • --filter 'rcode:!No Error': соответствует ответам DNS, которые не содержатся No Error. Дополнительные сведения см. в статье gopacket о возможных значениях rcode или соответствующем RFC.

Ниже приведены некоторые причины неудачных ответов DNS:

  • Разрешенное DNS-имя имеет опечатку.
  • Проблемы с вышестоящими dns-серверами имен.
  • DNS-имя становится недействительным после расширения. Сведения о том, как могут быть развернуты DNS-запросы с помощью модуля pod /etc/resolv.conf, см. в разделе "Пространства имен служб".

Шаг 2. Определение медленных запросов DNS в кластере

Вы можете использовать гаджет DNS для идентификации всех медленных запросов DNS в кластере. Чтобы выполнить эту проверку, трассировка пакетов DNS на всех узлах и фильтрация медленных ответов.

В следующем примере используется значение 5ms задержки для определения медленных пакетов. Его можно изменить на требуемое значение, 5μsнапример , , : 20ms1s

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,rcode,latency --filter 'latency:>5ms'
K8S.NODE        K8S.NAMESPACE      K8S.POD       K8S.CONTAINER      NAME                            RCODE              LATENCY            
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 

Ниже приведены объяснения параметров команды:

  • --all-namespaces: показывает данные из модулей pod во всех пространствах имен.
  • --output columns=k8s,name,rcode,latency: отображает только сведения Kubernetes, DNS-имя, результат ответа DNS и задержку ответа.
  • --filter 'latency:>5ms': соответствует только dns-ответам с задержкой по крайней мере 5 ms.

Ниже приведены некоторые причины медленных запросов DNS:

Шаг 3. Проверка работоспособности вышестоящих DNS-серверов

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

В следующем примере dns-сервер Azure по умолчанию (IP-адрес 168.63.129.16) используется в качестве вышестоящего сервера имен. Если вы используете пользовательский DNS-сервер, можно использовать IP-адрес настраиваемого DNS-сервера в качестве вышестоящего сервера имен. Вы можете получить IP-адрес, выполнив поиск /etc/resolv.conf на узле.

$ kubectl gadget trace dns -n kube-system -l k8s-app=kube-dns -o columns=k8s,id,qr,name,rcode,nameserver,latency -F nameserver:168.63.129.16
K8S.NODE    K8S.NAMESPACE   K8S.POD                        K8S.CONTAINER   ID        QR    NAME               RCODE           NAMESERVER              LATENCY
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      Q     microsoft.com.                     168.63.129.16
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      R     microsoft.com.     No Error        168.63.129.16           500.821223ms

Ниже приведены объяснения параметров команды:

  • -n kube-system: отображает только данные из kube-system пространства имен.
  • -l k8s-app=kube-dns: отображает только данные из модулей pod с меткой k8s-app=kube-dns (модули pod CoreDNS).
  • -o columns=k8s,id,name,rcode,nameserver,latency: отображает только информацию Kubernetes, идентификатор DNS-запроса, запрос или ответ, DNS-имя, результат ответа DNS, сервер имен и задержку ответа.
  • -F nameserver:168.63.129.16: вышестоящий DNS-сервер, используемый для фильтрации событий.

Для определения работоспособности вышестоящего DNS-сервера можно использовать IDRCODEи LATENCY значения. Например, если есть неработоспособный вышестоящий сервер, вы увидите следующие выходные данные:

  • Dns-запрос (QR=Q) с ID (например, b256) не имеет соответствующего ответа.
  • Ответ DNS (QR=R) имеет большое значение в столбце LATENCY (например, 500.821223ms).
  • Ответ DNS (QR=R) отличается RCODE No Errorот типа "Сбой сервера" и "Запрос отказался". Дополнительные сведения см. в статье gopacket о возможных значениях rcode.

Шаг 4. Своевременное получение ответов на запросы DNS

Вы можете использовать гаджет DNS, чтобы убедиться, что конкретный DNS-запрос своевременно получает ответ. Чтобы выполнить эту проверку, отфильтруйте события с dns-именем и соответствующими идентификаторам запроса и ответа:

$ kubectl gadget trace dns -l app=test-pod --output columns=k8s,id,qtype,qr,name,rcode,latency --filter name:microsoft.com.
K8S.NODE       K8S.NAMESPACE   K8S.POD     K8S.CONTAINER   ID          QTYPE     QR  NAME              RCODE               LATENCY
aks-agen...    default         test-pod    nginx           97b3        A         Q   microsoft.com.
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error            1.954413ms
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error
aks-agen...    default         test-pod    nginx           c6c5        AAAA      Q   microsoft.com.
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error            1.885412ms
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error

Ниже приведены объяснения параметров команды:

  • -l app=test-pod: отображает только данные из модулей pod с меткой app=test-pod.
  • --output columns=k8s,id,qtype,qr,name,rcode,latency: отображает только информацию Kubernetes, идентификатор DNS-запроса, тип запроса, запрос и ответ, DNS-имя, результат ответа DNS и задержку ответа.
  • --filter name:microsoft.com.: соответствует только DNS-пакетам с DNS-именемmicrosoft.com., чтобы убедиться, что значение фильтра является полным доменным именем (FQDN), добавьте точку (.) в конец имени.

Значение ID (например, 97b3можно использовать для сопоставления запросов с ответами). Вы также можете использовать LATENCY значение для проверки своевременности получения ответов.

Шаг 5. Проверка ответов DNS должна содержать ожидаемые IP-адреса

Вы можете использовать гаджет DNS, чтобы убедиться, что конкретный DNS-запрос получает ожидаемый ответ. Например, для службы без головы (с именем myheadless) вы ожидаете, что ответ будет содержать IP-адреса всех модулей pod.

$ kubectl gadget trace dns -l app=test-pod  -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses  -F name:~myheadless 
K8S.NODE         K8S.NAMESPACE      K8S.POD         K8S.CONTAINER   ID    QTYPE   QR  NAME                 RCODE           NUMANSWERS     ADDRESSES
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       Q   myheadless.defau...                  0                              

Ниже приведены объяснения параметров команды:

  • -l app=test-pod: отображает только данные из модулей pod с меткой app=test-pod.
  • -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses: отображает только информацию Kubernetes, идентификатор DNS-запроса, тип запроса, запрос или ответ, DNS-имя, результат ответа DNS, количество ответов и IP-адреса в ответе.
  • -F name:~myheadless: включает только пакеты DNS, которые передают проверку регрессии ~myheadless .

Значения и ADDRESSES значения можно использовать NUMANSWERS для сопоставления значений, полученных изkubectl get ep myheadless.

$ kubectl get ep myheadless 
NAME                  ENDPOINTS                           AGE 
myheadless            10.244.2.18:8080,10.244.2.19:8080   10d 

Заявление об отказе от ответственности за сведения о продуктах сторонних производителей

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

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

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