Настройка шлюза NAT для статического IP-адреса для исходящего трафика из группы контейнеров

Настройка группы контейнеров с внешним IP-адресом позволяет внешним клиентам использовать IP-адрес для доступа к контейнеру в группе. Например, браузер может получить доступ к веб-приложению, выполняющемуся в контейнере. Однако в настоящее время для исходящего трафика группа контейнеров использует другой IP-адрес. Этот IP-адрес исходящего трафика не предоставляется программным способом, что усложняет мониторинг группы контейнеров и настройку правил брандмауэра клиента.

В этой статье описаны действия по настройке группы контейнеров в виртуальной сети, интегрированной со шлюзом преобразования сетевых адресов (NAT). При конфигурации шлюза NAT для SNAT для диапазона адресов подсети, делегированный в Экземпляры контейнеров Azure (ACI), можно определить исходящий трафик из групп контейнеров. Исходящий трафик группы контейнеров будет использовать общедоступный IP-адрес шлюза NAT. Один шлюз NAT может использоваться несколькими группами контейнеров, развернутыми в подсети виртуальной сети, делегированной в службу ACI.

В этой статье Azure CLI используется для создания следующих ресурсов для этого сценария.

  • Группы контейнеров, развернутые в делегированной подсети виртуальной сети
  • Шлюз NAT, развернутый в сети со статическим общедоступным IP-адресом.

Затем необходимо проверить исходящий трафик из примеров групп контейнеров с помощью шлюза NAT.

Примечание.

Служба ACI рекомендует настроить интеграцию со шлюзом NAT для контейнерной рабочей нагрузки, имеющей статические исходящие, но не статические входящие требования. Для архитектуры ACI, поддерживающей как статический входящий, так и исходящий трафик, ознакомьтесь со следующим учебником: Использование Брандмауэра Azure для входящего и исходящего трафика.

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

Необходимые компоненты

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

Запуск Azure Cloud Shell

Azure Cloud Shell — это бесплатная интерактивная оболочка, с помощью которой можно выполнять действия, описанные в этой статье. Она включает предварительно установленные общие инструменты Azure и настроена для использования с вашей учетной записью.

Чтобы открыть Cloud Shell, просто выберите Попробовать в правом верхнем углу блока кода. Cloud Shell можно также запустить в отдельной вкладке браузера, перейдя на страницу https://shell.azure.com.

Когда откроется Cloud Shell, убедитесь, что для вашей среды выбран вариант Bash. В последующих сеансах в среде Bash будет использоваться Azure CLI. Нажмите кнопку Копировать, чтобы скопировать блоки кода. Вставьте код в Cloud Shell и нажмите клавишу ВВОД, чтобы выполнить его.

Вход в Azure

Проверка подлинности Cloud Shell автоматически производится с данными той учетной записи, с которой был осуществлен вход. Используйте следующий скрипт, чтобы войти с другой подпиской, указав вместо <Subscription ID> идентификатор нужной подписки Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

subscription="<subscriptionId>" # add subscription here

az account set -s $subscription # ...or use 'az login'

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

Примечание.

Скачать полный скрипт можно здесь.

Начало работы

В этом учебнике используется случайная переменная. Если вы используете существующую группу ресурсов, измените значение этой переменной соответствующим образом.

resourceGroup=resourceGroup$RANDOM

Группа ресурсов Azure. Если у вас еще нет группы ресурсов Azure, создайте ее с помощью команды az group create. Измените значение расположения соответствующим образом.

az group create --name $resourceGroup --location eastus

Развертывание ACI в виртуальной сети

В типичном случае у вас уже может быть виртуальная сеть Azure для развертывания группы контейнеров. В целях демонстрации следующие команды создают виртуальную сеть и подсеть при создании группы контейнеров. Подсеть делегирована службе "Экземпляры контейнеров Azure".

Группа контейнеров запускает небольшое веб-приложение из образа aci-helloworld. Как показано в других статьях документации, этот образ упаковывает небольшое веб-приложение, написанное на Node.js, которое обслуживает статическую HTML-страницу.

Создайте группу контейнеров с помощью команды az container create:

az container create \
  --name appcontainer \
  --resource-group $resourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

Примечание.

Измените значение --subnet address-prefix для пространства IP-адресов, которое требуется в подсети. Наименьшая поддерживаемая подсеть — /29, она предоставляет восемь IP-адресов. Некоторые > IP-адреса зарезервированы для использования в Azure, дополнительные сведения можно прочитать здесь.

Создание общедоступного IP-адреса

В следующих разделах описано, как развернуть шлюз NAT в Azure в виртуальной сети с помощью Azure CLI. Чтобы получить общее представление, ознакомьтесь с кратким руководством по созданию шлюза NAT c помощью Azure CLI.

Сначала используйте команду az network vnet public-ip create, чтобы создать общедоступный IP-адрес для шлюза NAT. Он будет использоваться для доступа к Интернету. Вы получите предупреждение о предстоящем критическом изменении, где IP-адреса SKU "Стандартный" будут учитывать зону доступности по умолчанию. Дополнительные сведения об использовании зон доступности и общедоступных IP-адресов можно получить здесь.

az network public-ip create \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --sku standard \
  --zone 1 \
  --allocation static

Сохраните общедоступный IP-адрес в переменной для использования на шаге проверки, позже в этом сценарии.

ngPublicIp="$(az network public-ip show \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --query ipAddress --output tsv)"

Развертывание шлюза NAT в виртуальной сети

Для создания шлюза NAT, использующего общедоступный IP-адрес, созданный на предыдущем этапе, используйте команду az network nat gateway create.

az network nat gateway create \
  --resource-group $resourceGroup \
  --name myNATgateway \
  --public-ip-addresses myPublicIP \
  --idle-timeout 10

Настройка NAT для исходной подсети

Мы настроим исходную подсеть aci-subnet, чтобы использовать конкретный ресурс шлюза NAT myNATgateway в команде az network vnet subnet update. Эта команда активирует NAT в указанной подсети.

az network vnet subnet update \
    --resource-group $resourceGroup  \
    --vnet-name aci-vnet \
    --name aci-subnet \
    --nat-gateway myNATgateway

Проверка исходящего из группы контейнеров трафика

Проверьте входящий доступ к appcontainer запущенной в виртуальной сети, перейдя по общедоступному IP-адресу брандмауэра. Ранее вы сохранили общедоступный IP-адрес в переменной $NG_PUBLIC_IP.

Разверните следующий образец контейнера в виртуальной сети. При запуске он отправляет единичный HTTP-запрос в http://checkip.dyndns.org, который отображает IP-адрес отправителя (IP-адрес выхода). Если правило приложения на брандмауэре настроено правильно, то будет возвращен общедоступный IP-адрес брандмауэра.

az container create \
  --resource-group $resourceGroup \
  --name testegress \
  --image mcr.microsoft.com/azuredocs/aci-tutorial-sidecar \
  --command-line "curl -s http://checkip.dyndns.org" \
  --restart-policy OnFailure \
  --vnet aci-vnet \
  --subnet aci-subnet

Просмотрите журналы контейнеров, чтобы убедиться, что IP-адрес совпадает с общедоступным IP-адресом, созданным на первом этапе работы с учебником.

az container logs \
  --resource-group $resourceGroup \
  --name testegress

Она выводит выходные данные следующего вида:

<html><head><title>Current IP Check</title></head><body>Current IP Address: 52.142.18.133</body></html>

Этот IP-адрес должен соответствовать общедоступному IP-адресу, созданному на первом этапе работы с учебником.

echo $ngPublicIp

Очистка ресурсов

Вы можете удалить ненужную группу ресурсов, масштабируемый набор и все связанные ресурсы с помощью команды az group delete, как показано ниже. При использовании параметра --no-wait управление возвращается в командную строку без ожидания завершения операции. Параметр --yes подтверждает, что вы хотите удалить ресурсы без дополнительного запроса.

az group delete --name $resourceGroup --yes --no-wait

Следующие шаги

В этой статье вы произвели настройку группы контейнеров в виртуальной сети за шлюзом NAT в Azure. С помощью этой конфигурации вы настроите один статический IP-адрес для исходящего трафика из групп контейнеров Экземпляров контейнеров Azure.

Сведения об устранении неполадок см. в статье Устранение неполадок с подключением при использовании NAT виртуальных сетей Azure.