注意:

使用 Multus CNI 設定 OKE 上的 Pod SR-IOV 介面

簡介

SR-IOV 是一項規格,可讓單一 PCIe 裝置顯示為多個獨立的實體 PCIe 裝置。SR-IOV 是藉由引入物理功能 (PF) 和虛擬功能 (VF) 的概念來運作。主機使用 PF,通常代表單一 NIC 連接埠。VF 是該 PF 的輕量型版本。藉由適當的支援,SR-IOV 會為實體硬體 (例如 SmartNIC) 提供一種方式,使其成為數種不同的 (網路介面) 裝置。有了容器,我們就可以將其中一個介面 (VF) 從主機移到容器或 Pod 的網路命名空間,讓容器現在可以直接存取介面。此方案的優點在於,我們無法藉由 virt-io 取得原生裝置效能,進而降低成本。

注意:本教學課程中描述的外掛程式和程序僅適用於裸機執行處理。若為虛擬機器型執行處理,則需要一組不同的 Plug-in 和組態。

目標

本教學課程描述如何為 OKE 叢集上執行的 Pod 設定次要 SR-IOV 虛擬功能型網路介面。它運用 SRIOV-CNI 外掛程式將 SR-IOV 虛擬功能管理為可以在節點上配置的資源,並使用 Multus 中繼 CNI 將其他網路介面增加至 Pod。

運作方式

此方法具有數個圖層和元件。Kubernetes 裝置 Plug-in 可管理一組虛擬函數,並將其發布為節點上可配置的資源。Pod 要求這類資源時,可以將 Pod 指定給可用資源的節點,SR-IOV CNI 可以將虛擬功能探測至 Pod 的網路命名空間中。CNI 中繼外掛程式 (例如 Multus) 會處理 Pod 的多個網路附件,因此 Pod 可以透過 SR-IOV 與覆疊網路進行通訊。

我們首先在具有 SR-IOV 功能的 smartNICs 上設定一些 VF,這些 VF 就會將它們本身呈現為個別的 NIC。接著,我們會將這些 VF 設定為 Oracle Cloud Infrastructure (OCI) 可以辨識的 MAC 位址。這些 VF 是在 Multus 之外建立的,可以是手動 (如本教學課程中所述),或是使用可以在建立節點時呼叫的程序檔。此時,我們的每個 VF 集區都會以個別的 NIC 和 OCI MAC 位址身分識別。Kubernetes 網路探測工作群組會維護一個特殊目的網路裝置外掛程式,可探索和發佈 VF 作為可配置的節點資源。SR-IOV CNI (也來自 Kubernetes 網路探測工作群組) 可與裝置外掛程式搭配運作,並根據 Pod 生命週期管理這些虛擬功能指定給 Pod。

現在,我們有一或多個節點具有 VF 集區,由 SR-IOV 裝置外掛程式辨識和管理為可配置的節點資源。Pod 可以要求這些檔案。SR-IOV CNI 將 VF 放入 Pod 建立時的 Pod 網路命名空間中,並釋出 Pod 刪除上的 VF (將它移回根命名空間)。這樣可以為另一個 Pod 配置 VF。像是 Multus 的中繼外掛程式可向 CNI 提供 VF 資訊,並管理 Pod 上的多個網路附件。

多用途 Pod 影像

作業 1:設定主機

我們從裸機主機開始,您可以在此為 PCIe 介面設定 VF。使用裸機主機時,請執行下列步驟。

  1. 建立 VF:透過 SSH 登入裸機節點。尋找實體裝置並將虛擬功能新增至實體裝置。

    注意:只有自動化需要取得裝置名稱的命令檔。

    此處的範例會在裝置上建立兩個 VF。

    # Gets the physical device. Alterntively, just run `ip addr show` and look at the primary iface to set $PHYSDEV
    URL=http://169.254.169.254/opc/v1/vnics/
    baseAddress=`curl -s ${URL} | jq -r '.[0] | .privateIp'`
    PHYSDEV=`ip -o -4 addr show | grep ${baseAddress} | awk -F: '{gsub(/^[ \t]|[ \t]$/,"",$2);split($2,out,/[ \t]+/);print out[1]}'`
    
    # Add two VFs
    echo "2" > /sys/class/net/${PHYSDEV}/device/sriov_numvfs
    
    # Verify the VFs
    ip link show ${PHYSDEV}
    
  2. 將 OCI MAC 位址指定給 VF。

    這些 VF 現在將會有自動產生的 MAC 位址 (或 000)。我們必須為 OCI 網路允許的這些流量設定 OCI MAC 位址。在主機上建立與所建立 VF 數目相同的 VNIC 連附項。請注意每個 VNIC 連附的 MAC 位址。現在,我們指派了 OCI 認可我們建立的 VFS 的每個 MAC 位址。

    # For each MAC address from the VNIC attachments
    
    ip link set ${PHYSDEV} vf <n= 0..numVFs> mac <MAC Address from VNIC attachment> spoofchk off
    
    # verify all VFs have Mac addresses from OCI
    ip link show ${PHYSDEV}
    
    

這樣就應該是自動完成的主機設定,因為每部主機都需要將 SR-IOV 網路資源提供給 Pod。

作業 2:安裝 SR-IOV CNI

此 CNI 可以安裝在 1.16+ 叢集上作為常駐程式集。沒有 SR-IOV 裝置的節點會由裝置外掛程式本身正常處理。

git clone https://github.com/k8snetworkplumbingwg/sriov-cni.git && cd sriov-cni
kubectl apply -f images/k8s-v1.16/sriov-cni-daemonset.yaml && cd..

作業 3:安裝 SR-IOV 網路裝置外掛程式

注意:裝置外掛程式不會即時建立 VF,必須個別建立 VF。

裝置 Plug-in 會尋找並宣告節點上具備 SR-IOV 功能的網路裝置。為了達成此目的,裝置 Plug-in 需要能夠建立裝置 Plug-in 端點的組態。組態會識別所使用的裝置和驅動程式。

  1. 建立 SR-IOV 資源集區的 ConfigMap。若要設定 ConfigMap,我們需要知道裝置使用的供應商 ID、裝置 ID 和驅動程式。

    1. 若要尋找供應商 ID 和裝置 ID:

      lspci -nn|grep Virtual
      
      31:02.0 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme-E Ethernet Virtual Function [14e4:16dc]
      31:02.1 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme-E Ethernet Virtual Function [14e4:16dc]
      
      
    2. 在上述範例中,我們有兩個 VF,而最後一個位元的資訊可為我們提供供應商 ID (14e4) 和裝置 ID (16dc)。我們可以和 lspci 使用的 hwdata 交叉檢查此項目。

      cat /usr/share/hwdata/pci.ids|grep 16dc
      
    3. 若要尋找使用的驅動程式:

      # filtering based on the PCIe slots.
      find /sys | grep drivers.*31:02.0|awk -F/ '{print $6}'
      
      bnxt_en
      
      
  2. 設定 ConfigMap。ConfigMap 必須命名為 sriovdp-config,且必須具有金鑰 config.json

    cat << EOF > sriovdp-config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: sriovdp-config
      namespace: kube-system
    data:
      config.json: |
        {
          "resourceList": [{
                  "resourceName": "mlnx_sriov_rdma",
                  "resourcePrefix": "mellanox.com",
                  "selectors": {
                    "vendors": ["15b3"],
                    "devices": ["101e"],
                    "drivers": ["mlx5_core"],
                    "isRdma": false
                  }
              },
              {
                  "resourceName": "netxtreme_sriov_rdma",
                  "resourcePrefix": "broadcom.com",
                  "selectors": {
                    "vendors": ["14e4"],
                    "devices": ["16dc"],
                    "drivers": ["bnxt_en"],
                    "isRdma": false
                  }
              }
          ]
        }
    EOF
    
    kubectl create -f sriovdp-config.yaml
    
    
  3. 設定裝置 Plug-in。在建立配置對映後,裝置外掛程式可以安裝為常駐程式集。

    git clone https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin.git && cd sriov-network-device-plugin
    kubectl create -f deployments/k8s-v1.16/sriovdp-daemonset.yaml && cd ..
    
  4. 部署常駐程式之後,您可以查看容器日誌以進行疑難排解。成功部署之後,節點應該將虛擬函數列為可配置的資源。

    kubectl get node <node_name> -o json | jq '.status.allocatable'
    
    {
      "broadcom.com/netxtreme_sriov_rdma": "2",
      "cpu": "128",
      "ephemeral-storage": "37070025462",
      "hugepages-1Gi": "0",
      "hugepages-2Mi": "0",
      "memory": "527632840Ki",
      "pods": "110"
    }
    

作業 4:安裝中繼外掛程式 CNI (多重)

Multus 是一種中繼外掛程式,它可以將 VF 資訊提供給下游 CNI (例如 SR-IOV CNI 外掛程式),以處理網路資源探測,同時啟用具有多個網路介面的「多址」Pod 或 Pod。

  1. 安裝多重使用者:

    git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni
    kubectl apply -f images/multus-daemonset.yml && cd ..
    

    注意

    • 標記為 stable 的常駐程式集所使用的預設影像需要 kubelet 為 v1.20.x。若在較舊的叢集上安裝,請編輯清單中的子集,然後使用多重使用者影像標記 v3.7.1

    • 此清單會為 kind:NetworkAttachmentDefinition 建立新的 CRD,並透過常駐程式在所有節點上提供多重二進位檔。

  2. 若要將其他介面連附至 Pod,必須設定介面的組態。此封裝在 NetworkAttachmentDefinition 類型的自訂資源中。此組態基本上是封裝成自訂資源的 CNI 組態。

    讓我們設定範例 NetworkAttachmentDefinition

    cat << EOF > sriov-net1.yaml
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: sriov-net1
      annotations:
        k8s.v1.cni.cncf.io/resourceName: broadcom.com/netxtreme_sriov_rdma
    spec:
      config: '{
      "type": "sriov",
      "cniVersion": "0.3.1",
      "name": "sriov-network",
      "ipam": {
        "type": "host-local",
        "subnet": "10.20.30.0/25",
        "routes": [{
          "dst": "0.0.0.0/0"
        }],
        "gateway": "10.20.10.1"
      }
    }'
    EOF
    
    kubectl apply -f sriov-net1.yaml
    
    

作業 5:使用多個介面部署及測試 Pod

確認書

其他學習資源

探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。

如需產品文件,請造訪 Oracle Help Center