Устранение неполадок с исчерпанием портов SNAT на узлах Служба Azure Kubernetes
В этой статье показано, как найти и устранить неполадки с узлами Служба Azure Kubernetes (AKS), которые испытывают исчерпание портов преобразования сетевых адресов (SNAT).
Примечание.
- Чтобы устранить неполадки с исчерпанием портов SNAT на узлах AKS в кластере AKS с заданиями Kubernetes, выполните следующие действия, только если задания активно выполняются на узлах AKS.
- Дополнительные сведения о портах SNAT и их выделении на каждую виртуальную машину см. в статье о портах SNAT.
Шаг 1. Найдите узел, который испытывает исчерпание портов SNAT
Получите IP-адрес узла AKS, который испытывает активный исчерпание портов SNAT из портал Azure.
Для этого перейдите к кластеру AKS в портал Azure и выберите "Диагностика и устранение проблем>с подключением SNAT>" и "Выделение портов". На вкладке "Подключение SNAT" и "Выделение портов" отображается частный IP-адрес узла AKS, который испытывает исчерпание портов SNAT.
Подключитесь к кластеру AKS и используйте IP-адрес узла, чтобы получить имя узла, выполнив следующую
kubectl
команду:kubectl get nodes -o wide | grep <node IP>
Шаг 2. Поиск модуля pod Linux с высоким уровнем исходящих подключений
Примечание.
- Tcptracer — это один из средств коллекции компиляторов BPF (BCC), предварительно установленных на узлах Linux. Он позволяет отслеживать установленные TCP-подключения (
connect()
,accept()
иclose()
). Его можно использовать для поиска больших исходящих подключений из исходного IP-адреса и сетевого пространства имен (netns) модуля pod. - Чтобы получить доступ к средствам BCC, используйте только оболочку узла kubectl.
- Все следующие команды в этом разделе выполняются в качестве корневого пользователя на узле Linux с установленными средствами BCC.
На узле Linux, который испытывает исчерпание портов SNAT, установите kubectl node-shell:
curl -LO https://github.com/kvaps/kubectl-node-shell/raw/master/kubectl-node_shell chmod +x ./kubectl-node_shell sudo mv ./kubectl-node_shell /usr/local/bin/kubectl-node_shell
Используйте SSH для подключения к узлу, который испытывает исчерпание портов SNAT и используется
tcptracer
для трассировки установленных tcp-подключений:kubectl node-shell <node name> cd /usr/share/bcc/tools /usr/share/bcc/tools# python3 tcptracer -t4v
Ниже приведен пример выходных данных команды:
Tracing TCP established connections. Ctrl-C to end. TIME(ns) TYPE PID COMM IP SADDR DADDR SPORT DPORT NETNS 0 connect 18627 curl 4 1.2.3.4 5.6.7.8 53746 80 4026532785 3xxx9 close 18627 curl 4 1.2.3.4 5.6.7.8 53746 80 4026532785 1xxxx4 connect 18629 curl 4 1.2.3.4 9.10.11.12 35686 80 4026532785 2xxxx9 close 18629 curl 4 1.2.3.4 9.10.11.12 35686 80 4026532785 4xxxx5 connect 18631 curl 4 1.2.3.4 9.10.11.12 35688 80 4026532785 4xxxx8 close 18631 curl 4 1.2.3.4 9.10.11.12 35688 80 4026532785 7xxxx3 connect 18633 curl 4 1.2.3.4 13.14.15.16 35690 80 4026532785 9xxxx7 close 18633 curl 4 1.2.3.4 13.14.15.16 35690 80 4026532785
Запишите предыдущие выходные данные команды в файл журнала, а затем сортируйте выходные данные, чтобы просмотреть список высоких подключений:
python3 tcptracer -t4v > log head -n +2 log | tail -n 1 | awk '{print "Count",$6,$10}'; awk '{print $6,$10}' log | sort | uniq -c | sort -nrk 1 | column -t
Ниже приведен пример выходных данных команды:
Count SADDR NETNS 387 1.2.3.4 4026532785 8 11.22.33.44 4026532184 8 55.66.77.88 4026531992
Сопоставляйте IP-адрес с наибольшим числом подключений из предыдущих выходных данных с pod. Если это не работает, можно продолжить.
SADDR
Запишите илиNETNS
значение с наибольшим числом подключений из предыдущих выходных данных, а затем выполните следующую команду lsns, чтобы сопоставить ее с PID. Lsns — это средство Linux, которое перечисляет пространства имен и сопоставляет пространства имен с ИДЕНТИФИКАТОРами в дереве процессов Linux.lsns -t net
Ниже приведен пример выходных данных команды:
NS TYPE NPROCS PID USER COMMAND 4026532785 net 3 19832 root bash
Сопоставьте предыдущий PID с контейнерным процессом с помощью pstree. Pstree — это средство Linux, которое перечисляет процессы в формате дерева для удобства чтения.
pstree -aps 19832
Ниже приведен пример выходных данных команды:
systemd,1 `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
Обратите внимание на первые пять символов контейнера
-id
в выходных данных команды. Он будет использоваться на шаге 7.Сопоставите предыдущее контейнерное
-id
значение с идентификатором POD с помощью crictl. Crictl предоставляет интерфейс командной строки для сред выполнения контейнеров, совместимых с CRI.crictl ps -a
Ниже приведен пример выходных данных команды:
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD 6b5xxxxb fbxxxxx1 6 hours ago Running ubuntu 0 2xxxxxxxxf nginx
Используйте первые пять символов предыдущего контейнерного
-id
значения для сопоставления идентификатора POD.Получите все модули pod, выполняемые на узле, и используйте предыдущий идентификатор POD для сопоставления pod с высоким исходящим подключением из выходных данных команды:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
Шаг 3. Поиск всех исходящих сетевых подключений, сделанных приложением
Выполните вход в модуль pod, который определяется как имеющие высокие исходящие подключения в шаге 2 с помощью одной из следующих команд:
-
kubectl exec -it <pod name> -n <namespace> /bin/bash
-
kubectl exec -it <pod name> -n <namespace> /bin/sh
-
Установите средство командной строки netstat в pod, выполнив следующую команду. Netstat — это средство устранения неполадок сети только для администраторов.
В Debian, Ubuntu или Linux Mint
apt update apt install net-tools
В RHEL, CentOS, Fedora, AlmaLinux или Rocky Linux
yum update yum install net-tools
В Gentoo Linux
emerge -a sys-apps/net-tools
В Alpine Linux
apk add net-tools
На arch Linux
pacman -S net-tools
В OpenSUSE
zypper install net-tools
После установки netstat в pod выполните следующую команду:
netstat -ptn | grep -i established
Ниже приведен пример выходных данных команды:
tcp 0 0 10.x.x.x:xxxx 20.x.x.x:443 ESTABLISHED xxxxx3/telnet
В выходных данных команды локальный адрес является IP-адресом pod, а внешний адрес — IP-адрес, к которому подключается приложение. Общедоступные IP-подключения в ESTABLISHED
состоянии — это подключения, использующие SNAT. Убедитесь, что вы подсчитываете только подключения в ESTABLISHED
состоянии к общедоступным IP-адресам и игнорируете все подключения в ESTABLISHED
состоянии к частным IP-адресам.
Повторите действия, описанные в этом разделе, для всех остальных модулей pod, работающих на узле. Модуль pod с наибольшим числом подключений в ESTABLISHED
состоянии к общедоступным IP-адресам размещает приложение, которое приводит к исчерпанию портов SNAT на узле. Обратитесь к разработчикам приложений, чтобы настроить приложение для повышения производительности сети с помощью рекомендаций, упомянутых в статье "Проектирование эффективных приложений". После реализации рекомендаций убедитесь, что вы увидите меньше нехватки портов SNAT.
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.