為來自容器群組的輸出流量設定靜態 IP 位址的 NAT 閘道

設定使用對外 IP 位址的容器群組,可讓外部用戶端使用此 IP 位址來存取群組中的容器。 例如,瀏覽器可以存取在容器中執行的 Web 應用程式。 不過,目前容器群組會對輸出流量使用不同的 IP 位址。 此輸出 IP 位址不會以程式設計方式公開,這會讓容器群組監視和用戶端防火牆規則設定更為複雜。

本文提供在與網路位址轉譯 (NAT) 閘道整合的虛擬網路中設定容器群組的步驟。 將 NAT 閘道設定為 SNAT (委派給 Azure 容器執行個體 (ACI) 的子網路位址範圍),您即可識別來自容器群組的輸出流量。 容器群組輸出流量會使用 NAT 閘道的公用 IP 位址。 部署在虛擬網路的子網路中並委派給 ACI 的多個容器群組可以使用單一 NAT 閘道。

在本文中,您會使用 Azure CLI 為此案例建立資源:

  • 部署在虛擬網路的委派子網路上的容器群組
  • 部署在網路中具有靜態公用 IP 位址的 NAT 閘道

然後,您可以透過 NAT 閘道驗證來自範例容器群組的輸出。

注意

若容器化工作負載有靜態輸出需求,但沒有靜態輸入需求,ACI 服務建議應整合 NAT 閘道。 如需支援靜態輸入和輸出的 ACI 架構,請參閱下列教學課程:使用 Azure 防火牆進行輸入和輸出

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

啟動 Azure Cloud Shell

Azure Cloud Shell 是免費的互動式 Shell,可讓您用來執行本文中的步驟。 它具有預先安裝和設定的共用 Azure 工具,可與您的帳戶搭配使用。

若要開啟 Cloud Shell,只要選取程式碼區塊右上角的 [試試看] 即可。 您也可以移至 https://shell.azure.com ,從另一個瀏覽器索引標籤啟動 Cloud Shell。

當開啟 Cloud Shell 時,請確認已為您的環境選取 Bash。 後續的工作階段將會在 Bash 環境中使用 Azure CLI,請選取 [複製] 以複製程式碼區塊,並將其貼到 Cloud Shell 中,然後按 Enter 鍵加以執行。

登入 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 映像執行小型 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 位址。 這會用於存取網際網路。 您將會收到即將推出的重大變更警告,其中標準 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 服務

我們將設定來源子網路 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

測試來自容器群組的輸出

瀏覽至防火牆的公用 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 連線進行疑難排解