Устранение неполадок DNS в кластере AKS в режиме реального времени
Проблемы системы доменных имен (DNS) в Kubernetes могут нарушить взаимодействие между модулями pod, службами и внешними ресурсами, что приводит к сбоям приложений и снижению производительности. В этой статье описывается, как устранять сбои DNS в кластере Служба Azure Kubernetes (AKS) в режиме реального времени.
Примечание.
В этой статье описывается устранение неполадок с разрешением DNS из руководства pod .
Симптомы
В следующей таблице описаны распространенные симптомы, которые могут наблюдаться в кластере AKS:
Симптом | Description |
---|---|
Высокая частота ошибок | Запросы DNS завершаются ошибкой или возвращают непредвиденные результаты, что может повлиять на производительность и надежность приложений, которые зависят от них. |
Неответственные службы | Для устранения запросов DNS требуется больше времени, чем обычно, что может привести к задержкам или истечению времени ожидания в приложениях, которые используют их. |
Обнаружение служб влияет | Приложения не могут находить другие приложения в кластере из-за проблем с DNS, что может привести к сбоям или сбоям службы. |
Внешний обмен данными влияет | Приложения имеют проблемы с доступом к внешним ресурсам или конечным точкам за пределами кластера из-за проблем DNS, что может привести к ошибкам или снижению производительности. |
Предварительные требования
Azure CLI.
Сведения об установке Azure CLI см. в статье "Установка Azure CLI".
Средство для подключения к кластеру, например kubernetes командной строки kubectl.
Чтобы установить kubectl с помощью Azure CLI, выполните команду az aks install-cli.
-
Это средство используется в большинстве действий по устранению неполадок, описанных в этой статье, поэтому обязательно установите его в кластере. Чтобы установить его в кластере AKS, см. инструкции по установке Inspektor Gadget в кластере AKS.
Знакомство с гаджетами.
Гаджет Inspektor Для 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
например , , : 20ms
1s
$ 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:
- Проблемы с вышестоящими dns-серверами имен.
- Проблемы с сетью в кластере.
- Модули pod CoreDNS недоступны. Чтобы убедиться, что модули pod выполняются нормально, выполните действия по устранению неполадок, описанных в разделе "Устранение неполадок с разрешением DNS" из модуля pod.
Шаг 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-сервера можно использовать ID
RCODE
и 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.