IPv4/IPv6 雙堆疊

Kubernetes 可讓您設定單堆疊 IPv4 網路、單堆疊 IPv6 網路或同時啟用兩種網路系列的雙堆疊網路。本頁說明如何操作。
功能狀態: Kubernetes v1.23 [穩定]

IPv4/IPv6 雙堆疊網路讓您能夠將 IPv4 和 IPv6 位址同時分配給 Pod服務

從 1.21 版開始,預設會為您的 Kubernetes 叢集啟用 IPv4/IPv6 雙堆疊網路,允許同時指派 IPv4 和 IPv6 位址。

支援的功能

您 Kubernetes 叢集上的 IPv4/IPv6 雙堆疊提供下列功能

  • 雙堆疊 Pod 網路(每個 Pod 指派單一 IPv4 和 IPv6 位址)
  • 啟用 IPv4 和 IPv6 的服務
  • 透過 IPv4 和 IPv6 介面進行 Pod 叢集外出口路由(例如網際網路)

先決條件

若要使用 IPv4/IPv6 雙堆疊 Kubernetes 叢集,需要下列先決條件

  • Kubernetes 1.20 或更新版本

    如需搭配舊版 Kubernetes 使用雙堆疊服務的資訊,請參閱該 Kubernetes 版本的說明文件。

  • 供應商支援雙堆疊網路(雲端供應商或其他供應商必須能夠為 Kubernetes 節點提供可路由的 IPv4/IPv6 網路介面)

  • 支援雙堆疊網路的 網路外掛程式

設定 IPv4/IPv6 雙堆疊

若要設定 IPv4/IPv6 雙堆疊,請設定雙堆疊叢集網路指派

  • kube-apiserver
    • --service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>
  • kube-controller-manager
    • --cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
    • --service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>
    • --node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6 預設為 IPv4 的 /24 和 IPv6 的 /64
  • kube-proxy
    • --cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
  • kubelet
    • --node-ip=<IPv4 IP>,<IPv6 IP>
      • 裸機雙堆疊節點(未定義 --cloud-provider 旗標的雲端供應商的節點)需要此選項。如果您使用雲端供應商並選擇覆寫雲端供應商選擇的節點 IP,請設定 --node-ip 選項。
      • (舊版內建雲端供應商不支援雙堆疊 --node-ip。)

服務

您可以建立可以使用 IPv4、IPv6 或兩者的 服務

服務的位址系列預設為第一個服務叢集 IP 範圍的位址系列(透過 kube-apiserver 的 --service-cluster-ip-range 旗標設定)。

當您定義服務時,您可以選擇性地將其設定為雙堆疊。若要指定您想要的行為,請將 .spec.ipFamilyPolicy 欄位設定為下列其中一個值

  • SingleStack:單堆疊服務。控制平面會為服務配置叢集 IP,使用第一個設定的服務叢集 IP 範圍。
  • PreferDualStack:啟用雙堆疊時,為服務配置 IPv4 和 IPv6 叢集 IP。如果未啟用或不支援雙堆疊,則會回復為單堆疊行為。
  • RequireDualStack:啟用雙堆疊時,從 IPv4 和 IPv6 位址範圍配置服務 .spec.clusterIPs。如果未啟用或不支援雙堆疊,則服務 API 物件建立會失敗。
    • 根據 .spec.ipFamilies 陣列中第一個元素的位址系列,從 .spec.clusterIPs 清單中選取 .spec.clusterIP

如果您想要定義用於單堆疊的 IP 系列,或定義雙堆疊的 IP 系列順序,您可以選擇透過在服務上設定選用欄位 .spec.ipFamilies 來選擇位址系列。

您可以將 .spec.ipFamilies 設定為下列任何陣列值

  • ["IPv4"]
  • ["IPv6"]
  • ["IPv4","IPv6"](雙堆疊)
  • ["IPv6","IPv4"](雙堆疊)

您列出的第一個系列會用於舊版 .spec.clusterIP 欄位。

雙堆疊服務組態情境

這些範例示範各種雙堆疊服務組態情境的行為。

新服務上的雙堆疊選項

  1. 此服務規格未明確定義 .spec.ipFamilyPolicy。當您建立此服務時,Kubernetes 會從第一個設定的 service-cluster-ip-range 為服務指派叢集 IP,並將 .spec.ipFamilyPolicy 設定為 SingleStack。(沒有選擇器的服務和具有選擇器的 無頭服務 行為方式相同。)

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      labels:
        app.kubernetes.io/name: MyApp
    spec:
      selector:
        app.kubernetes.io/name: MyApp
      ports:
        - protocol: TCP
          port: 80
    
  2. 此服務規格在 .spec.ipFamilyPolicy 中明確定義 PreferDualStack。當您在雙堆疊叢集上建立此服務時,Kubernetes 會為服務指派 IPv4 和 IPv6 位址。控制平面會更新服務的 .spec 以記錄 IP 位址指派。欄位 .spec.clusterIPs 是主要欄位,包含兩個指派的 IP 位址;.spec.clusterIP 是次要欄位,其值是從 .spec.clusterIPs 計算而來。

    • 對於 .spec.clusterIP 欄位,控制平面會記錄與第一個服務叢集 IP 範圍的位址系列相同的 IP 位址。
    • 在單堆疊叢集上,.spec.clusterIPs.spec.clusterIP 欄位都只列出一個位址。
    • 在啟用雙堆疊的叢集上,在 .spec.ipFamilyPolicy 中指定 RequireDualStack 的行為與 PreferDualStack 相同。
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      labels:
        app.kubernetes.io/name: MyApp
    spec:
      ipFamilyPolicy: PreferDualStack
      selector:
        app.kubernetes.io/name: MyApp
      ports:
        - protocol: TCP
          port: 80
    
  3. 此服務規格在 .spec.ipFamilies 中明確定義 IPv6IPv4,並在 .spec.ipFamilyPolicy 中定義 PreferDualStack。當 Kubernetes 在 .spec.clusterIPs 中指派 IPv6 和 IPv4 位址時,.spec.clusterIP 會設定為 IPv6 位址,因為這是 .spec.clusterIPs 陣列中的第一個元素,覆寫預設值。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      labels:
        app.kubernetes.io/name: MyApp
    spec:
      ipFamilyPolicy: PreferDualStack
      ipFamilies:
      - IPv6
      - IPv4
      selector:
        app.kubernetes.io/name: MyApp
      ports:
        - protocol: TCP
          port: 80
    

現有服務上的雙堆疊預設行為

這些範例示範了在叢集上新啟用雙堆疊,且叢集已存在服務時的預設行為。(將現有叢集升級到 1.21 或更高版本將啟用雙堆疊。)

  1. 當在叢集上啟用雙堆疊時,現有的服務(無論是 IPv4IPv6)會由控制平面設定 .spec.ipFamilyPolicySingleStack,並設定 .spec.ipFamilies 為現有服務的位址族系。現有服務的叢集 IP 位址將儲存在 .spec.clusterIPs 中。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      labels:
        app.kubernetes.io/name: MyApp
    spec:
      selector:
        app.kubernetes.io/name: MyApp
      ports:
        - protocol: TCP
          port: 80
    

    您可以使用 kubectl 來檢查現有的服務,以驗證此行為。

    kubectl get svc my-service -o yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/name: MyApp
      name: my-service
    spec:
      clusterIP: 10.0.197.123
      clusterIPs:
      - 10.0.197.123
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app.kubernetes.io/name: MyApp
      type: ClusterIP
    status:
      loadBalancer: {}
    
  2. 當在叢集上啟用雙堆疊時,現有的具選擇器的無頭服務(Headless Service)會由控制平面設定 .spec.ipFamilyPolicySingleStack,並設定 .spec.ipFamilies 為第一個服務叢集 IP 位址範圍(透過 kube-apiserver 的 --service-cluster-ip-range 標誌設定)的位址族系,即使 .spec.clusterIP 設定為 None 也是如此。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      labels:
        app.kubernetes.io/name: MyApp
    spec:
      selector:
        app.kubernetes.io/name: MyApp
      ports:
        - protocol: TCP
          port: 80
    

    您可以使用 kubectl 來檢查現有的具選擇器的無頭服務,以驗證此行為。

    kubectl get svc my-service -o yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/name: MyApp
      name: my-service
    spec:
      clusterIP: None
      clusterIPs:
      - None
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app.kubernetes.io/name: MyApp
    

在單堆疊和雙堆疊服務之間切換

服務可以從單堆疊變更為雙堆疊,也可以從雙堆疊變更為單堆疊。

  1. 若要將服務從單堆疊變更為雙堆疊,請將 .spec.ipFamilyPolicySingleStack 變更為 PreferDualStackRequireDualStack,視需要而定。當您將此服務從單堆疊變更為雙堆疊時,Kubernetes 會指派遺失的位址族系,使該服務現在同時具有 IPv4 和 IPv6 位址。

    編輯服務規格,將 .spec.ipFamilyPolicySingleStack 更新為 PreferDualStack

    變更前

    spec:
      ipFamilyPolicy: SingleStack
    

    變更後

    spec:
      ipFamilyPolicy: PreferDualStack
    
  2. 若要將服務從雙堆疊變更為單堆疊,請將 .spec.ipFamilyPolicyPreferDualStackRequireDualStack 變更為 SingleStack。當您將此服務從雙堆疊變更為單堆疊時,Kubernetes 只會保留 .spec.clusterIPs 陣列中的第一個元素,並將 .spec.clusterIP 設定為該 IP 位址,並將 .spec.ipFamilies 設定為 .spec.clusterIPs 的位址族系。

無選擇器的無頭服務

對於無選擇器的無頭服務,且未明確設定 .spec.ipFamilyPolicy 的情況下,.spec.ipFamilyPolicy 欄位預設為 RequireDualStack

Service 類型 LoadBalancer

若要為您的服務佈建雙堆疊負載平衡器

  • .spec.type 欄位設定為 LoadBalancer
  • .spec.ipFamilyPolicy 欄位設定為 PreferDualStackRequireDualStack

對外流量

如果您想要啟用對外流量,以便從 Pod 連接到叢集外部的目的地(例如,公共網際網路),而該 Pod 使用非公開路由的 IPv6 位址,則您需要啟用 Pod 以透過透明代理或 IP 偽裝等機制使用公開路由的 IPv6 位址。ip-masq-agent 專案支援在雙堆疊叢集上進行 IP 偽裝。

Windows 支援

Windows 上的 Kubernetes 不支援單堆疊「僅限 IPv6」網路。但是,支援 Pod 和節點的 IPv4/IPv6 雙堆疊網路以及單族系服務。

您可以搭配 l2bridge 網路使用 IPv4/IPv6 雙堆疊網路。

您可以在Windows 網路功能主題中閱讀更多關於 Windows 不同網路模式的資訊。

下一步

上次修改時間為 2024 年 6 月 12 日上午 10:06 PST:修正 IPv4/IPv6 雙堆疊中的參考 (5ead326713)