在 NAT 网关中为来自容器组的出站流量配置静态 IP 地址

使用面向外部的 IP 地址设置容器组可以让外部客户端使用该 IP 地址访问组中的容器。 例如,浏览器可以访问在容器中运行的 Web 应用。 但在目前,容器组将另一 IP 地址用于出站流量。 此出口 IP 地址不以编程方式公开,这使得容器组监视与客户端防火墙规则配置变得更加复杂。

本文提供在与网络地址转换 (NAT) 网关集成的虚拟网络中配置容器组的步骤。 通过将 NAT 网关配置为对委托给 Azure 容器实例 (ACI) 的子网地址范围进行 SNAT 处理,可以识别来自容器组的出站流量。 容器组出口流量将使用 NAT 网关的公共 IP 地址。 部署在虚拟网络子网中的多个容器组可以使用单个 NAT 网关。

本文使用 Azure CLI 为此方案创建资源:

  • 部署在虚拟网络的已委托子网中的容器组
  • 将一个使用静态公共 IP 地址的 NAT 网关部署在网络中

然后通过该 NAT 网关验证来自示例容器组的出口流量。

注意

对于具有静态出口要求但没有静态入口要求的容器化工作负载,ACI 服务建议与 NAT 网关集成。 对于同时支持静态入口和出口的 ACI 体系结构,请参阅以下教程:为入口和出口使用 Azure 防火墙

如果没有 Azure 试用版订阅,请在开始前创建 Azure 试用版订阅

先决条件

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

登录 Azure

使用以下脚本通过其他订阅登录,将 <Subscription ID> 替换为 Azure 订阅 ID。 如果没有 Azure 试用版订阅,请在开始前创建 Azure 试用版订阅

az cloud set -n AzureChinaCloud
az login

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 chinaeast2

在虚拟网络中部署 ACI

通常情况下,你可能已经有一个要在其中部署容器组的 Azure 虚拟网络。 出于演示目的,在创建容器组后使用以下命令创建虚拟网络和子网。 此子网委托给 Azure 容器实例。

容器组从 aci-helloworld 映像运行小型 Web 应用。 如本文档中的其他文章所述,此映像会打包一个以 Node.js 编写的、可提供静态 HTML 页面的小型 Web 应用。

使用 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

注意

针对子网中你所需的 IP 地址空间调整 --subnet address-prefix 的值。 支持的最小子网为 /29,此子网提供八个 IP 地址。 某些 >IP 地址保留给 Azure 使用,可在此处了解详细信息。

创建公共 IP 地址

在以下部分,请使用 Azure CLI 在虚拟网络中部署 Azure NAT 网关。 有关背景信息,请参阅快速入门:使用 Azure CLI 创建 NAT 网关

首先,使用 az network vnet public-ip create 为 NAT 网关创建公共 IP 地址。 网关使用此公共 IP 访问 Internet。 你将收到有关即将发生的中断性变更的警告,其中指出标准 SKU IP 地址默认将会感知可用性区域。 可在此处详细了解可用性区域和公共 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 网关部署到虚拟网络中

使用以下 az network nat gateway create 创建一个 NAT 网关,该网关使用在上一步骤中创建的公共 IP。

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

配置源子网的 NAT 服务

可以使用 az network vnet subnet update 将源子网 aci-subnet 配置为使用特定的 NAT 网关资源 myNATgateway。 此命令将激活指定子网中的 NAT 服务。

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

测试容器组的出口

通过浏览到防火墙的公共 IP 地址,测试对虚拟网络中运行的 appcontainer 的入站访问。 前面你已将公共 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

后续步骤

在本文中,你已在 Azure NAT 网关后面的虚拟网络中设置了容器组。 你使用此配置设置了来自 Azure 容器实例容器组的单个静态 IP 地址出口。

如需故障排除方面的帮助,请参阅排查 Azure 虚拟网络 NAT 连接问题