組織通常會有嚴格的安全性和合規性需求,會規範來自叢集的連出 (輸出) 網路流量,以消除資料外流的風險。 根據預設,標準 SKU Azure Kubernetes Service (AKS) 叢集具有不受限制的輸出因特網存取。 此網路存取層級可讓您執行的節點和服務視需要存取外部資源。 如果您想要限制連出流量,則必須能夠存取有限數量的連接埠和位址,才能維持狀況良好的叢集維護工作。 AKS 叢集輸出網路和 FQDN 規則的概念檔 提供 AKS 叢集 及其選擇性附加元件和功能的必要端點清單。
限制叢集輸出流量的其中一個常見解決方案是使用 防火牆裝置 ,根據防火牆規則來限制流量。 當您的應用程式需要輸出存取權,但必須檢查及保護輸出要求時,防火牆即適用。 使用所需的連出規則和「FQDN」手動設定防火牆是很麻煩的流程,特別是如果您的需求只有建立隔離的 AKS 叢集,且與叢集的啟動載入沒有輸出相依性的話。
為了減少資料外洩的風險,網路隔離的叢集允許在沒有任何外部網路依賴性的情況下初始化 AKS 叢集,即使是要從 Microsoft Artifact Registry (MAR) 中擷取叢集元件或映像檔也是如此。 叢集作員可以針對想要啟用的每個案例,以累加方式設定允許的輸出流量。 本文將逐步引導您完成建立網路隔離叢集的步驟。
開始之前
- 閱讀此功能的概念概觀,其中會提供網路隔離叢集運作方式的說明。 此概觀文章也會:
- 說明用於叢集啟動載入之私人 Azure Container Registry (ACR) 資源的兩個選項 - AKS 管理的 ACR 或自備 ACR。
- 說明兩種私有叢集模式用於建立 API 伺服器的私有存取—— 基於私有連結 的或 API Server VNet 整合。
- 說明叢集出口控制的兩種輸出類型 -
none或block(預覽)。 - 描述 網路隔離叢集的目前限制。
注意
輸出類型 none 已正式推出。
輸出類型 block 處於預覽狀態。
重要事項
AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
- AKS 支援原則 (部分機器翻譯)
- Azure 支援常見問題集 (部分機器翻譯)
在 Azure Cloud Shell (部分機器翻譯) 中使用 Bash 環境。 如需詳細資訊,請參閱開始使用 Azure Cloud Shell。
若要在本機執行 CLI 參考命令,請安裝 (部分機器翻譯) Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱如何在 Docker 容器中執行 Azure CLI。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,以完成驗證流程。 如需其他登入選項,請參閱 使用 Azure CLI 向 Azure 進行驗證。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
執行 az version (部分機器翻譯) 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade (部分機器翻譯)。
- 本文需要 Azure CLI 2.73.0 或更新版本。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。
- 如果您使用輸出類型
aks-preview(預覽),您應該安裝 Azure CLI 擴充功能block版或更新版本。- 如果您還沒有
aks-preview延伸模組,請使用az extension add(部分機器翻譯) 命令加以安裝。az extension add --name aks-preview - 如果您已經有
aks-preview延伸模組,請使用az extension update(部分機器翻譯) 命令加以更新,以確定您有最新版本。az extension update --name aks-preview
- 如果您還沒有
- 使用 Kubernetes 1.30 版或更高版本的 AKS 叢集支持網路隔離叢集。
- 如果您選擇使用 [自備 (BYO) Azure Container Registry (ACR)] 選項,您必須確定 ACR 是進階 SKU 服務層級 (部分機器翻譯)。
- 如果你使用的是配置為 API Server VNet 整合的網路隔離叢集,請遵循使用 API Server VNet 整合與 Azure Kubernetes Service 中的前提條件與指引。
設定環境變數
請設定本文中使用的環境變數。 ACR 名稱必須全域唯一,且僅包含小寫字母數字。
RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
AKS_NAME="myAKSCluster"
VNET_NAME="myVNet"
AKS_SUBNET_NAME="aksSubnet"
ACR_SUBNET_NAME="acrSubnet"
APISERVER_SUBNET_NAME="apiServerSubnet"
REGISTRY_NAME="myregistry${RANDOM}"
CLUSTER_IDENTITY_NAME="clusterIdentity"
KUBELET_IDENTITY_NAME="kubeletIdentity"
az group create --name ${RESOURCE_GROUP} --location ${LOCATION}
- 一個有有效訂閱的 Azure 帳號。 如果您沒有帳戶,請在開始之前建立 免費帳戶 。
- 安裝並設定 Terraform。
- 已安裝 Azure CLI,並使用
az login登入,用於驗證部署並連線到叢集。 如果你還沒有 Azure CLI,請安裝它。 -
kubectl安裝以連接叢集。 如果您使用 Azure Cloud Shell,則kubectl已安裝。 要在本地安裝,請使用指令az aks install-cli。 -
jq已安裝,用於在驗證部署時剖析 Terraform 狀態。 Azure Cloud Shell 已經jq安裝好了。
使用 AKS 管理的 ACR 部署網路隔離叢集
在此選項中,AKS 會建立、管理及協調 ACR 資源。 您不需要指派任何權限或管理 ACR。 AKS 會管理網路隔離叢集中所使用的快取規則、私人連結和私人端點。
建立網路隔離叢集
建立網路隔離 AKS 叢集時,請選擇以下私有叢集模式之一:基於私有連結或 API Server VNet 整合。
根據您的網路隔離需求,設定工件來源和出站類型。
| 參數 | 公認值/效果 |
|---|---|
--bootstrap-artifact-source |
Direct它直接從 Microsoft Artifact Registry(MAR)拉取映像檔,且不具備網路隔離。
Cache 從私人 ACR 抓取影像,且是網路隔離的。 |
--outbound-type |
none 它不會為叢集設定出站連線,所以你可以自行設定。
block (預覽)封鎖所有外撥連線。 |
私人連結型
使用 az aks create 命令,搭配 --bootstrap-artifact-source、--enable-private-cluster 和 --outbound-type 參數,以建立私人連結型網路隔離叢集。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster
API Server VNet 整合
執行 az aks create 命令,使用 --bootstrap-artifact-source、--enable-private-cluster、--enable-apiserver-vnet-integration 和 --outbound-type 參數,建立配置了 API Server VNet 整合的網路隔離叢集。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration
將現有的 AKS 叢集更新為網路隔離類型
如果您想要在現有的 AKS 叢集上啟用網路隔離,而不是建立新的叢集,請使用 az aks update (部分機器翻譯) 命令。
若要在現有的 AKS 叢集上啟用網路隔離功能,請先執行下列命令來更新 bootstrap-artifact-source:
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache
接著你需要手動重新映像化所有現有的節點池:
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
注意
您必須確保輸出存在,直到第一次重新安裝映像完成為止。 若要檢查重新映像是否已完成,請執行:
NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done
等候並確定重新安裝映像完成,然後執行下列命令以更新 outbound-type:
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none
重要事項
將成品來源更新為快取後,請記住立即重新建立叢集節點集區的映像。 否則,此功能將不會對該叢集生效。
使用自備 ACR 部署網路隔離叢集
AKS 支援自備 (BYO) ACR。 若要支援 BYO ACR 案例,您必須先設定 ACR 私人端點和私人 DNS 區域,再建立 AKS 叢集。
下列步驟說明如何準備以下資源:
- AKS 和 ACR 的自訂虛擬網路和子網路。
- ACR、ACR 快取規則、私人端點和私人 DNS 區域。
- 自訂控制平面身分識別和 kubelet 身分識別。
步驟 1:建立虛擬網路和子網路
az network vnet create --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16
az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24
SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)
az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled
步驟 2:停用虛擬網路輸出連線能力(選擇性)
例如,將 AKS 子網路設為私有,將其預設出站存取設定為 false。
az network vnet subnet update --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${AKS_SUBNET_NAME} --default-outbound false
關於其他支援的方法與轉換考量,請參見 「停用虛擬網路外出連線」。
步驟 3:建立 ACR 並啟用工件快取
建立已停用公用網路存取的 ACR。
az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --query 'id' --output tsv)請使用以下指令建立 ACR 快取規則,允許使用者在新的 ACR 中快取 MAR 容器映像檔與二進位檔。 快取規則名稱與倉庫名稱必須遵循下一節的指引。
az acr cache create -n aks-managed-mcr -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "aks-managed-repository/*"
注意
透過 BYO ACR,您的責任是確保 ACR 快取規則如上所示正確地建立和維護。 此步驟對於叢集建立、運作和升級至關重要。 不應修改此快取規則。
步驟 4:建立 ACR 的私人端點
az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection
NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)
REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)
DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)
步驟 5:建立私人 DNS 區域並新增記錄
建立名為 privatelink.azurecr.io 的私人 DNS 區域。 新增登錄 REST 端點 {REGISTRY_NAME}.azurecr.io 和登錄資料端點 {REGISTRY_NAME}.{LOCATION}.data.azurecr.io 的記錄。
az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"
az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false
az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}
az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}
az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}
az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}
步驟 6:建立控制平面和 kubelet 的身分識別
控制平面身分識別
az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}
CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)
CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)
Kubelet 身分識別
az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}
KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)
KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)
如果您正在更新現有的 AKS 叢集,請略過前面的身分建立命令,並擷取現有的 kubelet 身分物件 ID:
KUBELET_IDENTITY_PRINCIPAL_ID=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --query identityProfile.kubeletidentity.objectId -o tsv)
將 ACR 提取權限授與 kubelet 身分識別
檢查登錄檔的角色指派權限模式,並選擇對應的拉取角色。 啟用 ABAC 的登錄使用 Container Registry Repository Reader 角色。 未啟用 ABAC 的登錄使用 AcrPull 角色。
ROLE_ASSIGNMENT_MODE=$(az acr show --name ${REGISTRY_NAME} --resource-group ${RESOURCE_GROUP} --query roleAssignmentMode -o tsv)
if [[ "${ROLE_ASSIGNMENT_MODE}" == "rbac-abac" ]]; then
ACR_PULL_ROLE="Container Registry Repository Reader"
else
ACR_PULL_ROLE="AcrPull"
fi
az role assignment create --role "${ACR_PULL_ROLE}" --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal
在設定這些資源之後,您可以繼續使用 BYO ACR 建立網路隔離 AKS 叢集。
步驟 7:使用 BYO ACR 建立網路隔離叢集
當你建立網路隔離叢集時,請選擇以下私有叢集模式之一:基於私有連結或 API Server VNet 整合。
根據您的網路隔離需求,設定工件來源和出站類型。
| 參數 | 公認值/效果 |
|---|---|
--bootstrap-artifact-source |
Direct它直接從 Microsoft Artifact Registry(MAR)拉取映像檔,且不具備網路隔離。
Cache 從私人 ACR 抓取影像,且是網路隔離的。 |
--outbound-type |
none 它不會為叢集設定出站連線,所以你可以自行設定。
block (預覽)封鎖所有外撥連線。 |
私人連結型
使用必要參數執行 az aks create (部分機器翻譯) 命令,以建立會存取 ACR 的私人連結型網路隔離叢集。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster
API Server VNet 整合
對於配置為 API Server VNet 整合的網路隔離叢集,首先建立子網路並以以下指令指派正確角色:
az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24 --delegations Microsoft.ContainerService/managedClusters
export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal
az role assignment create --scope ${SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal
建立一個私有網路隔離叢集,配置為 API Server VNet 整合,並透過執行 az aks create 指令並輸入所需參數存取你的 ACR。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}
更新現有的 AKS 叢集
如果您想要在現有的 AKS 叢集上啟用網路隔離,而不是建立新的叢集,請使用 az aks update (部分機器翻譯) 命令。
在建立 BYO ACR 的私人端點和私人 DNS 區域時,請使用現有 AKS 叢集的現有虛擬網路和子網路。 當您為 kubelet 身分識別指派適當的 ACR 提取角色時,請使用現有 AKS 叢集的現有 kubelet 身分識別。
若要在現有的 AKS 叢集上啟用網路隔離功能,請先執行下列命令來更新 bootstrap-artifact-source:
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID}
接著你需要手動重新映像化所有現有的節點池:
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
注意
您必須確保輸出存在,直到第一次重新安裝映像完成為止。 若要檢查重新映像是否已完成,請執行:
NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done
等候並確定重新安裝映像完成,然後執行下列命令以更新 outbound-type:
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none
重要事項
將成品來源更新為快取後,請記住立即重新建立叢集節點集區的映像。 否則,此功能將不會對該叢集生效。
更新 ACR 識別碼
你可以更新網路隔離叢集所使用的私有 ACR。 若要識別 ACR 資源識別碼,請使用 az aks show 命令。
az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}
使用 az aks update 和 --bootstrap-artifact-source 參數執行 --bootstrap-container-registry-resource-id 命令,即可執行更新 ACR 識別碼的作業。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <new-byo-acr-resource-id>
當您更新現有叢集上的 ACR 識別碼時,您必須以手動方式為所有現有的節點重新安裝映像。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要事項
在啟用網路隔離叢集功能之後,請記得為叢集的節點集區重新安裝映像。 否則,此功能將不會對該叢集生效。
用 Terraform 部署一個網路隔離叢集
注意
本文的範例程式碼存放於 Azure Terraform GitHub 倉庫中。 您可以查看 目前及先前版本 Terraform 的測試結果日誌。
本 Terraform 範例透過本文前述的 AKS 管理 ACR 選項部署網路隔離叢集。 AzureRM 提供者尚未公開本範例所使用的所有網路隔離啟動設定,因此範例使用 AzAPI 提供者來部署受管理叢集資源,針對所需的 API 版本。 目前尚未提供適用於自備(BYO)ACR 選項的 Terraform 範例。 要使用 BYO ACR,請遵循本文前述的 Azure CLI 指引。
範例部署了以下資源:
- 資源 群體 (
Microsoft.Resources/resourceGroups)。 -
已隔離網路的 AKS 叢集(
Microsoft.ContainerService/managedClusters),使用下列項目:- 系統指派的管理身份。
- 一個系統節點池,只有一個
Standard_D2s_v3節點,且自動擴展功能是關閉的。 -
azure網路外掛,將outboundType設為none,使叢集在啟動程序中不需依賴對外網路。 -
apiServerAccessProfile.enablePrivateCluster設為true,建立基於連結的私有叢集。 -
bootstrapProfile.artifactSource設為Cache,因此 AKS 自行建立、管理並協調自己的 ACR 快取以啟動叢集,而非直接從 Microsoft Artifact Registry(MAR)拉取。 如本文前述,你不需要自己建立或管理這個 ACR,AKS 會處理網路隔離叢集所使用的快取規則、私有連結和私有端點。
叢集依據部署區域支援的預設 Kubernetes 版本建立。 要固定特定版本,請在叢集區propertiesmain.tf塊中加入 kubernetesVersion ,並使用az aks get-versions指令確認該版本在該區域可用。
建立一個目錄來測試範例 Terraform 程式碼,並將其設為目前的目錄。
建立一個名為
main.tfStat 的檔案,並將以下測試過的範例設定複製到裡面。terraform { required_version = ">= 1.6.0" required_providers { azapi = { source = "Azure/azapi" version = "~> 2.0" } random = { source = "hashicorp/random" version = "~> 3.6" } } } provider "azapi" {} resource "random_string" "suffix" { length = 6 upper = false special = false } locals { location = "westus2" resource_group_name = "rg-aks-network-isolated-${random_string.suffix.result}" aks_name = "aks-netisolated-${random_string.suffix.result}" dns_prefix = "aksnetiso${random_string.suffix.result}" } resource "azapi_resource" "resource_group" { type = "Microsoft.Resources/resourceGroups@2024-03-01" name = local.resource_group_name location = local.location } resource "azapi_resource" "aks_cluster" { type = "Microsoft.ContainerService/managedClusters@2025-08-01" name = local.aks_name parent_id = azapi_resource.resource_group.id location = local.location identity { type = "SystemAssigned" } body = { properties = { dnsPrefix = local.dns_prefix agentPoolProfiles = [ { name = "systempool" count = 1 vmSize = "Standard_D2s_v3" mode = "System" osType = "Linux" type = "VirtualMachineScaleSets" enableAutoScaling = false } ] networkProfile = { networkPlugin = "azure" outboundType = "none" } apiServerAccessProfile = { enablePrivateCluster = true } bootstrapProfile = { artifactSource = "Cache" } } } }
初始化 Terraform
執行 terraform init 來初始化 Terraform 部署。 此指令會下載管理此範例中資源所需的 azapi 和 random 提供者。
terraform init -upgrade
格式化並驗證設定
執行 terraform fmt 以格式化設定檔,並 terraform validate 確認設定在語法上是否有效。
terraform fmt
terraform validate
建立 Terraform 執行計畫
執行 terraform plan 以建立執行計畫。
terraform plan -out main.tfplan
套用 Terraform 的執行計畫
執行terraform apply以套用執行計畫到你的 Azure 訂閱。
terraform apply main.tfplan
建立資源群組及私有且網路隔離的 AKS 叢集需花費數分鐘完成。
驗證部署
此範例未定義 Terraform 輸出值,因此請在 terraform apply 完成後使用 terraform show -json 搭配 jq,從資源狀態中擷取所產生的資源群組和叢集名稱。 你用 azapi 提供者管理這兩個資源,而它們 name 的屬性會保留已解決的資源名稱。
RESOURCE_GROUP=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.resource_group") | .values.name')
AKS_NAME=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.aks_cluster") | .values.name')
請使用 az aks show 指令確認叢集是否符合預期的網路隔離設定。
az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME --query "{outboundType:networkProfile.outboundType, artifactSource:bootstrapProfile.artifactSource, privateCluster:apiServerAccessProfile.enablePrivateCluster}"
輸出顯示 outboundType 設定為 none、privateCluster 設定為 artifactSource,以及 Cache 設定為 true,確認叢集處於網路隔離狀態,並從 AKS 管理的 ACR 快取執行初始啟動。
連線至叢集
因為這是私有叢集,請從有網路視距的用戶端連接到叢集的私有端點,例如同一或對等虛擬網路中的虛擬機,或是連接叢集虛擬網路的 Azure Cloud Shell。 用 az aks get-credentials 指令取得叢集憑證,然後再用指令 kubectl get nodes 驗證連線。
az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME
kubectl get nodes
清理資源
如果您不再需要本文中建立的資源,請移除以避免產生額外費用。
Warning
執行 terraform destroy 會移除 Terraform 狀態檔案中追蹤的所有資源,包括資源群組與 AKS 叢集。 在銷毀前仔細檢視計畫,避免與共用或生產環境基礎設施對照。
使用 -destroy 旗標執行 terraform plan,以查看 Terraform 會移除哪些內容。
terraform plan -destroy -out main.destroy.tfplan
執行 terraform apply 執行銷毀計畫並移除此樣本所產生的所有資源。
terraform apply main.destroy.tfplan
驗證 AKS 上已啟用網路隔離叢集
要驗證網路隔離叢集功能是否啟用,請使用指令 az aks show 。
az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}
以下輸出顯示一個設定為 none 出站類型的網路隔離叢集。 確認 是 outboundType 設定為 none 或 block,而 設定 artifactSource 為 Cache。
containerRegistryId 欄位識別用於啟動程序的 ACR。
{
"kubernetesVersion": "<major>.<minor>.<patch>",
"name": "myAKSCluster",
"type": "Microsoft.ContainerService/ManagedClusters",
"properties": {
"networkProfile": {
"outboundType": "none"
},
"bootstrapProfile": {
"artifactSource": "Cache",
"containerRegistryId": "/subscriptions/my-subscription-id/resourceGroups/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
}
}
}
在 AKS 上停用網路隔離叢集
使用 az aks update 和 --bootstrap-artifact-source 參數執行 --outbound-type 命令,即可停用網路隔離叢集功能。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer
當您在現有叢集上停用此功能時,您必須以手動方式為所有現有的節點重新安裝映像。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要事項
在停用網路隔離叢集功能之後,請記得為叢集的節點集區重新安裝映像。 否則,此功能將不會對該叢集生效。
故障排除
如果您遇到映像提取失敗之類的問題,請參閱針對網路隔離 Azure Kubernetes Service (AKS) 叢集的問題進行疑難排解 (部分機器翻譯)。
後續步驟
如果您想要設定使用 Azure 防火牆的輸出限制設定,請造訪在 AKS 中使用 Azure 防火牆控制連出流量 (部分機器翻譯)。
如果您想要限制 Pod 在本身與叢集內東-西流量限制之間的通訊方式,請參閱在 AKS 中使用網路原則來保護 Pod 之間的流量 (部分機器翻譯)。