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 CIDR 的範例:10.244.0.0/16
(雖然您會提供自己的位址範圍)
IPv6 CIDR 的範例:fdXY:IJKL:MNOP:15::/64
(這顯示格式,但不是有效的位址 - 請參閱 RFC 4193)
服務
您可以建立可以使用 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
欄位是有條件可變的:您可以新增或移除次要 IP 位址系列,但無法變更現有服務的主要 IP 位址系列。您可以將 .spec.ipFamilies
設定為下列任何陣列值
["IPv4"]
["IPv6"]
["IPv4","IPv6"]
(雙堆疊)["IPv6","IPv4"]
(雙堆疊)
您列出的第一個系列會用於舊版 .spec.clusterIP
欄位。
雙堆疊服務組態情境
這些範例示範各種雙堆疊服務組態情境的行為。
新服務上的雙堆疊選項
此服務規格未明確定義
.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
此服務規格在
.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
- 對於
此服務規格在
.spec.ipFamilies
中明確定義IPv6
和IPv4
,並在.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 或更高版本將啟用雙堆疊。)
當在叢集上啟用雙堆疊時,現有的服務(無論是
IPv4
或IPv6
)會由控制平面設定.spec.ipFamilyPolicy
為SingleStack
,並設定.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: {}
當在叢集上啟用雙堆疊時,現有的具選擇器的無頭服務(Headless 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
在單堆疊和雙堆疊服務之間切換
服務可以從單堆疊變更為雙堆疊,也可以從雙堆疊變更為單堆疊。
若要將服務從單堆疊變更為雙堆疊,請將
.spec.ipFamilyPolicy
從SingleStack
變更為PreferDualStack
或RequireDualStack
,視需要而定。當您將此服務從單堆疊變更為雙堆疊時,Kubernetes 會指派遺失的位址族系,使該服務現在同時具有 IPv4 和 IPv6 位址。編輯服務規格,將
.spec.ipFamilyPolicy
從SingleStack
更新為PreferDualStack
。變更前
spec: ipFamilyPolicy: SingleStack
變更後
spec: ipFamilyPolicy: PreferDualStack
若要將服務從雙堆疊變更為單堆疊,請將
.spec.ipFamilyPolicy
從PreferDualStack
或RequireDualStack
變更為SingleStack
。當您將此服務從雙堆疊變更為單堆疊時,Kubernetes 只會保留.spec.clusterIPs
陣列中的第一個元素,並將.spec.clusterIP
設定為該 IP 位址,並將.spec.ipFamilies
設定為.spec.clusterIPs
的位址族系。
無選擇器的無頭服務
對於無選擇器的無頭服務,且未明確設定 .spec.ipFamilyPolicy
的情況下,.spec.ipFamilyPolicy
欄位預設為 RequireDualStack
。
Service 類型 LoadBalancer
若要為您的服務佈建雙堆疊負載平衡器
- 將
.spec.type
欄位設定為LoadBalancer
- 將
.spec.ipFamilyPolicy
欄位設定為PreferDualStack
或RequireDualStack
注意
若要使用雙堆疊LoadBalancer
類型服務,您的雲端供應商必須支援 IPv4 和 IPv6 負載平衡器。對外流量
如果您想要啟用對外流量,以便從 Pod 連接到叢集外部的目的地(例如,公共網際網路),而該 Pod 使用非公開路由的 IPv6 位址,則您需要啟用 Pod 以透過透明代理或 IP 偽裝等機制使用公開路由的 IPv6 位址。ip-masq-agent 專案支援在雙堆疊叢集上進行 IP 偽裝。
注意
請確保您的 CNI 供應商支援 IPv6。Windows 支援
Windows 上的 Kubernetes 不支援單堆疊「僅限 IPv6」網路。但是,支援 Pod 和節點的 IPv4/IPv6 雙堆疊網路以及單族系服務。
您可以搭配 l2bridge
網路使用 IPv4/IPv6 雙堆疊網路。
注意
Windows 上的 Overlay (VXLAN) 網路不支援雙堆疊網路。您可以在Windows 網路功能主題中閱讀更多關於 Windows 不同網路模式的資訊。