分享方式:


在 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 檔案

  1. GitHub 下載或 grep 名為 container-azm-ms-agentconfig.yaml 的檔案。

  2. 在整合中尋找 azure_subnet_ip_usage。 將 enabled 設定為 true

  3. 儲存檔案。

取得 AKS 認證

設定訂用帳戶、資源群組和叢集的變數。 請考慮下列範例:

az account set --subscription $SUBSCRIPTION
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME

套用設定

  1. 在下載 的 container-azm-ms-agentconfig.yaml 檔案儲存所在的資料夾中開啟終端機。
  2. 使用命令套 kubectl apply -f container-azm-ms-agentconfig.yaml 用組態。 這將重新啟動 Pod,並在 5-10 分鐘之後顯示計量。
  3. 流覽至叢集頁面上的 [Azure 入口網站] 中的 [活頁簿],並尋找名為 [子網 IP 使用量] 的活頁簿,以檢視叢集上的計量。

動態 IP 配置和增強型子網路支援的常見問題

  • 我可以將多個 Pod 子網路指派給叢集/節點集區嗎?

    您只能將一個子網路指派給叢集或節點集區。 不過,多個叢集或節點集區可共用單一子網路。

  • 我可以同時從不同的 VNet 指派 Pod 子網路嗎?

    不可以,Pod 子網路應該與叢集來自相同的 VNet。

  • 叢集中的節點集區是否可以部分使用傳統 CNI,然後其他使用新的 CNI?

    整個叢集只能使用一種 CNI。

下一步

在下列文章中深入了解 AKS 的網路功能: