設定 SR-IOV 網路

本文說明如何為 Google Distributed Cloud 設定單一根目錄輸入/輸出虛擬化 (SR-IOV) 網路。SR-IOV 提供 I/O 虛擬化功能,可將網路介面卡 (NIC) 設為 Linux 核心中的網路裝置。您可以管理網路連線,並將其指派給 Pod。封包直接在 NIC 和 Pod 之間移動,因此效能有所提升。

如果需要快速連線至 Pod 工作負載,請使用這項功能。Google Distributed Cloud 的 SR-IOV 可讓您在叢集節點的支援裝置上設定虛擬函式 (VF)。您也可以指定要繫結至 VF 的特定核心模組。

這項功能適用於執行工作負載的叢集,例如混合式獨立使用者叢集。叢集至少要有兩個節點,才能使用 SR-IOV 網路功能。

設定程序大致包含下列步驟:

  1. 設定叢集,啟用 SR-IOV 網路。
  2. 設定 SR-IOV 運算子,這是一項SriovOperatorConfig自訂資源。
  3. 設定 SR-IOV 政策並設定 VF。
  4. 建立參照 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 政策的優先順序邏輯:

  1. 只有在 PF 分割區重疊時,優先順序較高的政策才會覆寫優先順序較低的政策。

  2. 合併優先順序相同的政策:

    1. 政策會依名稱排序,並依序處理
    2. 如果政策的 PF 分割區重疊,系統會覆寫政策
    3. 系統會合併 PF 分割區不重疊的政策,並顯示所有政策

優先順序較高的政策在 priority 欄位中的數值較低。舉例來說,優先順序較高的政策是 priority: 10,而非 priority: 20

以下各節提供不同分割區設定的政策範例。

已分割的 PF

部署下列兩個 SriovNetworkNodePolicy 資訊清單會產生兩個可用資源:gke.io/dev-kernelgke.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-2gke.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-kernelgke.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