IPv4/IPv6 雙棧
Kubernetes v1.23 [stable]
IPv4/IPv6 雙棧網路允許為 Pod 和 Service 分配 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 CIDR 示例:10.244.0.0/16
(儘管你應該提供自己的地址範圍)
IPv6 CIDR 示例:fdXY:IJKL:MNOP:15::/64
(這顯示了格式但不是一個有效地址 - 請參閱 RFC 4193)
服務
你可以建立可使用 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
欄位是條件可變的:你可以新增或刪除一個輔助 IP 地址族,但不能更改現有 Service 的主要 IP 地址族。你可以將 .spec.ipFamilies
設定為以下任何陣列值:
["IPv4"]
["IPv6"]
["IPv4","IPv6"]
(雙棧)["IPv6","IPv4"]
(雙棧)
你列出的第一個族用於遺留的 .spec.clusterIP
欄位。
雙棧 Service 配置場景
這些示例演示了各種雙棧 Service 配置場景的行為。
新 Service 上的雙棧選項
此 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
此 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
- 對於
此 Service 規範在
.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
現有 Service 上的雙棧預設值
這些示例演示了在已存在 Service 的叢集上新啟用雙棧時的預設行為。(將現有叢集升級到 1.21 或更高版本將啟用雙棧。)
當叢集上啟用雙棧時,現有 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: {}
當叢集上啟用雙棧時,帶選擇器的現有無頭 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 可以從單棧更改為雙棧,也可以從雙棧更改為單棧。
要將 Service 從單棧更改為雙棧,請根據需要將
.spec.ipFamilyPolicy
從SingleStack
更改為PreferDualStack
或RequireDualStack
。當你將此 Service 從單棧更改為雙棧時,Kubernetes 會分配缺少的地址族,以便 Service 現在具有 IPv4 和 IPv6 地址。編輯 Service 規範,將
.spec.ipFamilyPolicy
從SingleStack
更新為PreferDualStack
。之前
spec: ipFamilyPolicy: SingleStack
之後
spec: ipFamilyPolicy: PreferDualStack
要將 Service 從雙棧更改為單棧,請將
.spec.ipFamilyPolicy
從PreferDualStack
或RequireDualStack
更改為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
欄位設定為PreferDualStack
或RequireDualStack
注意
要使用雙棧LoadBalancer
型別的 Service,你的雲提供商必須支援 IPv4 和 IPv6 負載均衡器。出站流量
如果你希望啟用出站流量,以便從使用非公開可路由 IPv6 地址的 Pod 訪問叢集外部目的地(例如公共網際網路),你需要透過透明代理或 IP 偽裝等機制,使 Pod 能夠使用公開路由的 IPv6 地址。 ip-masq-agent 專案支援在雙棧叢集上進行 IP 偽裝。
注意
確保你的 CNI 提供商支援 IPv6。Windows 支援
Kubernetes on Windows 不支援單棧“僅 IPv6”網路。但是,支援 Pod 和節點使用單族服務的雙棧 IPv4/IPv6 網路。
你可以在 l2bridge
網路中使用 IPv4/IPv6 雙棧網路。
注意
Windows 上的覆蓋 (VXLAN) 網路**不**支援雙棧網路。你可以在Windows 網路主題中閱讀有關 Windows 不同網路模式的更多資訊。