IPv4/IPv6 雙棧

Kubernetes 允許你配置單棧 IPv4 網路、單棧 IPv6 網路或同時啟用兩種網路族的雙棧網路。本頁面解釋瞭如何配置。
特性狀態: Kubernetes v1.23 [stable]

IPv4/IPv6 雙棧網路允許為 PodService 分配 IPv4 和 IPv6 地址。

從 Kubernetes 1.21 開始,IPv4/IPv6 雙棧網路在你的 Kubernetes 叢集中預設啟用,允許同時分配 IPv4 和 IPv6 地址。

支援的特性

Kubernetes 叢集上的 IPv4/IPv6 雙棧提供以下特性:

  • 雙棧 Pod 網路(每個 Pod 分配一個 IPv4 和一個 IPv6 地址)
  • 支援 IPv4 和 IPv6 的 Service
  • 透過 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 或兩者兼有的Service

Service 的地址族預設為第一個 Service 叢集 IP 範圍的地址族(透過 kube-apiserver 的 --service-cluster-ip-range 標誌配置)。

定義 Service 時,你可以選擇將其配置為雙棧。要指定你想要的行為,請將 .spec.ipFamilyPolicy 欄位設定為以下值之一:

  • SingleStack:單棧服務。控制平面使用第一個配置的 Service 叢集 IP 範圍為 Service 分配一個叢集 IP。
  • PreferDualStack:當啟用雙棧時,為 Service 分配 IPv4 和 IPv6 叢集 IP。如果未啟用或不支援雙棧,則回退到單棧行為。
  • RequireDualStack:當啟用雙棧時,從 IPv4 和 IPv6 地址範圍為 Service 分配 .spec.clusterIPs。如果未啟用或不支援雙棧,Service API 物件的建立將失敗。
    • 根據 .spec.ipFamilies 陣列中第一個元素的地址族,從 .spec.clusterIPs 列表中選擇 .spec.clusterIP

如果你想定義單棧使用哪個 IP 族,或定義雙棧的 IP 族順序,可以透過在 Service 上設定一個可選欄位 .spec.ipFamilies 來選擇地址族。

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

  • ["IPv4"]
  • ["IPv6"]
  • ["IPv4","IPv6"] (雙棧)
  • ["IPv6","IPv4"] (雙棧)

你列出的第一個族用於遺留的 .spec.clusterIP 欄位。

雙棧 Service 配置場景

這些示例演示了各種雙棧 Service 配置場景的行為。

新 Service 上的雙棧選項

  1. 此 Service 規範未明確定義 .spec.ipFamilyPolicy。當你建立此 Service 時,Kubernetes 會從第一個配置的 service-cluster-ip-range 為 Service 分配一個叢集 IP,並將 .spec.ipFamilyPolicy 設定為 SingleStack。(不帶選擇器的 Service 和帶選擇器的無頭 Service 將以相同的方式執行。)

    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. 此 Service 規範在 .spec.ipFamilyPolicy 中明確定義了 PreferDualStack。當你在雙棧叢集上建立此 Service 時,Kubernetes 會為 Service 分配 IPv4 和 IPv6 地址。控制平面更新 Service 的 .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. 此 Service 規範在 .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
    

現有 Service 上的雙棧預設值

這些示例演示了在已存在 Service 的叢集上新啟用雙棧時的預設行為。(將現有叢集升級到 1.21 或更高版本將啟用雙棧。)

  1. 當叢集上啟用雙棧時,現有 Service(無論是 IPv4 還是 IPv6)由控制平面配置,將 .spec.ipFamilyPolicy 設定為 SingleStack,並將 .spec.ipFamilies 設定為現有 Service 的地址族。現有 Service 叢集 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. 當叢集上啟用雙棧時,帶選擇器的現有無頭 Service 由控制平面配置,將 .spec.ipFamilyPolicy 設定為 SingleStack,並將 .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
    

在單棧和雙棧之間切換 Service

Service 可以從單棧更改為雙棧,也可以從雙棧更改為單棧。

  1. 要將 Service 從單棧更改為雙棧,請根據需要將 .spec.ipFamilyPolicySingleStack 更改為 PreferDualStackRequireDualStack。當你將此 Service 從單棧更改為雙棧時,Kubernetes 會分配缺少的地址族,以便 Service 現在具有 IPv4 和 IPv6 地址。

    編輯 Service 規範,將 .spec.ipFamilyPolicySingleStack 更新為 PreferDualStack

    之前

    spec:
      ipFamilyPolicy: SingleStack
    

    之後

    spec:
      ipFamilyPolicy: PreferDualStack
    
  2. 要將 Service 從雙棧更改為單棧,請將 .spec.ipFamilyPolicyPreferDualStackRequireDualStack 更改為 SingleStack。當你將此 Service 從雙棧更改為單棧時,Kubernetes 只保留 .spec.clusterIPs 陣列中的第一個元素,並將 .spec.clusterIP 設定為該 IP 地址,並將 .spec.ipFamilies 設定為 .spec.clusterIPs 的地址族。

無選擇器的無頭 Service

對於無選擇器且未顯式設定 .spec.ipFamilyPolicy 的無頭 Service,.spec.ipFamilyPolicy 欄位預設為 RequireDualStack

Service 型別 LoadBalancer

要為你的 Service 供應雙棧負載均衡器:

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

出站流量

如果你希望啟用出站流量,以便從使用非公開可路由 IPv6 地址的 Pod 訪問叢集外部目的地(例如公共網際網路),你需要透過透明代理或 IP 偽裝等機制,使 Pod 能夠使用公開路由的 IPv6 地址。 ip-masq-agent 專案支援在雙棧叢集上進行 IP 偽裝。

Windows 支援

Kubernetes on Windows 不支援單棧“僅 IPv6”網路。但是,支援 Pod 和節點使用單族服務的雙棧 IPv4/IPv6 網路。

你可以在 l2bridge 網路中使用 IPv4/IPv6 雙棧網路。

你可以在Windows 網路主題中閱讀有關 Windows 不同網路模式的更多資訊。

下一步

上次修改時間為 2024 年 6 月 12 日太平洋標準時間上午 10:06:修復 IPv4/IPv6 雙棧中的引用 (5ead326713)