Проблемы с подключением к туннелю

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

Схема управляемого Azure AKS, управляемого клиентом виртуальной сети и подсети Azure, а также туннеля из API в модуль pod туннеля.

Примечание.

По умолчанию и в зависимости от региона компонент туннеля был tunnel-front. При обновлении до соглашения об уровне обслуживания (SLA) функция была заменена компонентом aks-link туннеля, tunnel-front который использовал OpenVPN. AKS переходит в Konnectivity. Это компонент Kubernetes вышестоящий, который заменяет и tunnel-frontaks-link. Дополнительные сведения о миграции в Konnectivity в качестве компонента туннеля см. в заметках о выпуске AKS и журнале изменений.

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

Симптомы

Появляется сообщение об ошибке, похожее на приведенные ниже примеры о порте 10250:

Ошибка с сервера: get "https://< aks-node-name>:10250/containerLogs/<namespace>/<pod-name>/<container-name>": dial tcp <aks-node-ip>:10250: i/o timeout

Ошибка с сервера: ошибка набора серверной части: dial tcp <aks-node-ip>:10250: i/o timeout

Сервер API Kubernetes использует порт 10250 для подключения к kubelet узла для получения журналов. Если порт 10250 заблокирован, журналы kubectl и другие функции будут работать только для модулей pod, работающих на узлах, на которых запланирован компонент туннеля. Дополнительные сведения см. в статье Порты и протоколы Kubernetes: рабочие узлы.

Так как не удается установить компоненты туннеля или подключение между сервером и клиентом, следующие функции не будут работать должным образом:

  • Веб-перехватчики контроллера допуска

  • Возможность извлечения журнала (с помощью команды kubectl logs )

  • Выполнение команды в контейнере или получение в контейнер (с помощью команды kubectl exec )

  • Переадресация одного или нескольких локальных портов pod (с помощью команды kubectl port-forward )

Причина 1. Группа безопасности сети (NSG) блокирует порт 10250

Примечание.

Эта причина применима к любым компонентам туннеля, которые могут быть в кластере AKS.

Вы можете использовать группу безопасности сети Azure (NSG) для фильтрации сетевого трафика к ресурсам Azure и из нее в виртуальной сети Azure. Группа безопасности сети содержит правила безопасности, которые разрешают или запрещают входящий и исходящий сетевой трафик между несколькими типами ресурсов Azure. Для каждого правила можно указать источник и назначение, порт и протокол. Дополнительные сведения см. в разделе Фильтрация сетевого трафика группами безопасности сети.

Если группа безопасности сети блокирует порт 10250 на уровне виртуальной сети, функции туннелирования (например, журналы и выполнение кода) будут работать только для модулей pod, запланированных на узлах, где запланированы модули pod туннеля. Другие модули pod не будут работать, так как их узлы не смогут добраться до туннеля, а туннель запланирован на других узлах. Чтобы проверить это состояние, можно проверить подключение с помощью команд netcat (nc) или telnet. Вы можете выполнить команду az vmss run-command invoke , чтобы провести тест подключения и проверить, успешно ли оно выполнено, истекло ли время ожидания или возникла какая-либо другая проблема:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "nc -v -w 2 <ip-of-node-that-schedules-the-tunnel-component> 10250" \
    --output tsv \
    --query 'value[0].message'

Решение 1. Добавление правила NSG для разрешения доступа к порту 10250

Если вы используете группу безопасности сети и у вас есть определенные ограничения, убедитесь, что вы добавили правило безопасности, которое разрешает трафик для порта 10250 на уровне виртуальной сети. На следующем портал Azure изображен пример правила безопасности:

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

Если вы хотите быть более строгими, вы можете разрешить доступ к порту 10250 только на уровне подсети.

Примечание.

  • Поле Приоритет должно быть скорректировано соответствующим образом. Например, если у вас есть правило, запрещающее несколько портов (включая порт 10250), то правило, которое отображается на изображении, должно иметь более низкий приоритет (более низкие числа имеют более высокий приоритет). Дополнительные сведения о приоритете см. в разделе Правила безопасности.

  • Если после применения этого решения вы не видите никаких изменений в поведении, можно повторно создать модули pod компонента туннеля. Удаление этих модулей pod приводит к их повторному созданию.

Причина 2. Средство несложного брандмауэра (UFW) блокирует порт 10250

Примечание.

Эта причина относится к любому компоненту туннеля, который имеется в кластере AKS.

Несложный брандмауэр (UFW) — это программа командной строки для управления брандмауэром netfilter . Узлы AKS используют Ubuntu. Поэтому UFW устанавливается на узлах AKS по умолчанию, но UFW отключен.

По умолчанию, если UFW включен, он блокирует доступ ко всем портам, включая порт 10250. В этом случае маловероятно, что вы сможете использовать Secure Shell (SSH) для подключения к узлам кластера AKS для устранения неполадок. Это связано с тем, что UFW также может блокировать порт 22. Для устранения неполадок можно выполнить команду az vmss run-command invoke , чтобы вызвать команду ufw , которая проверяет, включена ли UFW:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "ufw status" \
    --output tsv \
    --query 'value[0].message'

Что делать, если в результатах указано, что UFW включен и не разрешает порт 10250? В этом случае функции туннелирования (такие как журналы и выполнение кода) не будут работать для модулей pod, запланированных на узлах с включенным UFW. Чтобы устранить проблему, примените одно из следующих решений в UFW.

Важно!

Прежде чем использовать это средство для внесения изменений, ознакомьтесь с политикой поддержки AKS (особенно обслуживание и доступ к узлам), чтобы предотвратить вход кластера в неподдерживаемый сценарий.

Примечание.

Если после применения решения вы не видите никаких изменений в поведении, можно повторно создать модули pod компонента туннеля. Удаление этих модулей pod приведет к их повторному созданию.

Решение 2a. Отключение несложного брандмауэра

Выполните следующую az vmss run-command invoke команду, чтобы отключить UFW:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "ufw disable" \
    --output tsv \
    --query 'value[0].message'

Решение 2b. Настройка несложного брандмауэра для разрешения доступа к порту 10250

Чтобы принудительно разрешить UFW доступ к порту 10250, выполните следующую az vmss run-command invoke команду:

az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
    --name <virtual-machine-scale-set-name> \
    --command-id RunShellScript \
    --instance-id <instance-id> \
    --scripts "ufw allow 10250" \
    --output tsv \
    --query 'value[0].message'

Причина 3. Средство iptables блокирует порт 10250

Примечание.

Эта причина относится к любому компоненту туннеля, который имеется в кластере AKS.

Средство iptables позволяет системным администраторам настраивать правила фильтрации IP-пакетов брандмауэра Linux. Вы можете настроить iptables правила, чтобы заблокировать обмен данными через порт 10250.

Вы можете просмотреть правила для узлов, чтобы проверка, блокируется ли порт 10250 или удаляются связанные пакеты. Для этого выполните следующую iptables команду:

iptables --list --line-numbers

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

  • num (номер правила)
  • target
  • prot (протокол)
  • opt
  • source
  • destination

Содержит ли цепочка INPUT правило, в котором целевой объект — DROP, протокол — tcp, а назначение — tcp dpt:10250? Если это так, iptables блокирует доступ к порту назначения 10250.

Решение 3. Удаление правила iptables, которое блокирует доступ через порт 10250

Выполните одну из следующих команд, чтобы удалить iptables правило, которое запрещает доступ к порту 10250:

iptables --delete INPUT --jump DROP --protocol tcp --source <ip-number> --destination-port 10250
iptables --delete INPUT <input-rule-number>

Для решения конкретного или потенциального сценария рекомендуется проверка инструкции iptables вручную, выполнив iptables --help команду .

Важно!

Прежде чем использовать это средство для внесения изменений, ознакомьтесь с политикой поддержки AKS (особенно обслуживание и доступ к узлам), чтобы предотвратить вход кластера в неподдерживаемый сценарий.

Причина 4: не открыт исходящий порт 1194 или 9000

Примечание.

Эта причина относится только к модулям tunnel-front и aks-link pod.

Существуют ли ограничения исходящего трафика, например из брандмауэра AKS? Если они есть, порт 9000 требуется, чтобы обеспечить правильную функциональность tunnel-front pod. Аналогичным образом для aks-link модуля pod требуется порт 1194.

Konnectivity использует порт 443. По умолчанию этот порт открыт. Поэтому вам не нужно беспокоиться о проблемах с подключением на этом порту.

Решение 4. Откройте порт 1194 или 9000

Убедитесь, что виртуальная (модуль) разрешает доступ к порту 1194 или порту 9000. Дополнительные сведения о необходимых правилах и зависимостях см. в статье Глобальные обязательные сетевые правила Azure.

Причина 5. Исчерпание портов преобразования сетевых адресов источника (SNAT)

Примечание.

Эта причина относится к любому компоненту туннеля, который имеется в кластере AKS. Однако он не применяется к частным кластерам AKS. Нехватка портов преобразования сетевых адресов источника (SNAT) может произойти только для общедоступного обмена данными. Для частных кластеров AKS сервер API находится в виртуальной сети или подсети AKS.

Если происходит исчерпание портов SNAT (сбой портов SNAT), узлы не смогут подключиться к серверу API. Контейнер туннеля находится на стороне сервера API. Поэтому подключение к туннелю не будет установлено.

Если ресурсы портов SNAT исчерпаны, исходящие потоки завершаются ошибкой, пока существующие потоки не отпустят некоторые порты SNAT. Azure Load Balancer возвращает порты SNAT при закрытии потока. Он использует четырехминутное время ожидания простоя, чтобы освободить порты SNAT от неактивных потоков.

Порты SNAT можно просмотреть из метрик подсистемы балансировки нагрузки AKS или диагностика службы, как описано в следующих разделах. Дополнительные сведения о просмотре портов SNAT см. в статье Разделы справки проверка статистику исходящих подключений?.

Метрики подсистемы балансировки нагрузки AKS

Чтобы использовать метрики подсистемы балансировки нагрузки AKS для просмотра портов SNAT, выполните следующие действия.

  1. В портал Azure найдите и выберите Службы Kubernetes.

  2. В списке служб Kubernetes выберите имя кластера.

  3. В области меню кластера найдите заголовок Параметры , а затем выберите Свойства.

  4. Выберите имя, указанное в разделе Группа ресурсов инфраструктуры.

  5. Выберите подсистему балансировки нагрузки Kubernetes .

  6. В области меню подсистемы балансировки нагрузки найдите заголовок Мониторинг и выберите Метрики.

  7. Для типа метрики выберите SNAT Connection Count (Число подключений SNAT).

  8. Выберите Применить разделение.

  9. Задайте для параметра Разделение позначение Состояние подключения.

Диагностика службы

Чтобы использовать диагностика службы для просмотра портов SNAT, выполните следующие действия.

  1. В портал Azure найдите и выберите Службы Kubernetes.

  2. В списке служб Kubernetes выберите имя кластера.

  3. В области меню кластера выберите Диагностика и решение проблем.

  4. Выберите Проблемы с подключением.

  5. В разделе SNAT Connection and Port Allocation (Подключение SNAT и выделение портов) выберите Просмотреть сведения.

  6. При необходимости используйте кнопку Диапазон времени , чтобы настроить интервал времени.

Решение 5a. Убедитесь, что приложение использует пул подключений

Такое поведение может происходить из-за того, что приложение не использует существующие подключения повторно. Рекомендуется не создавать одно исходящее подключение для каждого запроса. Такая конфигурация может привести к исчерпанию подключения. Проверьте, соответствует ли код приложения рекомендациям и использует ли пул подключений. Большинство библиотек поддерживают пулы подключений. Таким образом, вам не нужно создавать новое исходящее подключение для каждого запроса.

Решение 5b. Настройка выделенных исходящих портов

Если в приложении все в порядке, вам придется настроить выделенные исходящие порты. Дополнительные сведения о выделении исходящих портов см. в разделе Настройка выделенных исходящих портов.

Решение 5c. Использование шлюза преобразования управляемых сетевых адресов (NAT) при создании кластера

Вы можете настроить новый кластер для использования шлюза преобразования управляемых сетевых адресов (NAT) для исходящих подключений. Дополнительные сведения см. в статье Создание кластера AKS с управляемым шлюзом NAT.

Заявление об отказе от ответственности за контактные данные сторонней организации

Корпорация Майкрософт предоставляет сторонние контактные данные, чтобы помочь вам найти дополнительные сведения по этой теме. Эти данные могут быть изменены без предварительного уведомления. Корпорация Майкрософт не гарантирует точность контактной информации сторонних поставщиков.

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

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