共用方式為


在 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 系列清單,以便在叢集上啟用。
    • 僅支援 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 命令來建立叢集的 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> \
        --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 Web 伺服器的工作負載部署範例。

部署 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 類型服務公開工作負載

重要

從 AKS v1.27 開始,您可以建立雙重堆疊 LoadBalancer 服務,此服務會佈建 1 個 IPv4 公用 IP 和 1 個 IPv6 公用 IP。 不過,在舊版中,只有服務的第一個 IP 位址會佈建至負載平衡器,因此雙重堆疊服務只會接收其中第一個列出的 IP 系列公用 IP。 若要為單一部署提供雙重堆疊服務,請建立兩個以相同選取器為目標的服務,一個用於 IPv4,另一個用於 IPv6。

從 1.27 版開始的 AKS

  1. 使用 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
    
  2. 一旦公開部署且 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"]
    
  3. 透過支援 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

  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>