注意:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代為您雲端環境特定的值。
使用多用途的 VM 型 Oracle Container Engine for Kubernetes 節點設定 Pod 的 SR-IOV 介面
簡介
當網路導向工作負載需要在 Pod 內設定次要網路介面時,我們可以使用像是 Multus 這樣的描述資料 CNI 來達到此目的。這些情況下通常連接的次要網路介面將具有特殊化的網路功能或特性,例如單一根 IO 虛擬化 (SR-IOV)。
在教學課程中:使用多部裸機 OKE 節點設定 Pod 的 SR-IOV 介面 (您可以從「相關連結」區段存取連結),其中涵蓋如何在 Oracle Cloud Infrastructure (OCI) 上的裸機 Kubernetes 節點上達成此目的,您可以直接在已連附至裸機執行處理的硬體上建立虛擬功能 (VF)。
本教學課程遵循 Oracle Container Engine for Kubernetes (OKE) 叢集中虛擬機器節點的相似方法,在裸機節點上使用的組態和外掛程式採用相似的方法。在裸機之間建立和管理介面有很大的差異,因為您完全掌控虛擬機器的硬體和虛擬機器,而虛擬機器管理程式會抽象您對基礎硬體的存取,而且您並沒有控制權。
此處描述的方法使用 Multus 為 Pod 提供多個介面,但不會使用 SR-IOV CNI 和相關的裝置外掛程式。這是因為 SR-IOV CNI 要求存取底層的硬體 (PF),這很顯然會對虛擬機器構成挑戰。為了克服此挑戰,我們可以使用 VNIC 的 OCI 網路 API 在實體功能 (PF) 上建立虛擬功能 (VF),例如裸機情況,然後提供 VM 直接和非結構化對此 VF 的存取。這些 VF 可以連附至運算執行處理 (包括 OKE 節點) 作為網路介面。這些介面 /VF 可以移至 Pod 的網路名稱空間,讓 Pod 可以直接使用該 VF 作為網路介面。從 Pod 的角度來看,它無法區別兩者,而且在兩種情況下都可以存取可以直接使用的 VF。
若要讓 VM 直接存取 VF,我們需要以 VFIO 網路連附模式啟動 VM,而非預設的半虛擬化模式。此選擇由運算執行處理的啟動模式控制。將網路連附模式設為 VFIO 之後,我們便可以使用 OCI API 建立網路連附項,此 API 會在基礎 PF 上建立 VF,並直接將 VF 提供給 VM。主機上的作業系統會將這些識別為網路介面。VM 可使用 VF 之後,即可將它移到 Pod 名稱空間。在此模型中,VF 是使用 OCI API 建立的,而非使用裸機案例中的系統指令。

目標
使用多用途的 VM 型 Oracle Container Engine for Kubernetes 節點設定 Pod 的 SR-IOV 介面。
必要條件
- OKE 叢集具有至少包含兩個 VM 的節點集區。
注意:此教學課程已在具有 Flannel 網路的 OKE 叢集上驗證 (Flannel 作為主要 CNI)。
作業 1:設定節點
每個需要存取 SR-IOV 介面的節點都必須先備妥硬體輔助的網路附件,才能被 Pod 使用。
-
以 VFIO 模式啟動節點
-
在叢集中建立節點集區與一組節點。
-
建立節點之後,請編輯執行處理特性。

-
在執行處理特性上,按一下顯示進階選項以檢視其他特性。在 [ 啟動選項 ] 標籤中,選擇 [ 網路類型 ] 的 [ 硬體輔助 (SR-IOV) 網路 ]。

注意:一旦將執行處理的半虛擬化網路連附項切換成硬體輔助 (SR-IOV 或 VFIO) 模式,就無法再進行基礎架構維護。
-
更新工作流程將會提示您重新啟動執行處理。重新啟動執行處理之後,將會有 VFIO 網路連附項。這可在主控台上驗證。

-
另一個確認執行處理是否使用 SR-IOV 網路連附項的方法是將 SSH 連線至節點,並使用
lspci列出 VM 上的 PCI 裝置。您應該能夠像使用virtio驅動程式的裝置一樣,直接在 VM 上看到底層的虛擬功能 (例如下方影像中的儲存控制器)。
-
此時,節點會有一個 VNIC 連附項,這是用於對節點進行所有通訊的主要 VNIC。由於執行處理使用硬體輔助的網路連附項,因此節點可以看到該網路連附作為基礎硬體上的虛擬功能。為了 Pod 獨佔使用虛擬功能 (VF),我們在 VM 上需要額外的 VF。您可以使用主控台或 API 將額外的 VNIC 連附項新增至執行處理。這些 VNIC 附件是基礎 PF 上的 VF。可使用
lspci進行驗證。
-
-
新增其他 VNIC 連附項
-
從執行處理頁面選擇連附的 VNIC ,然後按一下建立 VNIC 。

-
使用所需的 VCN 和子網路來設定 VNIC。

-
檢查主機上是否可以像以前一樣,透過節點上的 SSH 連線並執行
lspci一樣,查看 VNIC。
-
當您將次要 VNIC 新增至 Linux VM 執行處理時,新的介面 (亦即乙太網路裝置) 會新增至執行處理,並自動被作業系統辨識。不過,次要 VNIC 未啟用 DHCP,您必須使用靜態 IP 位址和預設路由來配置介面。
-
-
設定次要 VNIC 的作業系統
-
OCI 提供文件和命令檔,以便為次要 VNIC 設定作業系統。若要設定次要 VNIC,請下載節點上的命令檔,然後根據 OCI 文件中提供的指示執行。
Note: The secondary VNICs on each node must be set up by repeating these steps for each node. These steps can be optionally and automated using a custom
cloud_initscript for the nodes. -
使用介面的 IP 位址和預設路由驗證介面是否已連線。若要檢查,請使用
ip addr或nmcli指令。
-
(選擇性) 使用 ping 來確認路由,以相互連線次要 IP 位址。在下方影像中,
10.0.10.238是叢集中第二個節點上的次要 IP。

-
作業 2:安裝 Meta-Plugin CNI (多重)
Multus 是一種中繼外掛程式,它可以將 VF 資訊提供給下游 CNI (例如 SR-IOV CNI 外掛程式),以處理網路資源探測,同時啟用具有多個網路介面的「多址」Pod 或 Pod。
注意:Multus 4.0 之後,Multus 推出名為「複雜外掛程式」的新用戶端伺服器樣式部署。新的厚重 Plug-in 支援其他功能,例如先前不支援的度量。本文件使用 'thin' 外掛程式,因為它使用較少的資源。
-
若要安裝 Multus,請執行下列指令。
git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni kubectl apply -f deployments/multus-daemonset.yml && cd ..
注意:安裝時,標記為
stable的常駐程式集所使用的預設影像需要 kubelet 為 v1.20.x。若在較舊的叢集上安裝,請編輯清單中的子集,然後使用多重使用者影像標記v3.7.1。
此清單會為 kind:NetworkAttachmentDefinition 建立新的 CRD,並透過常駐程式在所有節點上提供 Multus 二進位檔。您可以確保在您的節點上執行 Multus daemonset,確認安裝。
作業 3:將多個介面附加至 Pod
-
若要將其他介面附加至 Pod,必須要有介面的組態才能連附。此封裝在
NetworkAttachmentDefinition類型的自訂資源中。此組態基本上是封裝成自訂資源的 CNI 組態。 -
數個 CNI 外掛程式可以與「多重」一起使用以完成此作業。在此所述的方法中,我們的目標是專門為單一 Pod 提供 SR-IOV 虛擬功能,這樣 Pod 便可以利用功能,而不會干擾或間的任何層。若要將專用存取權限授予 VF,我們可以利用 host-device plug-in ,讓介面移至 Pod 的命名空間,使其能夠獨佔存取該 VF。
-
以下範例顯示設定新增至節點之次要
ens5介面的NetworkAttachmentDefinition物件。ipam外掛程式配置會決定如何管理這些介面的 IP 位址。在此範例中,由於我們想要使用 OCI 指派給次要介面的相同 IP 位址,因此會將靜態ipam組態與適當的路由搭配使用。ipam組態也支援其他方法,例如host-local或dhcp,以進行更彈性的組態設定。## network attachment for the first node. Note the IPaddress assignment in the `ipam` configuration. cat << EOF | kubectl create -f - apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-1 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.10.93/24", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.10.0/24", "gw": "0.0.0.0" } ] } }' EOF ## network attachment for the second node. Note the IPaddress assignment in the `ipam` configuration. cat << EOF | kubectl create -f - apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-2 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.10.238/24", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.10.0/24", "gw": "0.0.0.0" } ] } }' EOF
作業 4:部署具有多重介面與測試的 Pod
Pod 現在可以使用註解來要求其他介面。此註解可讓 meta-plug-in (Multus) 瞭解在建立 Pod 時用來提供其他介面的 NetworkAttachmentDefinition (CNI 組態)。
注意:使用像本範例所示的靜態組態時,Pod 必須設定節點相關性,因此 Pod 會排定在可使用所需主機裝置的節點上。
-
以下為測試 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-vnic-1 spec: containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ] 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-vnic spec: containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ] EOF -
建立兩個 Pod 時,應該會看到兩者都在執行中。建立 Pod 時,應該會建立額外的網路介面。多重使用者將提供預設 CNI (此範例中的 Flannel) 所支援的
eth0介面,以及 SR-IOV 虛擬函數的其他net1介面。您可以describePod 並觀察輸出的事件區段,以查看各種事件,包括要連附至 Pod 的介面。
-
開始 Pod 之後,就可以快速進行測試。
## Verify that both pods have two interfaces. An `eth0` on the overlay and a `net1` which is the VF, along with the IP address for the secondary VNIC. kubectl exec -it testpod1 -- ip addr show kubectl exec -it testpod2 -- ip addr show -
執行結果應該和下列影像類似。


-
我們也可以驗證這兩個 Pod 之間的通訊,通過這些次要介面。
## test communication kubectl exec -it testpod1 -- ping -I net1 <ip address for secondary vnic on the other pod/node> kubectl exec -it testpod2 -- ping -I net1 <ip address for secondary vnic on the other pod/node> -
執行結果應該和下列影像類似。


-
我們也可以透過嘗試從 VM 或 VCN 中的任何其他來源連線到 Pod,驗證 Pod 是否可路由與其網路連附項。
## Test that the pod is routable from outside Kubernetes. This is executed from node1. ping 10.0.10.238 ## similarly, from node 2 ping 10.0.10.93 -
執行結果應該如下影像所示。


相關連結
確認
- 作者 - 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 using Multus for VM-based Oracle Container Engine for Kubernetes nodes
F80585-01
May 2023
Copyright © 2023, Oracle and/or its affiliates.