在 Azure Kubernetes Service 中使用雙堆棧網路功能 (AKS)

您可以使用雙堆疊 Azure 虛擬網路,以雙堆棧模式部署 AKS 叢集。 在此設定中,節點會同時接收來自 Azure 虛擬網路子網路的 IPv4 和 IPv6 位址。 Pod 會從邏輯上不同的位址空間接收至節點的 Azure 虛擬網路子網路的 IPv4 和 IPv6 位址。 接著會設定網路位址轉換 (NAT),讓 Pod 可以連線到 Azure 虛擬網路上的資源。 流量的來源 IP 位址透過 NAT 轉換為相同類型的節點主要 IP 位址(IPv4 到 IPv4,IPv6 到 IPv6)。

本文說明如何搭配 AKS 叢集使用雙堆棧網路。 如需網路選項與考量的詳細資訊,請參閱 Kubernetes 和 AKS 的網路概念。

這很重要

自 2025 年 11 月 30 日起,Azure Kubernetes Service(AKS)不再支援或提供 Azure Linux 2.0 的安全更新。 Azure Linux 2.0 節點映像已凍結在202512.06.0發行版本。 自 2026 年 10 月 31 日起,節點映像將被移除,且你將無法擴展你的節點池。 透過 升級節點池 至支援的 Kubernetes 版本或遷移至 osSku AzureLinux3,遷移到支援的 Azure Linux 版本。 更多資訊請參閱 退休 GitHub 議題 及 Azure 更新退休公告。 想隨時掌握公告與更新,請參考 AKS 發布公告。

局限性

  • 在 Azure Linux 節點池中,IPv6 服務需要 externalTrafficPolicy: Local。
  • Azure 虛擬網路和 Pod CIDR 需要雙重堆疊網路功能。
    • 節點或 Pod IP 位址不支援單一堆疊 IPv6。 服務可以在 IPv4 或 IPv6 上布建。
  • Azure CNI Overlay 不支援 Azure 或 Calico 的雙重堆疊網路政策。 要使用網路政策,請使用 Azure CNI Powered by Cilium。
  • 標準 NAT 閘道僅支援 IPv4。 針對雙堆疊輸出流量,請使用 StandardV2 NAT 閘道。 由 AKS 管理的 managedNATGatewayV2 輸出類型目前為預覽版。
  • 虛擬節點的附加元件不支援雙堆疊網路。

先決條件

本文使用 Azure CNI 覆蓋層。 你也可以在執行 Kubernetes 1.29 或更新版本的 Linux 叢集上,部署採用 Azure CNI Powered by Cilium 的雙堆疊叢集。

Kubernetes 中的雙堆棧網路概觀

Kubernetes v1.23 為 IPv4/IPv6 雙堆棧 叢集提供穩定的上游支援,包括 Pod 和服務網路。 節點和 Pod 一律會同時指派 IPv4 和 IPv6 位址,而服務可以在其中一個位址類型上設定為雙堆疊或單一堆疊。

AKS 會設定雙堆棧網路所需的支持服務。 此組態包括:

  • 如果您使用受控虛擬網路,則為雙堆疊虛擬網路組態。
  • IPv4 和 IPv6 節點和 Pod 位址。
  • IPv4 和 IPv6 流量的輸出規則。
  • IPv4 和 IPv6 服務的負載平衡器設定。

備註

當你使用雙堆疊網路搭配用戶自訂路由的 外站 方式時,可以根據是否需要 IPv6 流量來連接網際網路,選擇預設的 IPv6 路由。 如果你沒有 IPv6 的預設路由,建立叢集時會跳出警告,但不會阻止叢集建立。

雙堆疊叢集參數

以下參數支援雙堆疊叢集:

參數 接受的值 預設值 條件約束
--ip-families ipv4 或 ipv4,ipv6 未具體說明 提供一個逗號分隔的 IP 家族清單,以便在叢集上啟用。
--pod-cidrs 逗號分隔的 CIDR 範圍 10.244.0.0/16,fd12:3456:789a::/64 範圍的數量與順序必須相符 --ip-families。
--service-cidrs 逗號分隔的 CIDR 範圍 10.0.0.0/16,fd12:3456:789a:1::/108 範圍的數量與順序必須相符 --ip-families。 IPv6 子網最大不能超過 /108。

部署雙堆疊 AKS 叢集

  1. 使用 az group create 命令建立叢集的 Azure 資源群組。

    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
    
  3. 建立叢集後,使用 az aks get-credentials 指令取得叢集憑證。

    az aks get-credentials --resource-group <resourceGroupName> --name <clusterName>
    

檢查節點以查看這兩個IP系列

叢集配置完成後,請使用 kubectl get nodes 指令確認節點是否已配置為雙堆疊網路。

kubectl get nodes -o=custom-columns="NAME:.metadata.name,ADDRESSES:.status.addresses[?(@.type=='InternalIP')].address,PODCIDRS:.spec.podCIDRs[*]"

命令的 kubectl get nodes 輸出會顯示節點具有來自 IPv4 和 IPv6 的位址和 Pod IP 指派空間。

NAME                                ADDRESSES                           PODCIDRS
aks-nodepool1-14508455-vmss000000   10.240.0.4,2001:1234:5678:9abc::4   10.244.0.0/24,fd12:3456:789a::/80
aks-nodepool1-14508455-vmss000001   10.240.0.5,2001:1234:5678:9abc::5   10.244.1.0/24,fd12:3456:789a:0:1::/80
aks-nodepool1-14508455-vmss000002   10.240.0.6,2001:1234:5678:9abc::6   10.244.2.0/24,fd12:3456:789a:0:2::/80

建立範例工作負載

部署一台包含三個副本的 NGINX 網頁伺服器,以驗證雙堆疊 Pod 的 IP 分配。

部署 NGINX 網頁伺服器

  1. 執行 kubectl create deployment nginx 指令建立 NGINX 網頁伺服器。

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. 透過執行 kubectl get pods 指令查看 pod 資源。

    kubectl get pods -o custom-columns="NAME:.metadata.name,IPs:.status.podIPs[*].ip,NODE:.spec.nodeName,READY:.status.conditions[?(@.type=='Ready')].status"
    

    輸出顯示 Pod 同時具有 IPv4 和 IPv6 位址。 Pod 就緒之前,不會顯示 IP 位址。

    NAME                     IPs                                NODE                                READY
    nginx-55649fd747-9cr7h   10.244.2.2,fd12:3456:789a:0:2::2   aks-nodepool1-14508455-vmss000002   True
    nginx-55649fd747-p5lr9   10.244.0.7,fd12:3456:789a::7       aks-nodepool1-14508455-vmss000000   True
    nginx-55649fd747-r2rqh   10.244.1.2,fd12:3456:789a:0:1::2   aks-nodepool1-14508455-vmss000001   True
    

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

這很重要

Azure Load Balancer 從連結本機位址將健全狀態探查傳送至 IPv6 目的地。 在 Azure Linux 節點集區上,傳送至使用 externalTrafficPolicy: Cluster 的 IPv6 服務流量會失敗。 以下範例 externalTrafficPolicy: Local 設定在 IPv6 服務上,使其 kube-proxy 回應節點上的探測。

  1. 使用 LoadBalancer 指令,以分開的 IPv4 和 IPv6 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":{"externalTrafficPolicy":"Local","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. 請從 Linux 虛擬機或本地機(已指定 IPv6 位址並設定 IPv6 路由)驗證功能。 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>