在 Azure Kubernetes Service (AKS) 中設定 Azure CNI 網路,以便靜態配置 CIDR 區塊並增強子網路支援 - (預覽)
Azure CNI 動態 IP 配置的限制是 Pod 子網路的大小無法縮放超過 /16 子網路。 即使使用大型子網路,大型叢集仍可能會因為 Azure 位址對應的限制而有 65000 個 Pod 的限制。 Azure CNI 中新推出的靜態區塊配置功能,可藉由將 CIDR 區塊指派給節點而非個別 IP 來解決此問題。
它提供下列優點:
- 更好的 IP 可擴縮性:CIDR 區塊會以靜態方式配置給叢集節點,並存在於節點的存留期,而不是使用傳統 CNI 的傳統動態配置個別 IP。 這會根據 CIDR 區塊啟用路由,並協助將叢集限制從每個叢集的傳統 65K Pod 調整為最多 100 萬個 Pod。 您的 Azure 虛擬網路必須夠大,才能容納叢集的規模。
- 彈性:節點和 Pod 子網路均可獨立擴充。 您可以在叢集的多個節點集區或部署在相同 VNet 中的多個 AKS 叢集中共用單一 Pod 子網路。 此外,您也可以為節點集區設定個別的 Pod 子網路。
- 高效能:由於可為 Pod 指派虛擬網路 IP,因此,它們能夠直接連線至 VNet 中的其他叢集 Pod 和資源。
- 為 Pod 提供個別 VNet 原則:由於 Pod 具有個別的子網路,因此可為其設定不同於節點原則的個別 VNet 原則。 這可實現許多實用案例,例如,僅針對 Pod 而非節點允許網際網路連線、使用 Azure NAT 閘道修正節點集區中 Pod 的來源 IP,以及使用 NSG 篩選節點集區之間的流量。
- Kubernetes 網路原則:Cilium、Azure NPM 和 Calico 可使用這個新的解決方案。
本文說明如何在 AKS 中使用 Azure CNI 網路來靜態配置 CIDR 並增強子網路支援。
必要條件
注意
使用 CIDR 的靜態區塊配置時,不支援使用 Kubernetes Load Balancer Service 將應用程式公開為 Private Link 服務。
請檢閱在 AKS 中設定基本 Azure CNI 網路的必要條件 (部分機器翻譯),因為本文適用相同的必要條件。
請檢閱在 AKS 中設定基本 Azure CNI 網路的部署參數 ,因為相同參數同樣適用。
不支援 AKS 引擎和 DIY 叢集。
Azure CLI
2.37.0
版或更新版本,並具有延伸模組 aks-preview 2.0.0b2 版或更新版本如果您有現有的叢集,則必須啟用容器見解來監視 IP 子網路使用方式。 您可以使用
az aks enable-addons
命令來啟用容器見解,如下列範例所示:為您的訂用帳戶註冊訂用帳戶層級功能旗標:'Microsoft.ContainerService/AzureVnetScalePreview'
az aks enable-addons --addons monitoring --name <cluster-name> --resource-group <resource-group-name>
限制
以下是使用 Azure CNI 靜態區塊配置的一些限制:
- 要求的 Kubernetes 最低版本為 1.28
- 支援的子網路大小上限為 x.x.x.x/12 ~ 1 百萬個 IP
- 每個子網路只能使用單一作業模式。 如果子網路使用靜態區塊配置模式,則無法在具有相同子網路的不同叢集或節點集區中使用動態 IP 配置模式,反之亦然。
- 只有在新的叢集或將具有不同子網路的節點集區新增至現有叢集時才支援。 不支援移轉或更新現有的叢集或節點集區。
- 在指派給節點集區中節點的所有 CIDR 區塊中,將會選取一個 IP 作為節點的主要 IP。 因此,對於選取
--max-pods
值的網路管理員,請嘗試使用下列計算來為您的需求提供最佳服務,並在子網路中獲得最佳 IP 使用方式:
max_pods
=(N * 16) - 1
其中 N 是任何正整數和 N > 0
區域可用性
此功能不適用於下列區域:
- 美國南部
- 美國東部 2
- 美國西部
- 美國西部 2
規劃 IP 位址
您可以更有彈性且更加細微地規劃 IP 定址了。 由於節點和 Pod 能夠獨立擴充,因此亦可個別規劃其位址空間。 由於 Pod 子網路可設定為節點集區的細微性,因此,您一律可在新增節點集區時新增子網路。 叢集/節點集區中的系統 Pod 也會從 Pod 子網路接收 IP,因此必須將此行為納入考量。
在此案例中,系統會根據節點集區的 '--max-pod' 設定 (這會定義每個節點的 Pod 數目上限),將 /28 (16 個 IP) 的 CIDR 區塊配置給節點。 每個節點上會從該節點的所有可用 IP 保留 1 個 IP,以供內部使用。
因此,在判斷及規劃 IP 時,請務必定義 '--max-pods' 設定,其最佳的計算方式如下:max_pods_per_node = (16 * N) - 1
,其中 N 是大於 0 的任何正整數
沒有 IP 的理想值會要求最大 Pod 值符合上述運算式。
- 範例 1:max_pods = 30,每個節點配置的 CIDR 區塊 = 2,Pod 可用的 IP 總數 = (16 * 2) - 1 = 32 - 1 = 31,每個節點的 IP 浪費 = 31 - 30 = 1 [低浪費 - 可接受的情況]
- 範例 2:max_pods = 31,每個節點配置的 CIDR 區塊 = 2,Pod 可用的 IP 總數 = (16 * 2) - 1 = 32 - 1 = 31,每個節點的 IP 浪費 = 31 - 31 = 0 [理想的情況]
- 範例 3:max_pods = 32,每個節點配置的 CIDR 區塊 = 3,Pod 可用的 IP 總數 = (16 * 3) - 1 = 48 - 1 = 47,每個節點的 IP 浪費 = 47 - 32 = 15 [高浪費 - 不建議的情況]
Kubernetes 服務的 IP 規劃維持不變。
注意
請確定您的 VNet 具有足夠大且連續的位址空間,以支援叢集的規模。
部署參數
在 AKS 中設定基本 Azure CNI 網路的部署參數全都有效,但有兩個例外:
- 現在,vnet subnet id 參數是指與叢集節點相關的子網路。
- 會使用參數 pod subnet id 來指定其 IP 位址會靜態或動態分配給節點集區中 Pod 的子網路。
- pod ip allocation mode 參數會指定要使用動態個人配置還是靜態區塊配置。
開始之前
- 如果使用 Azure CLI,您需要
aks-preview
延伸模組。 請參閱安裝aks-preview
Azure CLI 延伸模組 (部分機器翻譯)。 - 如果使用 ARM 或 REST API,則 AKS API 版本必須是 2024-01-02 預覽版或更新版本。
安裝 aks-preview
Azure CLI 延伸模組
使用
az extension add
命令安裝aks-preview
延伸模組。az extension add --name aks-preview
使用
az extension update
(部分機器翻譯) 命令,更新為最新版的延伸模組。 延伸模組的版本應該為 2.0.0b2 或更新版本az extension update --name aks-preview
註冊 AzureVnetScalePreview
功能旗標
使用
az feature register
命令註冊AzureVnetScalePreview
功能旗標。az feature register --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
狀態需要幾分鐘的時間才會顯示「已註冊」。
使用
az feature show
命令確認註冊狀態。az feature show --namespace "Microsoft.ContainerService" --name "AzureVnetScalePreview"
當狀態顯示為「已註冊」時,請使用
az provider register
命令,重新整理 Microsoft.ContainerService 資源提供者的註冊。az provider register --namespace Microsoft.ContainerService
設定會靜態配置 CIDR 區塊並增強子網路支援的網路 - Azure CLI
在叢集中使用 CIDR 區塊靜態配置的方法,類似於為動態 IP 配置設定叢集 Azure CNI 的預設方法。 下列範例逐步說明如何建立含有節點子網路和 Pod 子網路的新虛擬網路,以及如何建立會使用具備 CIDR 區塊靜態配置之 Azure CNI 的叢集。 請務必將 $subscription
等變數取代為您的值。
建立具有兩個子網路的虛擬網路。
resourceGroup="myResourceGroup"
vnet="myVirtualNetwork"
location="myRegion"
# Create the resource group
az group create --name $resourceGroup --location $location
# Create our two subnet network
az network vnet create --resource-group $resourceGroup --location $location --name $vnet --address-prefixes 10.0.0.0/8 -o none
az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnet --name nodesubnet --address-prefixes 10.240.0.0/16 -o none
az network vnet subnet create --resource-group $resourceGroup --vnet-name $vnet --name podsubnet --address-prefixes 10.40.0.0/13 -o none
建立叢集並使用 --vnet-subnet-id
參考節點子網路、使用 --pod-subnet-id
參考 Pod 子網路、參考 --pod-ip-allocation-mode
,以定義 IP 配置模式,並啟用監視附加元件。
clusterName="myAKSCluster"
subscription="aaaaaaa-aaaaa-aaaaaa-aaaa"
az aks create \
--name $clusterName \
--resource-group $resourceGroup \
--location $location \
--max-pods 250 \
--node-count 2 \
--network-plugin azure \
--pod-ip-allocation-mode StaticBlock \
--vnet-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/nodesubnet \
--pod-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/podsubnet \
--enable-addons monitoring \
--generate-ssh-keys
新增節點集區
在新增節點集區時,請使用 --vnet-subnet-id
參考節點子網路、使用 --pod-subnet-id
參考 Pod 子網路,並使用 '--pod-ip-allocation-mode' 參考配置模式。 下列範例會建立兩個新的子網路,可在建立新的節點集區時加以參考:
az network vnet subnet create -g $resourceGroup --vnet-name $vnet --name node2subnet --address-prefixes 10.242.0.0/16 -o none
az network vnet subnet create -g $resourceGroup --vnet-name $vnet --name pod2subnet --address-prefixes 10.243.0.0/16 -o none
az aks nodepool add --cluster-name $clusterName -g $resourceGroup -n newnodepool \
--max-pods 250 \
--node-count 2 \
--vnet-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/node2subnet \
--pod-subnet-id /subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnet/subnets/pod2subnet \
--pod-ip-allocation-mode StaticBlock \
--no-wait
靜態配置 CIDR 區塊和增強子網路支援的常見問題
我可以將多個 Pod 子網路指派給叢集嗎?
您可以將多個子網路指派給叢集,但只能將一個子網路指派給每個節點集區。 相同/不同叢集的不同節點集區可以共用相同的子網路。
我可以同時從不同的 VNet 指派 Pod 子網路嗎?
不可以,Pod 子網路應該與叢集來自相同的 VNet。
可以讓叢集中的某些節點集區使用動態 IP 配置,並讓其他節點集區使用新的靜態區塊配置嗎?
可以,不同的節點集區可以使用不同的配置模式。 不過,子網路一旦用於某個配置模式,在與其相關聯的所有節點集區中就只能用於相同的配置模式了。
下一步
在下列文章中深入了解 AKS 的網路功能: