建立網络隔離的 Azure Kubernetes Service (AKS) 叢集 (預覽)
組織通常會有嚴格的安全性和合規性需求,以規範來自叢集的輸出(輸出)網路流量,以消除數據外流的風險。 根據預設,Azure Kubernetes Service (AKS) 叢集具有不受限制的輸出因特網存取。 此網路存取層級可讓您執行的節點和服務視需要存取外部資源。 如果您想要限制連出流量,則必須能夠存取有限數量的連接埠和位址,才能維持狀況良好的叢集維護工作。
保護輸出位址的其中一個解決方案是使用防火牆裝置,可根據功能變數名稱控制輸出流量。
另一個解決方案是網路隔離的 AKS 叢集 (預覽),可簡化現成叢集的輸出限制設定。 網路隔離的 AKS 叢集可降低叢集公用端點數據外洩或意外暴露的風險。
重要
AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
開始之前
在 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 CLI 2.63.0 版或更新版本。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。
aks-preview
安裝 Azure CLI 擴充功能 9.0.0b2 版或更新版本。如果您還沒有
aks-preview
擴充功能,請使用az extension add
命令加以安裝。az extension add --name aks-preview
如果您已經有
aks-preview
擴充功能,請加以更新,以確定您有使用 命令的最新版本az extension update
。az extension update --name aks-preview
NetworkIsolatedClusterPreview
使用 az feature register 命令註冊功能旗標。az feature register --namespace Microsoft.ContainerService --name NetworkIsolatedClusterPreview
使用 az feature show 命令以驗證註冊狀態。 狀態需要幾分鐘的時間才會顯示「已註冊」:
az feature show --namespace Microsoft.ContainerService --name NetworkIsolatedClusterPreview
注意
如果您選擇建立網路隔離叢集,且 API Server VNet 整合已設定為 API Server 的私人存取,則必須重複上述步驟以註冊
EnableAPIServerVnetIntegrationPreview
功能旗標。 當狀態反映已註冊時,請使用 az provider register 命令重新整理 和Microsoft.ContainerRegistry
資源提供者的Microsoft.ContainerService
註冊:az provider register --namespace Microsoft.ContainerService az provider register --namespace Microsoft.ContainerRegistry
如果您選擇 [自備][BYO] Azure Container Registry (ACR) 選項,您必須確保 ACR 符合下列需求:
- 必須啟用 ACR 的匿名提取存取 。
- ACR 必須是 進階 SKU 服務層級
(選擇性)如果您想要使用任何需要輸出網路存取權的選用 AKS 功能或附加元件, 本檔 包含每項功能的輸出需求。 此外,此檔會列舉支援私人連結整合的功能或附加元件,以便從叢集虛擬網路內進行安全連線。 如果上述任何功能都無法使用私人連結整合,則可以使用使用者定義的路由表和 Azure 防火牆,根據該功能所需的網路規則和應用程式規則來設定叢集。
注意
網路隔離叢集尚不支援下列 AKS 叢集擴充功能:
使用 AKS 管理的 ACR 部署網路隔離叢集
AKS 會建立、管理及協調此選項中的 ACR 資源。 您不需要指派任何許可權或管理 ACR。 AKS 會管理網路隔離叢集中所使用的快取規則、私人連結和私人端點。
建立網路隔離叢集
建立網路隔離的 AKS 叢集時,您可以選擇下列其中一種私人叢集模式 - 私人連結或 API Server Vnet 整合。
不論您選取的模式為何,您都會設定 --bootstrap-artifact-source
和 --outbound-type
參數。
--bootstrap-artifact-source
可以設定為 Direct
或 Cache
對應到分別使用直接 MCR (NOT 網路隔離) 和私人 ACR (網路隔離) 進行映像提取。
--outbound-type parameter
可以設定為 none
或 block
。 如果輸出類型設定為 none
,則 AKS 不會設定叢集的任何輸出連線,讓使用者自行設定它們。 如果輸出類型設定為 [封鎖],則會封鎖所有輸出連線。
私人連結
使用 、 --enable-private-cluster
和 --outbound-type
參數執行 az aks create 命令--bootstrap-artifact-source
,以建立私人連結型網路隔離的 AKS 叢集。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster
API Server VNet 整合
使用 、 --enable-private-cluster
--enable-apiserver-vnet-integration
和 --outbound-type
參數執行 az aks create 命令--bootstrap-artifact-source
,建立以 API Server VNet 整合設定的網路隔離 AKS 叢集。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration
將現有的 AKS 叢集更新為網路隔離類型
如果您想要在現有的 AKS 叢集上啟用網路隔離,而不是建立新的叢集,請使用 az aks update 命令。
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none
啟用此功能之後,任何新增的節點都可以順利啟動,而不需要輸出。 當您在現有的叢集上啟用網路隔離時,請記住,您需要手動重新映像所有現有的節點。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要
請記得在啟用現有叢集的網路隔離模式之後,重新設定叢集的節點集區映像。 否則,此功能將不會對叢集生效。
使用自備 ACR 部署網路隔離叢集
AKS 支援自備 (BYO) ACR。 若要支援 BYO ACR 案例,您必須先設定 ACR 私人端點和私人 DNS 區域,才能建立 AKS 叢集。
下列步驟示範如何準備這些資源:
- AKS 和 ACR 的自定義虛擬網路和子網。
- ACR、ACR 快取規則、私人端點和私人 DNS 區域。
- 自定義控制平面身分識別和 kubelet 身分識別。
步驟 1:建立虛擬網路和子網
AKS 子網的預設輸出存取必須是 false。
az group create --name ${RESOURCE_GROUP} --location ${LOCATION}
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 --default-outbound-access false
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:建立 ACR 並啟用成品快取
建立具有私人連結和匿名提取存取權的 ACR。
az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false az acr update --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --anonymous-pull-enabled true REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --query 'id' --output tsv)
建立 ACR 快取規則,允許使用者在新 ACR 中快取 MCR 容器映像。
az acr cache create -n acr-cache-rule -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "*"
步驟 3:建立 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)
步驟 4:建立私人 DNS 區域並新增記錄
建立名為 privatelink.azurecr.io
的私人 DNS 區域。 新增登入 REST 端點 {REGISTRY_NAME}.azurecr.io
的記錄,以及登入資料端點 {REGISTRY_NAME}.{REGISTRY_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}
步驟 5:建立控制平面和 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)
授與 Kubelet 身分識別的 AcrPull 許可權
az role assignment create --role AcrPull --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal
設定這些資源之後,您可以繼續使用 BYO ACR 建立網路隔離的 AKS 叢集。
步驟 6:使用 BYO ACR 建立網路隔離叢集
建立網路隔離的 AKS 叢集時,您可以選擇下列其中一種私人叢集模式 - 私人連結或 API Server Vnet 整合。
不論您選取的模式為何,您都會設定 --bootstrap-artifact-source
和 --outbound-type
參數。
--bootstrap-artifact-source
可以設定為 Direct
或 Cache
對應到分別使用直接 MCR (NOT 網路隔離) 和私人 ACR (網路隔離) 進行映像提取。
--outbound-type parameter
可以設定為 none
或 block
。 如果輸出類型設定為 none
,則 AKS 不會設定叢集的任何輸出連線,讓使用者自行設定它們。 如果輸出類型設定為 [封鎖],則會封鎖所有輸出連線。
私人連結
使用必要的參數執行 az aks create 命令,以建立私人連結型網路隔離叢集,以存取您的 ACR。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --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 伺服器 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
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
使用 API Server VNet 整合設定的網路隔離 AKS 叢集,並使用必要的參數執行 az aks create 命令來存取您的 ACR。
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --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-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}
更新現有的 AKS 叢集
如果您想要在現有的 AKS 叢集上啟用網路隔離,而不是建立新的叢集,請使用 az aks update 命令。
建立 BYO ACR 的私人端點和私人 DNS 區域時,請使用現有 AKS 叢集的現有虛擬網路和子網。 當您將 AcrPull 許可權指派給 kubelet 身分識別時,請使用現有 AKS 叢集的現有 kubelet 身分識別。
若要在現有的 AKS 叢集上啟用網路隔離功能,請使用下列命令:
az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none
啟用網路隔離叢集功能之後,新新增節點集區中的節點可以順利啟動,而不需要輸出。 您必須重新映像現有的節點集區,以便新調整的節點可以順利啟動。 當您在現有叢集上啟用此功能時,您必須手動重新映像所有現有的節點。
az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only
重要
請記得在啟用網路隔離叢集功能之後,重新映像叢集的節點集區。 否則,此功能將不會對叢集生效。
更新您的 ACR 識別碼
可以更新與網路隔離 AKS 叢集搭配使用的私人 ACR。 若要識別 ACR 資源識別碼,請使用 az aks show
命令。
az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}
使用 和 --bootstrap-container-registry-resource-id
參數執行 az aks update
命令--bootstrap-artifact-source
,以執行 ACR 識別碼來更新 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
重要
請記得在啟用網路隔離叢集功能之後,重新映像叢集的節點集區。 否則,此功能將不會對叢集生效。
驗證已啟用網路隔離叢集
若要驗證已啟用網路隔離叢集功能,請使用 'az aks show 命令
az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}
下列輸出會根據 outboundType
屬性的值(無或已封鎖)和 artifactSource
屬性 (Cached) 來啟用此功能。
"kubernetesVersion": "1.30.3",
"name": "myAKSCluster"
"type": "Microsoft.ContainerService/ManagedClusters"
"properties": {
...
"networkProfile": {
...
"outboundType": "none",
...
},
...
"bootstrapProfile": {
"artifactSource": "Cache",
"containerRegistryId": "/subscriptions/my-subscription-id/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
},
...
}
停用網路隔離叢集
使用 和 --outbound-type
參數執行 命令--bootstrap-artifact-source
,az aks update
以停用網路隔離叢集功能。
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 防火牆 設定輸出限制組態,請造訪使用 AKS 中的 Azure 防火牆 控制輸出流量。
如果您想要限制 Pod 在叢集內自我通訊的方式與東西向流量限制,請參閱 在 AKS 中使用網路原則保護 Pod 之間的流量。