本文說明如何為 Google Distributed Cloud 設定單一根目錄輸入/輸出虛擬化 (SR-IOV) 網路。SR-IOV 提供 I/O 虛擬化功能,可將網路介面卡 (NIC) 設為 Linux 核心中的網路裝置。您可以管理網路連線,並將其指派給 Pod。封包直接在 NIC 和 Pod 之間移動,因此效能有所提升。
如果需要快速連線至 Pod 工作負載,請使用這項功能。Google Distributed Cloud 的 SR-IOV 可讓您在叢集節點的支援裝置上設定虛擬函式 (VF)。您也可以指定要繫結至 VF 的特定核心模組。
這項功能適用於執行工作負載的叢集,例如混合式、獨立和使用者叢集。叢集至少要有兩個節點,才能使用 SR-IOV 網路功能。
設定程序大致包含下列步驟:
- 設定叢集,啟用 SR-IOV 網路。
- 設定 SR-IOV 運算子,這是一項
SriovOperatorConfig
自訂資源。 - 設定 SR-IOV 政策並設定 VF。
- 建立參照 VF 的
NetworkAttachmentDefinition
自訂資源。
需求條件
如要使用 SR-IOV 網路功能,叢集節點必須有網路介面的正式驅動程式。使用 SR-IOV 運算子前,請先安裝驅動程式。此外,如要對 VF 使用 vfio-pci
模組,請確認該模組可在要使用的節點上使用。
為叢集啟用 SR-IOV 網路
如要為 Google Distributed Cloud 啟用 SR-IOV 網路,請將 multipleNetworkInterfaces
欄位和 sriovOperator
欄位新增至 Cluster 物件的 clusterNetwork
區段,並將這兩個欄位都設為 true
。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
spec:
clusterNetwork:
multipleNetworkInterfaces: true
sriovOperator: true
...
sriovOperator
欄位可變動,叢集建立後仍可變更。
設定 SR-IOV 運算子
SriovOperatorConfig
自訂資源可為 SR-IOV 網路功能提供全域設定。這個組合式自訂資源的名稱為 default
,位於 gke-operators
命名空間中。系統只會針對這個名稱和命名空間採用 SriovOperatorConfig
自訂資源。
您可以使用下列指令編輯這個物件:
kubectl -n gke-operators edit sriovoperatorconfigs.sriovnetwork.k8s.cni.cncf.io default
以下是 SriovOperatorConfig
自訂資源設定的範例:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: gke-operators
spec:
configDaemonNodeSelector:
nodePool: "withSriov"
disableDrain: false
logLevel: 0
您可以在「configDaemonNodeSelector
」部分限制 SR-IOV 運算子可處理的節點。在上述範例中,運算子僅限於具有 nodePool: withSriov
標籤的節點。如果未指定 configDaemonNodeSelector
欄位,系統會套用下列預設標籤:
beta.kubernetes.io/os: linux
node-role.kubernetes.io/worker: ""
disableDrain
欄位會指定是否要在節點必須重新啟動前,或特定 VF 設定變更前,執行 Kubernetes 節點排空作業。
建立 SR-IOV 政策
如要在叢集中設定特定 VF,您必須在 gke-operators
命名空間中建立 SriovNetworkNodePolicy
自訂資源。
以下是 SriovNetworkNodePolicy
自訂資源的資訊清單範例:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
namespace: gke-operators
spec:
deviceType: "netdevice"
mtu: 1600
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0
deviceID: "1015"
rootDevices:
- 0000:01:00.0
vendor: "15b3"
numVfs: 4
priority: 80
resourceName: "mlnx"
您可以在 nodeSelector
區段中,進一步限制必須建立 VF 的節點。除了上一節所述的 SriovOperatorConfig
選擇器之外,還有這項限制。
deviceType
欄位會指定要用於 VF 的核心模組。deviceType
的可用選項包括:
netdevice
,適用於 VF 專用的標準核心模組vfio-pci
代表 VFIO-PCI 驅動程式
resourceName
定義 VF 在 Kubernetes 節點中顯示的名稱。
設定程序完成後,所選叢集節點會包含定義的資源,如下列範例所示 (請注意 gke.io/mlnx
):
apiVersion: v1
kind: Node
metadata:
name: worker-01
spec:
…
status:
allocatable:
cpu: 47410m
ephemeral-storage: "210725550141"
gke.io/mlnx: "4"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 59884492Ki
pods: "250"
capacity:
cpu: "48"
ephemeral-storage: 228651856Ki
gke.io/mlnx: "4"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 65516492Ki
pods: "250"
運算子一律會為您使用 SriovNetworkNodePolicy
定義的每個資源加上 gke.io/
前置字元。
指定 NIC 選取器
如要讓 SriovNetworkNodePolicy
正常運作,請在 nicSelector
區段中至少指定一個選取器。這個欄位包含多個選項,說明如何識別叢集節點中的特定實體功能 (PF)。系統會為您找出這個欄位的大部分必要資訊,並儲存在 SriovNetworkNodeState
自訂資源中。每個節點都會有一個物件,供這個運算子處理。
使用下列指令查看所有可用節點:
kubectl -n gke-operators get sriovnetworknodestates.sriovnetwork.k8s.cni.cncf.io -o yaml
節點範例如下:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
name: worker-01
namespace: gke-operators
spec:
dpConfigVersion: "6368949"
status:
interfaces:
- deviceID: "1015"
driver: mlx5_core
eSwitchMode: legacy
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9c
mtu: 1500
name: enp1s0f0
pciAddress: "0000:01:00.0"
totalvfs: 4
vendor: 15b3
- deviceID: "1015"
driver: mlx5_core
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9d
mtu: 1500
name: enp1s0f1
pciAddress: "0000:01:00.1"
totalvfs: 2
vendor: 15b3
syncStatus: Succeeded
設定實體函式分割
請特別留意 nicSelector
區段的 pfNames
欄位。除了定義要使用的確切 PF,您也可以指定要用於特定 PF 的確切 VF,以及政策中定義的資源。
範例如下:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
namespace: gke-operators
spec:
deviceType: "netdevice"
mtu: 1600
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#3-6
deviceID: "1015"
rootDevices:
- 0000:01:00.0
vendor: "15b3"
numVfs: 7
priority: 80
resourceName: "mlnx"
在前例中,gke.io/mlnx
資源只會使用編號 3 到 6 的 VF,且只會顯示四個可用的 VF。由於 VF 一律是從零索引建立,因此您要求的 VF 數量 numVfs
必須至少與範圍結尾值 (從零開始計算) 一樣高。因此在上述範例中,numVfs
會設為 7
。舉例來說,如果您將範圍設為 3 到 4 (enp65s0f0#3-4
),則 numVfs
必須至少為 5
。
如果未指定分割區,numVfs
會定義使用的 VF 範圍,且一律從零開始。舉例來說,如果您設定 numVfs=3
但未指定分割,系統會使用 VF 0-2
。
瞭解政策優先順序
您可以指定多個 SriovNetworkNodePolicy
物件,處理各種供應商或不同的 VF 設定。如果多項政策參照同一個 PF,管理多個物件和供應商可能會變得麻煩。為處理這類情況,priority
欄位會逐一解決節點的衝突。
以下是重疊 PF 政策的優先順序邏輯:
只有在 PF 分割區重疊時,優先順序較高的政策才會覆寫優先順序較低的政策。
合併優先順序相同的政策:
- 政策會依名稱排序,並依序處理
- 如果政策的 PF 分割區重疊,系統會覆寫政策
- 系統會合併 PF 分割區不重疊的政策,並顯示所有政策
優先順序較高的政策在 priority
欄位中的數值較低。舉例來說,優先順序較高的政策是 priority: 10
,而非 priority: 20
。
以下各節提供不同分割區設定的政策範例。
已分割的 PF
部署下列兩個 SriovNetworkNodePolicy
資訊清單會產生兩個可用資源:gke.io/dev-kernel
和 gke.io/dev-vfio
。每個資源都有兩個不重疊的 VF。
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
spec:
deviceType: "netdevice"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#0-1
numVfs: 2
priority: 70
resourceName: "dev-kernel"
kind: SriovNetworkNodePolicy
metadata:
name: policy-2
spec:
deviceType: "vfio-pci"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#2-3
numVfs: 4
priority: 70
resourceName: "dev-vfio"
PF 分區重疊
部署下列兩個 SriovNetworkNodePolicy
資訊清單後,只會提供 gke.io/dev-vfio
資源。policy-1
VF 範圍為 0-2
,與 policy-2
重疊。由於命名方式,policy-2
會在 policy-1
之後處理。因此,只有 policy-2
、gke.io/dev-vfio
中指定的資源可用。
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
spec:
deviceType: "netdevice"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0
numVfs: 3
priority: 70
resourceName: "dev-kernel"
kind: SriovNetworkNodePolicy
metadata:
name: policy-2
spec:
deviceType: "vfio-pci"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#2-3
numVfs: 4
priority: 70
resourceName: "dev-vfio"
具有不同優先順序的非重疊 PF 分割
部署下列兩個 SriovNetworkNodePolicy
資訊清單會產生兩個可用資源:gke.io/dev-kernel
和 gke.io/dev-vfio
。每個資源都有兩個不重疊的 VF。即使 policy-1
的優先順序高於 policy-2
,由於 PF 分區不會重疊,我們會合併這兩項政策。
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
spec:
deviceType: "netdevice"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0
numVfs: 2
priority: 10
resourceName: "dev-kernel"
kind: SriovNetworkNodePolicy
metadata:
name: policy-2
spec:
deviceType: "vfio-pci"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#2-3
numVfs: 4
priority: 70
resourceName: "dev-vfio"
查看 SR-IOV 政策設定狀態
套用 SR-IOV 政策後,您可以在特定節點的 SriovNetworkNodeState
自訂資源中,追蹤及查看節點的最終設定。在 status
區段中,syncStatus
欄位代表設定精靈的目前階段。Succeeded
狀態表示設定已完成。SriovNetworkNodeState
自訂資源的 spec
區段會根據政策數量和優先順序,定義該節點的 VF 設定最終狀態。系統會在指定 PF 的 status
部分列出所有建立的 VF。
以下是 SriovNetworkNodeState
自訂資源的範例:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
name: worker-02
namespace: gke-operators
spec:
dpConfigVersion: "9022068"
interfaces:
- linkType: eth
name: enp1s0f0
numVfs: 2
pciAddress: "0000:01:00.0"
vfGroups:
- deviceType: netdevice
policyName: policy-1
resourceName: mlnx
vfRange: 0-1
status:
interfaces:
- Vfs:
- deviceID: "1016"
driver: mlx5_core
mac: 96:8b:39:d8:89:d2
mtu: 1500
name: enp1s0f0np0v0
pciAddress: "0000:01:00.2"
vendor: 15b3
vfID: 0
- deviceID: "1016"
driver: mlx5_core
mac: 82:8e:65:fe:9b:cb
mtu: 1500
name: enp1s0f0np0v1
pciAddress: "0000:01:00.3"
vendor: 15b3
vfID: 1
deviceID: "1015"
driver: mlx5_core
eSwitchMode: legacy
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9c
mtu: 1500
name: enp1s0f0
numVfs: 2
pciAddress: "0000:01:00.0"
totalvfs: 2
vendor: 15b3
- deviceID: "1015"
driver: mlx5_core
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9d
mtu: 1500
name: enp1s0f1
pciAddress: "0000:01:00.1"
totalvfs: 2
vendor: 15b3
syncStatus: Succeeded
建立NetworkAttachmentDefinition
自訂資源
在叢集上成功設定 VF 後,這些 VF 會在 Kubernetes 節點中顯示為資源,您必須建立參照該資源的 NetworkAttachmentDefinition
。使用 k8s.v1.cni.cncf.io/resourceName
註解建立參照。以下是參考 gke.io/mlnx
資源的 NetworkAttachmentDefinition
資訊清單範例:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-sriov-1
annotations:
k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx
spec:
config: '{
"cniVersion": "0.3.0",
"name": "mynetwork",
"type": "sriov",
"ipam": {
"type": "whereabouts",
"range": "21.0.108.0/21",
"range_start": "21.0.111.16",
"range_end": "21.0.111.18"
}
}'
NetworkAttachmentDefinition
必須將 sriov
設為 CNI 類型。在 Pod 中使用 k8s.v1.cni.cncf.io/networks
註解,參照任何已部署的 NetworkAttachmentDefinition
自訂資源。
以下範例說明如何在 Pod 中參照先前的 NetworkAttachmentDefinition
自訂資源:
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: gke-sriov-1
spec:
containers:
...
在工作負載中參照 NetworkAttachmentDefinition
自訂資源時,您不必擔心 Pod 的資源定義,也不必擔心在特定節點中的位置,系統會自動為您完成這些作業。
以下範例顯示具有 VLAN 設定的 NetworkAttachmentDefinition
自訂資源。在本範例中,每個 VF 都屬於 100
VLAN:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-sriov-vlan-100
annotations:
k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx
spec:
config: '{
"cniVersion": "0.3.0",
"name": "mynetwork",
"type": "sriov",
"vlan": 100,
"ipam": {
"type": "whereabouts",
"range": "21.0.100.0/21"
}
}'
其他資訊
以下各節提供相關資訊,協助您設定 SR-IOV 網路。
節點重新啟動
SR-IOV 運算子設定節點時,節點可能需要重新啟動。設定 VF 或核心時,可能需要重新啟動節點。核心設定包括在作業系統中啟用 SR-IOV 功能支援。
支援的網路介面卡
下表列出 1.32.x 版叢集支援的網路介面卡:
名稱 | 供應商 ID | 裝置 ID | VF 裝置 ID |
---|---|---|---|
Intel i40e XXV710 | 8086 | 158a | 154c |
Intel i40e 25G SFP28 | 8086 | 158b | 154c |
Intel i40e 10G X710 SFP | 8086 | 1572 | 154c |
Intel i40e XXV710 N3000 | 8086 | 0d58 | 154c |
Intel i40e 40G XL710 QSFP | 8086 | 1583 | 154c |
Intel ice Columbiaville E810-CQDA2 2CQDA2 | 8086 | 1592 | 1889 |
Intel ice Columbiaville E810-XXVDA4 | 8086 | 1593 | 1889 |
Intel ice Columbiaville E810-XXVDA2 | 8086 | 159b | 1889 |
Nvidia mlx5 ConnectX-4 | 15b3 | 1013 | 1014 |
Nvidia mlx5 ConnectX-4LX | 15b3 | 1015 | 1016 |
Nvidia mlx5 ConnectX-5 | 15b3 | 1017 | 1018 |
Nvidia mlx5 ConnectX-5 Ex | 15b3 | 1019 | 101a |
Nvidia mlx5 ConnectX-6 | 15b3 | 101b | 101c |
Nvidia mlx5 ConnectX-6_Dx | 15b3 | 101 天 | 101e |
Nvidia mlx5 MT42822 BlueField-2 整合式 ConnectX-6 Dx | 15b3 | a2d6 | 101e |
Broadcom bnxt BCM57414 2x25G | 14e4 | 16d7 | 16dc |
Broadcom bnxt BCM75508 2x100G | 14e4 | 1750 | 1806 |