共用方式為


建立網络隔離的 Azure Kubernetes Service (AKS) 叢集 (預覽)

組織通常會有嚴格的安全性和合規性需求,以規範來自叢集的輸出(輸出)網路流量,以消除數據外流的風險。 根據預設,Azure Kubernetes Service (AKS) 叢集具有不受限制的輸出因特網存取。 此網路存取層級可讓您執行的節點和服務視需要存取外部資源。 如果您想要限制連出流量,則必須能夠存取有限數量的連接埠和位址,才能維持狀況良好的叢集維護工作。

保護輸出位址的其中一個解決方案是使用防火牆裝置,可根據功能變數名稱控制輸出流量。

另一個解決方案是網路隔離的 AKS 叢集 (預覽),可簡化現成叢集的輸出限制設定。 網路隔離的 AKS 叢集可降低叢集公用端點數據外洩或意外暴露的風險。

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

開始之前

  • 閱讀這項功能的概念概觀,其中提供網路隔離叢集運作方式的說明。 概觀文章也:
    • 說明兩種存取方法:AKS 管理的 ACR 或 BYO ACR,您可以在本文中選擇。
    • 描述 目前的限制
  • 本文需要 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 符合下列需求:

  • (選擇性)如果您想要使用任何需要輸出網路存取權的選用 AKS 功能或附加元件, 本檔 包含每項功能的輸出需求。 此外,此檔會列舉支援私人連結整合的功能或附加元件,以便從叢集虛擬網路內進行安全連線。 如果上述任何功能都無法使用私人連結整合,則可以使用使用者定義的路由表和 Azure 防火牆,根據該功能所需的網路規則和應用程式規則來設定叢集。

注意

網路隔離叢集尚不支援下列 AKS 叢集擴充功能:

使用 AKS 管理的 ACR 部署網路隔離叢集

AKS 會建立、管理及協調此選項中的 ACR 資源。 您不需要指派任何許可權或管理 ACR。 AKS 會管理網路隔離叢集中所使用的快取規則、私人連結和私人端點。

建立網路隔離叢集

建立網路隔離的 AKS 叢集時,您可以選擇下列其中一種私人叢集模式 - 私人連結或 API Server Vnet 整合。

不論您選取的模式為何,您都會設定 --bootstrap-artifact-source--outbound-type 參數。

--bootstrap-artifact-source 可以設定為 DirectCache 對應到分別使用直接 MCR (NOT 網路隔離) 和私人 ACR (網路隔離) 進行映像提取。

--outbound-type parameter可以設定為 noneblock。 如果輸出類型設定為 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 並啟用成品快取

  1. 建立具有私人連結和匿名提取存取權的 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)
    
  2. 建立 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 可以設定為 DirectCache 對應到分別使用直接 MCR (NOT 網路隔離) 和私人 ACR (網路隔離) 進行映像提取。

--outbound-type parameter可以設定為 noneblock。 如果輸出類型設定為 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-sourceaz 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 之間的流量。