Share via


在 Azure Kubernetes Service (AKS) 中設定 Azure CNI 重疊網路

傳統 Azure 容器網路介面 (CNI) 將 VNet IP 位址指派給每個 Pod。 會從每個節點上預先保留的 IP 集合指派此 IP 位址, 為 Pod 保留的個別子網路。 這種方法需要規劃 IP 位址,而且可能會導致位址耗盡,隨著應用程式需求成長而變得難以調整叢集。

使用 Azure CNI 重疊,叢集節點會部署到 Azure 虛擬網路 (VNet) 子網。 Pod 會從私人 CIDR 以邏輯方式指派 IP 位址,與裝載節點的 VNet 不同。 叢集中的 Pod 和節點流量會使用重疊網路。 網路位址轉換 (NAT) 會使用節點的 IP 位址來連線至叢集外部的資源。 此解決方案可節省大量 VNet IP 位址,並可讓您將叢集調整為更大的大小。 額外的優點是,您可以在不同的 AKS 叢集中重複使用私人 CIDR,也就可以擴充 Azure Kubernetes Service (AKS) 中容器化應用程式的可用 IP 空間。

重疊網路概觀

在重疊網路中,只有 Kubernetes 叢集節點會獲指派來自子網路的 IP。 Pod 會接收建立叢集時所提供私人 CIDR 的 IP。 每個節點都會從相同的 CIDR 獲指派一個 /24 位址空間。 當您擴增叢集時所建立的額外節點會自動接收來自相同 CIDR 的 /24 位址空間。 Azure CNI 會將 IP 指派給來自此 /24 空間的 Pod。

個別的路由網域會在 Pod 私人 CIDR 空間的 Azure 網路堆疊中建立,而這會為 Pod 之間的直接通訊建立重疊網路。 省去在叢集子網上佈建自訂路由,或使用封裝方法來通道 Pod 之間的流量的需求,這可在與 VNet 中 VM 相等的 Pod 之間提供連線效能。 在 Pod 內執行的工作負載甚至不知道網路位址的操作。

此圖顯示兩個節點,其中三個 Pod 分別在重疊網路中執行。叢集外部端點的Pod流量會透過NAT路由傳送。

透過 NAT,使用節點 IP 以與叢集外部端點的通訊,例如內部部署和對等互連 VNet。 Azure CNI 會將流量的來源 IP (Pod 的重疊 IP) 轉譯為 VM 的主要 IP 位址,這可讓 Azure 網路堆疊將流量路由傳送至目的地。 叢集外部端點無法直接連線至 Pod。 您必須將 Pod 的應用程式發佈為 Kubernetes Load Balancer 服務,才能在 VNet 上與其連線。

您可以使用標準 SKU Load Balancer受控 NAT 閘道,為重疊 Pod 提供網際網路的輸出連線。 您也可以使用叢集子網路上的使用者定義路由,以將輸出流量導向至防火牆來控制輸出流量。

您可以使用輸入控制器 (例如 Nginx 或 HTTP 應用程式路由) 來設定叢集的輸入連線。 您無法使用 Azure 應用程式閘道來設定輸入連線。 如需詳細資訊,請參閱 Azure CNI 重疊的限制

Kubenet 與 Azure CNI 重疊之間的差異

如同 Azure CNI 重疊,Kubenet 會以邏輯方式將 IP 位址指派給與 VNet 不同的位址空間中的 Pod,但具有調整和其他限制。 下表提供 Kubenet 與 Azure CNI 重疊之間的詳細比較。 如果您不想因為 IP 不足而將 VNet IP 位址指派給 Pod,我們建議使用 Azure CNI 重疊。

區域 Azure CNI 重疊 Kubenet
叢集調整 5000 個節點和 250 個 Pod/節點 400 個節點和 250 個 Pod/節點
網路組態 簡單 - Pod 網路不需要額外的設定 複雜 - 需要叢集子網路上的路由表和 UDR,以用於 Pod 網路
Pod 連線效能 與 VNet 中 VM 相等的效能 額外的躍點會增加延遲
Kubernetes 網路原則 Azure 網路原則 Calico、Cilium Calico
支援的 OS 平台 Linux 和 Windows 伺服器 2022、2019 僅限 Linux

IP 位址規劃

  • 叢集節點:設定 AKS 叢集時,請確定您的 VNet 子網路有足夠的空間可供日後調整。 您可以將每個節點集區指派給專用子網路。 /24 子網路最多可以容納 251 個節點 ,因為前三個 IP 位址會保留供管理工作使用。
  • Pod:重疊解決方案會從您在叢集建立期間所指定的私人 CIDR,為每個節點上的 Pod 指派 /24 位址空間。 /24 大小固定,而且無法增加或減少。 您最多可以在節點上執行 250 個 Pod。 規劃 Pod 位址空間時,請確定私人 CIDR 夠大,足以為新節點提供 /24 位址空間,以支援未來的叢集擴充。
    • 規劃 Pod 的 IP 位址空間時,請考慮下列因素:
      • 相同的 Pod CIDR 空間可以在相同 VNet 的多個獨立 AKS 叢集上使用。
      • Pod CIDR 空間不得與叢集子網路範圍重疊。
      • Pod CIDR 空間不得與直接連線的網路重疊 (例如 VNet 同儕節點、ExpressRoute 或 VPN)。 如果外部流量在 podCIDR 範圍中有來源 IP,則需要透過 SNAT 轉譯為非重疊 IP,才能與叢集通訊。
  • Kubernetes 服務位址範圍:服務位址CIDR 的大小取決於您打算建立的叢集服務數目。 其必須小於 /12。 此範圍不應與 Pod CIDR 範圍、叢集子網路範圍以及對等互連 VNet 和內部部署網路中所使用的 IP 範圍重疊。
  • Kubernetes DNS 服務 IP 位址:這是叢集服務探索將使用之 Kubernetes 服務位址範圍內的 IP 位址。 請勿在位址範圍中使用第一個 IP 位址,因為此位址已用於 kubernetes.default.svc.cluster.local 位址。

網路安全性群組

Azure CNI 重疊的 Pod 到 Pod 流量不會封裝,而且會套用網路安全群組規則的子網路。 如果子網路 NSG 包含會影響 Pod CIDR 流量的拒絕規則,請確定下列規則已就緒,以確保適當的叢集功能 (除了所有 AKS 輸出需求):

  • 從節點 CIDR 到所有埠和通訊協議上節點 CIDR 的流量
  • 所有連接埠與通訊協定上從節點 CIDR 到 Pod CIDR 的流量 (服務流量路由所需)
  • 所有連接埠與通訊協定上從 Pod CIDR 到 Pod CIDR 的流量 (Pod 到 Pod 和 Pod 到流量路由所需,包括 DNS)

從 Pod 到 Pod CIDR 區塊外部任何目的地的流量會利用 SNAT,將來源 IP 設定為 Pod 執行所在節點的 IP。

如果您想要限制叢集中工作負載之間的流量,建議您使用 網路原則

每個節點的最大 Pod 數目

您可以在建立叢集時或新增節點集區時,設定每個節點的最大 Pod 數目。 Azure CNI 重疊的預設值為 250。 您可以在 Azure CNI 重疊中指定的最大值為 250,最小值為 10。 建立節點集區期間所設定的每個節點值 Pod 上限只會套用至該節點集區中的節點。

選擇要使用的網路模型

Azure CNI 為 Pod 提供兩個 IP 位址選項:將 VNet IP 指派給 Pod 的傳統設定,以及重疊網路。 選擇用於 AKS 群集的選項是靈活性和進階設定需求之間的平衡。 下列考量有助於概述每種網路模型最合適的時機。

在下列情況下使用重疊網路

  • 您想要調整為大量 Pod,但 VNet 中的 IP 位址空間有限。
  • 大部分的 Pod 通訊是在叢集內。
  • 您不需要虛擬節點這類進階 AKS 功能。

在下列情況下使用傳統 VNet 選項

  • 您有可用的 IP 位址空間。
  • 大部分的 Pod 通訊是在叢集外部的資源。
  • 叢集外部資源需要直接連線至 Pod。
  • 您需要虛擬節點這類 AKS 進階功能。

Azure CNI 重疊的限制

Azure CNI 重疊有下列限制:

  • 您無法使用應用程式閘道作為重疊叢集的輸入控制器 (AGIC)。
  • 虛擬機器可用性設定組 (VMAS) 不支援重疊。
  • 您無法在節點集區中使用 DCsv2 系列 虛擬機器。 若要符合機密運算需求,請考慮改用 DCasv5 或 DCadsv5 系列機密 VM
  • 如果您使用自己的子網來部署叢集,則包含 VNET 的子網、VNET 和資源群組名稱必須是 63 個字元或更少。 這是因為這些名稱將作為 AKS 背景工作節點中的標籤使用,因此會受限於 Kubernetes 標籤規則

設定重疊叢集

注意

您必須具有 CLI 版本 2.48.0 或更新版本以使用 --network-plugin-mode 引數。 針對 Windows,您必須安裝最新的 aks-preview Azure CLI 延伸模組,並遵循下列指示。

使用 az aks create 命令使用 Azure CNI 重疊建立叢集。 請確定使用引數 --network-plugin-mode 來指定重疊叢集。 如果未指定 Pod CIDR,則 AKS 會指派預設空間:viz. 10.244.0.0/16

clusterName="myOverlayCluster"
resourceGroup="myResourceGroup"
location="westcentralus"

az aks create -n $clusterName -g $resourceGroup \
  --location $location \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --pod-cidr 192.168.0.0/16

將新的 nodepool 新增至專用子網路

使用 Azure CNI 重疊建立叢集之後,您可以建立另一個節點集區,並將節點指派給相同 VNet 的新子網路。 如果您想要控制相同 VNET 或同儕節點 VNet 中目標輸出或輸出 IP,這個方法很實用。

clusterName="myOverlayCluster"
resourceGroup="myResourceGroup"
location="westcentralus"
nodepoolName="newpool1"
subscriptionId=$(az account show --query id -o tsv)
vnetName="yourVnetName"
subnetName="yourNewSubnetName"
subnetResourceId="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Network/virtualNetworks/$vnetName/subnets/$subnetName"
az aks nodepool add --resource-group $resourceGroup --cluster-name $clusterName \
  --name $nodepoolName --node-count 1 \
  --mode system --vnet-subnet-id $subnetResourceId

將現有叢集升級至 CNI 重疊

注意

如果叢集符合下列準則,您可以將現有 Azure CNI 叢集更新至重疊:

  • 叢集位於 Kubernetes 1.22+ 版本上。
  • 不使用動態 Pod IP 配置功能。
  • 未啟用網路原則。 您可以在升級前卸載網路原則引擎,請參閱 卸載 Azure 網路原則管理員或 Calico
  • 不使用任何 Windows 節點集區搭配 Docker 作為容器執行階段。

注意

由於 ARM 尚未支援路由網路,因此 ARM 型 (ARM64) 處理器節點尚不支援 CNI 重疊。

注意

將現有的叢集升級至 CNI 重疊是不可逆的程式。

警告

在 Windows OS 組建 20348.1668 之前,Windows 重疊 Pod 有一項限制,因為主機網路 Pod 的 SNATing 封包不正確,這對升級至重疊的叢集有更有害的影響。 若要避免此問題, 請使用大於或等於 20348.1668的 Windows OS 組建。

警告

如果使用自訂 azure-ip-masq-agent 組態來包含不應該從 Pod SNAT 封包的其他 IP 範圍,升級至 Azure CNI 重疊可能會中斷這些範圍的連線。 來自重疊空間的 Pod IP 將無法由叢集節點以外的任何項目連線。 此外,對於足夠舊的叢集,可能有舊版 azure-ip-masq-agent 留下的 ConfigMap。 如果這個名為 azure-ip-masq-agent-config的 ConfigMap 存在,且並非刻意保留,則在執行更新命令之前應該先將其刪除。 如果未使用自訂 ip-masq-agent 設定,則只有與 Azure ip-masq-agent ConfigMaps 相關的 azure-ip-masq-agent-config-reconciled ConfigMap 存在,而且升級程式期間會自動更新此設定。

升級程序會觸發每個節點集區同時重新映像。 不支援個別升級每個節點集區至重疊。 叢集網路的任何中斷都類似於節點映像升級或 Kubernetes 版本升級,其中節點集區中的每個節點都會重新映像。

Azure CNI 叢集升級

使用 az aks update 命令更新現有的 Azure CNI 叢集以使用重疊。

clusterName="myOverlayCluster"
resourceGroup="myResourceGroup"
location="westcentralus"

az aks update --name $clusterName \
--resource-group $resourceGroup \
--network-plugin-mode overlay \
--pod-cidr 192.168.0.0/16

從舊版 CNI 升級時需要 --pod-cidr 參數,因為 Pod 必須從新的重疊空間取得 IP,這不會與現有的節點子網路重疊。 Pod CIDR 也無法與節點集區的任何 VNet 位址重疊。 例如,如果您的 VNet 位址為 10.0.0.0/8,且您的節點位於子網路中 10.240.0 .0/16,則 --pod-cidr 無法與叢集上 10.0.0.0/8 或現有服務 CIDR 重疊。

Kubenet 叢集升級

使用 az aks update 命令更新現有的 Kubenet 叢集以使用 Azure CNI 重疊。

clusterName="myOverlayCluster"
resourceGroup="myResourceGroup"
location="westcentralus"

az aks update --name $clusterName \
--resource-group $resourceGroup \
--network-plugin azure \
--network-plugin-mode overlay 

由於叢集已經針對未與 VNet IP 空間重疊的 Pod 使用私人 CIDR,因此您不需要指定 --pod-cidr 參數,而 Pod CIDR 會維持不變。

注意

從 Kubenet 升級至 CNI 重疊時,Pod 路由將不再需要路由表。 如果叢集使用客戶提供的路由表,則移轉作業期間會自動刪除用來將 Pod 流量導向正確節點的路由。 如果叢集使用受控路由表 (路由表由 AKS 建立,且位於節點資源群組中),該路由表將會在移轉過程中刪除。

雙堆棧網路

您可以使用重疊網路和雙堆疊 Azure 虛擬網路,以雙堆疊模式部署 AKS 叢集。 在此設定中,節點會同時接收來自 Azure 虛擬網路子網路的 IPv4 和 IPv6 位址。 Pod 會從邏輯上不同的位址空間接收至節點的 Azure 虛擬網路子網路的 IPv4 和 IPv6 位址。 網路位址轉譯 (NAT) 接著會進行設定,使 Pod 可以連接 Azure 虛擬網路上的資源。 流量的來源 IP 位址是 NAT 到相同系列的節點主要 IP 位址 (IPv4 到 IPv4、IPv6 到 IPv6)。

必要條件

  • 您必須已安裝 Azure CLI 2.48.0 或更新版本。
  • Kubernetes 1.26.3 版或更新版本

限制

雙堆疊網路不支援下列功能:

  • Windows Nodepools
  • Azure 網路原則
  • Calico 網路原則
  • NAT 閘道
  • 虛擬節點附加元件

部署雙堆疊 AKS 叢集

提供下列屬性來支援雙重堆疊叢集:

  • --ip-families:採用以逗號分隔的 IP 系列清單,以便在叢集上啟用。
    • 僅支援 ipv4ipv4,ipv6
  • --pod-cidrs:採用以逗號分隔的 CIDR 標記法 IP 範圍清單,以指派 Pod IP 的來源。
    • 此清單中的範圍計數和順序必須符合提供給 --ip-families 的值。
    • 如果未提供任何值,則會使用 10.244.0.0/16,fd12:3456:789a::/64 的預設值。
  • --service-cidrs:採用以逗號分隔的 CIDR 標記法 IP 範圍清單,以指派服務 IP 的來源。
    • 此清單中的範圍計數和順序必須符合提供給 --ip-families 的值。
    • 如果未提供任何值,則會使用 10.0.0.0/16,fd12:3456:789a:1::/108 的預設值。
    • 指派給 --service-cidrs 的 IPv6 子網路不可大於 /108。

建立雙堆疊 AKS 叢集

  1. 使用 [az group create][az-group-create] 命令來建立叢集的資源群組。

    az group create --location <region> --name <resourceGroupName>
    
  2. 使用 az aks create 命令建立雙堆疊 AKS 叢集,並將 --ip-families 參數設定為 ipv4,ipv6

    az aks create --location <region> --resource-group <resourceGroupName> --name <clusterName> \
      --network-plugin azure \
      --network-plugin-mode overlay \
      --ip-families ipv4,ipv6
    

建立範例工作負載

建立叢集之後,您可以部署工作負載。 本文將逐步引導您完成 NGINX Web 伺服器的工作負載部署範例。

部署 NGINX 網頁伺服器

應用程式路由附加元件是 AKS 叢集中建議的輸入方式。 如需應用程式路由附加元件,以及如何使用附加元件部署應用程式的詳細資訊,請參閱使用應用程式路由附加元件的受控 NGINX 輸入 (部分機器翻譯)。

透過 LoadBalancer 類型服務公開工作負載

重要

AKS 中的 IPv6 服務目前有兩項限制

  • Azure Load Balancer 從連結本機位址將健全狀態探查傳送至 IPv6 目的地。 在 Azure Linux 節點集區中,此流量無法路由傳送至 Pod,因此流向以 externalTrafficPolicy: Cluster 部署的 IPv6 服務的流量會失敗。 必須使用 externalTrafficPolicy: Local 部署 IPv6 服務,這會導致 kube-proxy 回應節點上的探查。
  • Kubernetes 版本 1.27 之前的版本,只有服務的第一個 IP 位址會佈建至負載平衡器,因此雙重堆疊服務只會接收其中第一個列出的 IP 系列公用 IP。 若要為單一部署提供雙重堆疊服務,請建立兩個以相同選取器為目標的服務,一個用於 IPv4,另一個用於 IPv6。 這不再是 kubernetes 1.27 或更新版本中的限制。
  1. 使用 kubectl expose deployment nginx 命令公開 NGINX 部署。

    kubectl expose deployment nginx --name=nginx-ipv4 --port=80 --type=LoadBalancer'
    kubectl expose deployment nginx --name=nginx-ipv6 --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilies": ["IPv6"]}}'
    

    您會收到顯示服務已公開的輸出。

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. 一旦公開部署且 LoadBalancer 服務已完全佈建之後,使用 kubectl get services 命令會取得服務的 IP 位址。

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx-ipv4   LoadBalancer   10.0.88.78               20.46.24.24         80:30652/TCP   97s
    nginx-ipv6   LoadBalancer   fd12:3456:789a:1::981a   2603:1030:8:5::2d   80:32002/TCP   63s
    
  3. 透過支援 IPv6 主機的命令行 Web 要求來驗證功能。 Azure Cloud Shell 無法支援 IPv6。

    SERVICE_IP=$(kubectl get services nginx-ipv6 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    

下一步

若要瞭解如何使用 AKS 搭配您自己的容器網路介面 (CNI) 外掛程式,請參閱自備容器網路介面 (CNI) 外掛程式