注意:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代為您雲端環境特定的值。
使用 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 上的多個網路附件。

作業 1:設定主機
我們從裸機主機開始,您可以在此為 PCIe 介面設定 VF。使用裸機主機時,請執行下列步驟。
-
建立 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} -
將 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 端點的組態。組態會識別所使用的裝置和驅動程式。
-
建立 SR-IOV 資源集區的 ConfigMap。若要設定 ConfigMap,我們需要知道裝置使用的供應商 ID、裝置 ID 和驅動程式。
-
若要尋找供應商 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] -
在上述範例中,我們有兩個 VF,而最後一個位元的資訊可為我們提供供應商 ID (
14e4) 和裝置 ID (16dc)。我們可以和lspci使用的 hwdata 交叉檢查此項目。cat /usr/share/hwdata/pci.ids|grep 16dc -
若要尋找使用的驅動程式:
# filtering based on the PCIe slots. find /sys | grep drivers.*31:02.0|awk -F/ '{print $6}' bnxt_en
-
-
設定 ConfigMap。ConfigMap 必須命名為
sriovdp-config,且必須具有金鑰config.jsoncat << 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 -
設定裝置 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 .. -
部署常駐程式之後,您可以查看容器日誌以進行疑難排解。成功部署之後,節點應該將虛擬函數列為可配置的資源。
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。
-
安裝多重使用者:
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,並透過常駐程式在所有節點上提供多重二進位檔。
-
-
若要將其他介面連附至 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
-
Pod 現在可以使用註解和資源要求來要求其他介面。資源要求將協助排程器根據節點的 VF 可用性指定 Pod,而且註解可讓描述 Plug-in (Multus) 瞭解要使用哪一個
NetworkAttachmentDefinition(CNI 組態)。以下為測試 Pod 的範例:
## Create the first pod cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: testpod1 annotations: k8s.v1.cni.cncf.io/networks: sriov-net1 spec: containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ] resources: requests: broadcom.com/netxtreme_sriov_rdma: '1' limits: broadcom.com/netxtreme_sriov_rdma: '1' EOF ## Create a second pod cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: testpod2 annotations: k8s.v1.cni.cncf.io/networks: sriov-net1 spec: containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ] resources: requests: broadcom.com/netxtreme_sriov_rdma: '1' limits: broadcom.com/netxtreme_sriov_rdma: '1' EOF -
建立兩個 Pod 時,應該會看到兩者都在執行中。快速測試:
## Verify that both pods have two interfaces. An `eth0` on the overlay and a `net1` which is the VF. kubectl exec -it testpod1 -- ip addr show kubectl exec -it testpod2 -- ip addr show ## Checkout the routes kubectl exec -it testpod1 -- route -n kubectl exec -it testpod2 -- route -n ## test communication kubectl exec -it testpod1 -- ping <IP for net1 on pod2>
相關連結
確認書
- 作者 - Jeevan Joseph,首席產品經理
其他學習資源
探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。
如需產品文件,請造訪 Oracle Help Center 。
Configure SR-IOV interfaces for pods on OKE using Multus CNI
F75772-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.