共用方式為


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

傳統 Azure 容器網路介面 (CNI) 將 VNet IP 位址指派給每個 Pod。 它會從每個節點上 預先保留的IP集或 為Pod保留的個別子網指派此IP位址。 這種方法需要規劃 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 \
    --name $clusterName \
    --resource-group $resourceGroup \
    --location $location \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --pod-cidr 192.168.0.0/16 \
    --generate-ssh-keys

將新的 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

雙堆疊網路

您可以使用重疊網路和雙堆疊 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 版或更新版本

限制

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

  • 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 \
        --generate-ssh-keys
    

建立範例工作負載

建立叢集之後,您可以部署工作負載。 本文將逐步引導您完成 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>
    

使用由 Cilium 提供的 Azure CNI 雙堆疊網路 - (預覽)

您可以使用由 Cilium 提供的 Azure CNI 來部署雙堆疊 AKS 叢集。 這也可讓您使用 Cilium 網路原則引擎來控制 IPv6 流量。

重要

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

必要條件

  • 您必須擁有最新版的 AKS 預覽延伸模組。
  • 您必須擁有 Kubernetes 1.29 版或更新版本。

安裝 aks-preview Azure CLI 延伸模組

  • 使用 az extension add 命令安裝 aks-preview 延伸模組。

    az extension add --name aks-preview
    
  • 使用 az extension update 命令,更新為已發行的最新版延伸模組。

    az extension update --name aks-preview
    

註冊 'AzureOverlayDualStackPreview' 功能旗標

  1. 使用 az feature register 命令註冊 AzureOverlayDualStackPreview 功能旗標。

    az feature register --namespace "Microsoft.ContainerService" --name "AzureOverlayDualStackPreview"
    

    狀態需要幾分鐘的時間才會顯示「已註冊」

  2. 使用 az feature show 命令確認註冊狀態:

    az feature show --namespace "Microsoft.ContainerService" --name "AzureOverlayDualStackPreview"
    
  3. 當狀態反映 [已註冊] 時,使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊。

    az provider register --namespace Microsoft.ContainerService
    

使用由 Cilium 支援的 Azure CNI 設定重疊叢集

使用 az aks create 命令使用 Azure CNI 重疊建立叢集。 請務必使用 自變數 --network-dataplane cilium 來指定 Cilium 數據平面。

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

az aks create \
    --name $clusterName \
    --resource-group $resourceGroup \
    --location $location \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --network-dataplane cilium \
    --ip-families ipv4,ipv6 \
    --generate-ssh-keys\

如需 Azure CNI Powered by Cilium 的詳細資訊,請參閱 Azure CNI Powered by Cilium

雙堆棧網路 Windows nodepools - (預覽)

您可以使用 Windows nodepools 部署雙堆棧 AKS 叢集。

重要

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

安裝 aks-preview Azure CLI 延伸模組

  • 使用 az extension add 命令安裝 aks-preview 延伸模組。

    az extension add --name aks-preview
    
  • 使用 az extension update 命令,更新為已發行的最新版延伸模組。

    az extension update --name aks-preview
    

註冊 'AzureOverlayDualStackPreview' 功能旗標

  1. 使用 az feature register 命令註冊 AzureOverlayDualStackPreview 功能旗標。

    az feature register --namespace "Microsoft.ContainerService" --name "AzureOverlayDualStackPreview"
    

    狀態需要幾分鐘的時間才會顯示「已註冊」

  2. 使用 az feature show 命令確認註冊狀態:

    az feature show --namespace "Microsoft.ContainerService" --name "AzureOverlayDualStackPreview"
    
  3. 當狀態反映 [已註冊] 時,使用 az provider register 命令重新整理 Microsoft.ContainerService 資源提供者的註冊。

    az provider register --namespace Microsoft.ContainerService
    

設定重疊叢集

使用 az aks create 命令使用 Azure CNI 重疊建立叢集。

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

az aks create \
    --name $clusterName \
    --resource-group $resourceGroup \
    --location $location \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --ip-families ipv4,ipv6 \
    --generate-ssh-keys\

將 Windows nodepool 新增至叢集

使用 [az aks nodepool add][az-aks-nodepool-add] 命令,將 Windows nodepool 新增至叢集。

az aks nodepool add \
    --resource-group $resourceGroup \
    --cluster-name $clusterName \
    --os-type Windows \
    --name winpool1 \
    --node-count 2

下一步

若要瞭解如何將現有的叢集升級至 Azure CNI 重疊,請參閱 升級 Azure Kubernetes Service (AKS) IPAM 模式和數據平面技術

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