在 Azure Kubernetes Service (AKS) 中設定 Azure CNI 網路功能,以動態配置 IP 並增強子網路支援
傳統 CNI 的一個缺點是,隨著 AKS 叢集的成長,會耗盡 Pod IP 位址,導致必須在更大的子網路中重建您的整個叢集。 Azure CNI 中的新動態 IP 配置功能可從獨立於託管 AKS 叢集之子網路的子網路配置 Pod IP,進而解決此問題。
它提供下列優點:
- 更有效地利用 IP:IP 會從 Pod 子網路動態分配給叢集 Pod。 相較於傳統 CNI 解決方案,此方式可更有效地利用叢集中的 IP。
- 具備擴充能力與彈性:節點和 Pod 子網路均可獨立擴充。 您可以在叢集的多個節點集區或部署在相同 VNet 中的多個 AKS 叢集中共用單一 Pod 子網路。 此外,您也可以為節點集區設定個別的 Pod 子網路。
- 高效能:由於可為 Pod 指派虛擬網路 IP,因此,它們能夠直接連線至 VNet 中的其他叢集 Pod 和資源。 此解決方案可支援非常大量的叢集,且不會導致效能降低。
- 為 Pod 提供個別 VNet 原則:由於 Pod 具有個別的子網路,因此可為其設定不同於節點原則的個別 VNet 原則。 這可實現許多實用案例,例如,僅針對 Pod 而非節點允許網際網路連線、使用 Azure NAT 閘道修正節點集區中 Pod 的來源 IP,以及使用 NSG 篩選節點集區之間的流量。
- Kubernetes 網路原則:Azure 網路原則和 Calico 均可與這個新的解決方案搭配使用。
本文說明如何在 AKS 中使用 Azure CNI 網路,動態配置 IP 並增強子網路支援。
必要條件
請檢閱在 AKS 中設定基本 Azure CNI 網路的必要條件 (部分機器翻譯),因為本文適用相同的必要條件。
請檢閱在 AKS 中設定基本 Azure CNI 網路的部署參數 ,因為相同參數同樣適用。
不支援 AKS 引擎和 DIY 叢集。
Azure CLI
2.37.0
版或更新版本。如果您有現有的叢集,則必須啟用容器見解來監視 IP 子網路使用方式。 您可以使用
az aks enable-addons
命令來啟用容器見解,如下列範例所示:az aks enable-addons --addons monitoring --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME
規劃 IP 位址
使用此功能,規劃 IP 定址會更簡單。 由於節點和 Pod 能夠獨立擴充,因此亦可個別規劃其位址空間。 由於 Pod 子網路可設定為節點集區的細微性,因此,您一律可在新增節點集區時新增子網路。 叢集/節點集區中的系統 Pod 也會從 Pod 子網路接收 IP,因此必須將此行為納入考量。
IP 會以 16 個批次配置給節點。 Pod 子網路 IP 配置應規劃叢集中每個節點至少 16 個 IP;節點在啟動時要求 16 個 IP,而且每當其配置中未配置大於 8 個 IP 時,將會要求另一批 16 個 IP。
Kubernetes 服務與 Docker 橋接器的 IP 規劃維持不變。
若要檢視及驗證負責這些IP配置的 NodeNetworkConfiguration (NNC) 資源,您可以執行下列命令:
kubectl get nodenetworkconfigs -n kube-system -o wide
每個節點的最大 Pod 數目 (在具備動態 IP 配置和增強型子網路支援的叢集中)
使用 IP 動態配置的 Azure CNI 時,每個節點的 Pod 值會與傳統的 CNI 行為略有不同:
CNI | 預設 | 可在部署時設定 |
---|---|---|
傳統 Azure CNI | 30 | 是 (最多 250 個) |
具備動態 IP 配置的 Azure CNI | 250 | 是 (最多 250 個) |
與設定每個節點的最大 Pod 數目相關的所有其他指導均維持不變。
部署參數
在 AKS 中設定基本 Azure CNI 網路的部署參數全都有效,但有兩個例外:
- 現在 subnet 參數是指與叢集節點相關的子網路。
- 將使用其他參數 pod subnet 來指定 IP 位址將動態分配到 Pod 的子網路。
設定動態配置 IP 並增強子網路支援的網路 - Azure CLI
在叢集中使用動態 IP 配置和增強型子網路支援與設定叢集Azure CNI 的預設方法類似。 下列範例逐步說明如何建立含有節點子網路和 Pod 子網路的新虛擬網路,以及如何建立使用具備動態 IP 配置和增強型子網路支援之 Azure CNI 的叢集。 請務必將 $subscription
等變數取代為您自己的值。
建立具有兩個子網路的虛擬網路。
RESOURCE_GROUP_NAME="myResourceGroup"
VNET_NAME="myVirtualNetwork"
LOCATION="westcentralus"
SUBNET_NAME_1="nodesubnet"
SUBNET_NAME_2="podsubnet"
# Create the resource group
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
# Create our two subnet network
az network vnet create --resource-group $RESOURCE_GROUP_NAME --location $LOCATION --name $VNET_NAME --address-prefixes 10.0.0.0/8 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_1 --address-prefixes 10.240.0.0/16 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_2 --address-prefixes 10.241.0.0/16 -o none
建立叢集,使用 --vnet-subnet-id
參考節點子網路並使用 --pod-subnet-id
參考 Pod 子網路,並啟用監視附加元件。
CLUSTER_NAME="myAKSCluster"
SUBSCRIPTION="aaaaaaa-aaaaa-aaaaaa-aaaa"
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--location $LOCATION \
--max-pods 250 \
--node-count 2 \
--network-plugin azure \
--vnet-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_1 \
--pod-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_2 \
--enable-addons monitoring \
--generate-ssh-keys
新增節點集區
新增節點集區時,請參考使用 --vnet-subnet-id
的節點子網路和使用 --pod-subnet-id
的 Pod 子網路。 下列範例會建立兩個新的子網路,可在建立新的節點集區時加以參考:
SUBNET_NAME_3="node2subnet"
SUBNET_NAME_4="pod2subnet"
NODE_POOL_NAME="mynodepool"
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_3 --address-prefixes 10.242.0.0/16 -o none
az network vnet subnet create --resource-group $RESOURCE_GROUP_NAME --vnet-name $VNET_NAME --name $SUBNET_NAME_4 --address-prefixes 10.243.0.0/16 -o none
az aks nodepool add --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --name $NODE_POOL_NAME \
--max-pods 250 \
--node-count 2 \
--vnet-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_3 \
--pod-subnet-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_4 \
--no-wait
監視 IP 子網路使用狀況
Azure CNI 提供監視 IP 子網路使用狀況方式的功能。 若要啟用 IP 子網路使用狀況監視,請遵循下列步驟:
取得 YAML 檔案
從 GitHub 下載或 grep 名為 container-azm-ms-agentconfig.yaml 的檔案。
在整合中尋找
azure_subnet_ip_usage
。 將enabled
設定為true
。儲存檔案。
取得 AKS 認證
設定訂用帳戶、資源群組和叢集的變數。 請考慮下列範例:
az account set --subscription $SUBSCRIPTION
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME
套用設定
- 在下載 的 container-azm-ms-agentconfig.yaml 檔案儲存所在的資料夾中開啟終端機。
- 使用命令套
kubectl apply -f container-azm-ms-agentconfig.yaml
用組態。 這將重新啟動 Pod,並在 5-10 分鐘之後顯示計量。 - 流覽至叢集頁面上的 [Azure 入口網站] 中的 [活頁簿],並尋找名為 [子網 IP 使用量] 的活頁簿,以檢視叢集上的計量。
動態 IP 配置和增強型子網路支援的常見問題
我可以將多個 Pod 子網路指派給叢集/節點集區嗎?
您只能將一個子網路指派給叢集或節點集區。 不過,多個叢集或節點集區可共用單一子網路。
我可以同時從不同的 VNet 指派 Pod 子網路嗎?
不可以,Pod 子網路應該與叢集來自相同的 VNet。
叢集中的節點集區是否可以部分使用傳統 CNI,然後其他使用新的 CNI?
整個叢集只能使用一種 CNI。
下一步
在下列文章中深入了解 AKS 的網路功能: