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


Устранение неполадок с исчерпанием портов SNAT на узлах Служба Azure Kubernetes

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

Примечание.

  • Чтобы устранить неполадки с исчерпанием портов SNAT на узлах AKS в кластере AKS с заданиями Kubernetes, выполните следующие действия, только если задания активно выполняются на узлах AKS.
  • Дополнительные сведения о портах SNAT и их выделении на каждую виртуальную машину см. в статье о портах SNAT.

Шаг 1. Найдите узел, который испытывает исчерпание портов SNAT

  1. Получите IP-адрес узла AKS, который испытывает активный исчерпание портов SNAT из портал Azure.

    Для этого перейдите к кластеру AKS в портал Azure и выберите "Диагностика и устранение проблем>с подключением SNAT>" и "Выделение портов". На вкладке "Подключение SNAT" и "Выделение портов" отображается частный IP-адрес узла AKS, который испытывает исчерпание портов SNAT.

    Снимок экрана: панель

    Снимок экрана: панель

  2. Подключитесь к кластеру 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.
  1. На узле 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
    
  2. Используйте 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
    
  3. Запишите предыдущие выходные данные команды в файл журнала, а затем сортируйте выходные данные, чтобы просмотреть список высоких подключений:

    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
    
  4. Сопоставляйте IP-адрес с наибольшим числом подключений из предыдущих выходных данных с pod. Если это не работает, можно продолжить.

  5. SADDR Запишите или NETNS значение с наибольшим числом подключений из предыдущих выходных данных, а затем выполните следующую команду lsns, чтобы сопоставить ее с PID. Lsns — это средство Linux, которое перечисляет пространства имен и сопоставляет пространства имен с ИДЕНТИФИКАТОРами в дереве процессов Linux.

    lsns -t net
    

    Ниже приведен пример выходных данных команды:

    NS         TYPE NPROCS PID   USER  COMMAND
    4026532785 net  3      19832 root  bash
    
  6. Сопоставьте предыдущий PID с контейнерным процессом с помощью pstree. Pstree — это средство Linux, которое перечисляет процессы в формате дерева для удобства чтения.

    pstree -aps 19832
    

    Ниже приведен пример выходных данных команды:

    systemd,1
      `-containerd-shim,20946 -namespace k8s.io -id 2xxxf...
    

    Обратите внимание на первые пять символов контейнера -id в выходных данных команды. Он будет использоваться на шаге 7.

  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.

  8. Получите все модули pod, выполняемые на узле, и используйте предыдущий идентификатор POD для сопоставления pod с высоким исходящим подключением из выходных данных команды:

    kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<nodename>
    

Шаг 3. Поиск всех исходящих сетевых подключений, сделанных приложением

  1. Выполните вход в модуль pod, который определяется как имеющие высокие исходящие подключения в шаге 2 с помощью одной из следующих команд:

    • kubectl exec -it <pod name> -n <namespace> /bin/bash
      
    • kubectl exec -it <pod name> -n <namespace> /bin/sh
      
  2. Установите средство командной строки 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
      
  3. После установки 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.