您可以使用雙堆疊 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 CLI 2.48.1 版或更新版本。 執行
az --version來了解您安裝的版本。 若要安裝或升級 Azure CLI,請參見 Install Azure CLI。 - 在 AKS 中使用你所在地區可用的 支援 Kubernetes 版本 。
本文使用 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 叢集
使用
az group create命令建立叢集的 Azure 資源群組。az group create --location <region> --name <resourceGroupName>使用
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建立叢集後,使用
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 網頁伺服器
執行
kubectl create deployment nginx指令建立 NGINX 網頁伺服器。kubectl create deployment nginx --image=nginx:latest --replicas=3透過執行
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 回應節點上的探測。
使用
LoadBalancer指令,以分開的 IPv4 和 IPv6kubectl 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在你公開部署並完全配置
LoadBalancer服務後,使用kubectl get services指令取得服務的 IP 位址。kubectl get servicesNAME 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請從 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>