在 Azure Kubernetes Service (AKS) 中使用雙重堆疊 kubenet 網路
您可以使用 kubenet 網路和雙重堆疊 Azure 虛擬網路,以雙重堆疊模式部署 AKS 叢集。 在此設定中,節點會同時接收來自 Azure 虛擬網路子網路的 IPv4 和 IPv6 位址。 Pod 會從邏輯上不同的位址空間接收至節點的 Azure 虛擬網路子網路的 IPv4 和 IPv6 位址。 網路位址轉譯 (NAT) 接著會進行設定,使 Pod 可以連接 Azure 虛擬網路上的資源。 流量的來源 IP 位址是 NAT 到相同系列的節點主要 IP 位址 (IPv4 到 IPv4、IPv6 到 IPv6)。
本文說明雙重堆疊網路如何與 AKS 叢集一起使用。 如需網路選項與考量的詳細資訊,請參閱 Kubernetes 和 AKS 的網路概念。
限制
- Azure 路由表的每個資料表均固定限制為 400 個路由。
- 雙重堆疊叢集中的每個節點都需要兩個路由,每個 IP 位址系列各有一個,因此雙重堆疊叢集限制為 200 個節點。
- 在 Azure Linux 節點集區中,僅對於
externalTrafficPolicy: Local
支援服務物件。 - Azure 虛擬網路和 Pod CIDR 需要雙重堆疊網路功能。
- 節點或 Pod IP 位址不支援單一堆疊 IPv6。 服務可以在 IPv4 或 IPv6 上佈建。
- 雙重堆疊 kubenet 不支援下列功能:
必要條件
- 設定 kubenet 網路的全部必要條件都適用。
- AKS 雙重堆疊叢集需要 Kubernetes 1.21.2 版或更新版本。 建議 1.22.2 或更新版本。
- 如果使用 Azure Resource Manager 範本,則需要結構描述版本 2021-10-01。
Kubernetes 中雙重堆疊網路的概觀
Kubernetes v1.23 為 IPv4/IPv6 雙重堆疊叢集帶來穩定的上游支援,包括 Pod 和服務網路。 節點和 Pod 一律會同時指派 IPv4 和 IPv6 位址,而服務可以是雙重堆疊或位址系列上的單一堆疊。
AKS 會設定雙重堆疊網路所需的支援服務。 此設定包括:
- 雙重堆疊虛擬網路設定 (如果使用受控虛擬網路)
- IPv4 和 IPv6 節點以及 Pod 位址。
- IPv4 和 IPv6 流量的輸出規則。
- IPv4 和 IPv6 服務的負載平衡器設定。
注意
搭配使用者定義路由的輸出類型使用 Dualstack 時,端視您是否需要 IPv6 流量來連線到網際網路而定,您可以選擇使用 IPv6 的預設路由。 如果您沒有 IPv6 的預設路由,建立叢集時會出現警告,但不會防止叢集建立。
部署雙重堆疊叢集
提供下列屬性來支援雙重堆疊叢集:
--ip-families
:採用以逗號分隔的 IP 系列清單,以便在叢集上啟用。- 僅支援
ipv4
或ipv4,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 叢集
使用
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> \ --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 Web 伺服器的工作負載部署範例。
部署 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
類型服務公開工作負載
重要
從 AKS v1.27 開始,您可以建立雙重堆疊 LoadBalancer 服務,此服務會佈建 1 個 IPv4 公用 IP 和 1 個 IPv6 公用 IP。 不過,在舊版中,只有服務的第一個 IP 位址會佈建至負載平衡器,因此雙重堆疊服務只會接收其中第一個列出的 IP 系列公用 IP。 若要為單一部署提供雙重堆疊服務,請建立兩個以相同選取器為目標的服務,一個用於 IPv4,另一個用於 IPv6。
從 1.27 版開始的 AKS
使用
kubectl expose deployment nginx
命令公開 NGINX 部署。kubectl expose deployment nginx --name=nginx --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilyPolicy": "PreferDualStack", "ipFamilies": ["IPv4", "IPv6"]}}'
您會收到顯示服務已公開的輸出。
service/nginx exposed
一旦公開部署且
LoadBalancer
服務已完全佈建之後,使用kubectl get services
命令會取得服務的 IP 位址。kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.0.223.73 2603:1030:20c:9::22d,4.156.88.133 80:30664/TCP 2m11s
kubectl get services nginx -ojsonpath='{.spec.clusterIPs}'
["10.0.223.73","fd17:d93e:db1f:f771::54e"]
透過支援 IPv6 主機的命令行 Web 要求來驗證功能。 Azure Cloud Shell 無法支援 IPv6。
SERVICE_IP=$(kubectl get services nginx -o jsonpath='{.status.loadBalancer.ingress[1].ip}') curl -s "http://[${SERVICE_IP}]" | head -n5
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>
早於 1.27 版的 AKS
使用
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
一旦公開部署且
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
透過支援 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>