為來自容器群組的輸出流量設定靜態 IP 位址的 NAT 閘道
設定使用對外 IP 位址的容器群組,可讓外部用戶端使用此 IP 位址來存取群組中的容器。 例如,瀏覽器可以存取在容器中執行的 Web 應用程式。 不過,目前容器群組會對輸出流量使用不同的 IP 位址。 此輸出 IP 位址不會以程式設計方式公開,這會讓容器群組監視和用戶端防火牆規則設定更為複雜。
本文提供在與網路位址轉譯 (NAT) 閘道整合的虛擬網路中設定容器群組的步驟。 將 NAT 閘道設定為 SNAT (委派給 Azure 容器執行個體 (ACI) 的子網路位址範圍),您即可識別來自容器群組的輸出流量。 容器群組輸出流量會使用 NAT 閘道的公用 IP 位址。 部署在虛擬網路子網路中的多個容器群組可以使用單一 NAT 閘道。
在本文中,您會使用 Azure CLI 為此案例建立資源:
- 部署在虛擬網路的委派子網路上的容器群組
- 部署在網路中具有靜態公用 IP 位址的 NAT 閘道
然後,您可以透過 NAT 閘道驗證來自範例容器群組的輸出。
注意
若容器化工作負載有靜態輸出需求,但沒有靜態輸入需求,ACI 服務建議應整合 NAT 閘道。 如需支援靜態輸入和輸出的 ACI 架構,請參閱下列教學課程:使用 Azure 防火牆進行輸入和輸出。
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
必要條件
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 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 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 位址。 閘道會使用此公用 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 連線進行疑難排解。