前言
隨著虛擬技術的快速發展,使用Kubernetes虛擬叢集來提供服務的需求日益漸增,單一節點Pod之間的溝通網路頻寬速度則受限於主機CPU性能。
本篇文章介紹如何在Kubernetes上使用DPU結合SR-IOV技術讓Pod可以使用虛擬介面卡來將封包卸載到DPU上,藉此加速Pod網路速度並評測性能。
先決條件
- Open vSwitch 2.13 或以上版本
- iproute >= 4.12
- sriov-device-plugin
- multus-cni
- BlueField-2 ConnectX-6 Dx (DPU)
- ovn-kubernetes 映像:ghcr.io/ovn-org/ovn-kubernetes/ovn-kube-ubuntu-1.0
主機環境
控制平面節點
- 作業系統版本:Ubuntu 20.04.6 LTS
- Linux 核心版本:5.4.0-186-generic
- IP 地址:192.168.40.111/22
Worker-host 節點
- 作業系統版本:Ubuntu 22.04.2 LTS
- Linux 核心版本:5.15.0-112-generic
- IP 地址:192.168.42.201/22
- CPU: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
Worker-dpu 節點
- 作業系統版本:Ubuntu 22.04.3 LTS
- Linux 核心版本:5.15.0-1021-bluefield
- IP 地址:192.168.41.127/22
架構
在此環境中,有兩台電腦:一台是普通電腦,另一台裝有 BlueField-2 CX6 卡。
K8S 叢集
部署一個有三個節點的 K8S 叢集。
- 控制平面節點:普通電腦
- Worker-host 節點:Host 節點
- Worker-dpu 節點:DPU 節點
Master 節點
Master 節點應該具備基本的 K8S 元件,例如 K8S API 伺服器。OVN-Kubernetes 元件應部署如下:
- ovnkube-node(full mode):OVN-Kubernetes 節點代理。
注意:完整模式下不需要設置 OVNKUBE_NODE_MODE 參數。 - ovnkube-master:OVN-Kubernetes 主控器,它是與 OVN 的整合點,用來編程 OVN 以滿足 Kubernetes 的網路需求。
- ovnkube-db:一個 ovsdb,存儲 OVN (Open Virtual Network) 的北向 (NB) 和南向 (SB) 資料庫。
- ovs-node:在節點上運行的 Open vSwitch (OVS) 元件。
Worker-host 節點
- ovnkube-node (dpu-host 模式):OVN-Kubernetes 節點代理。
注意:dpu-host 模式需要設置 OVNKUBE_NODE_MODE 參數為 "dpu-host"。Worker-host 不應安裝 Open vSwitch (OVS),因為封包處理是由 DPU 的 eSwitch 處理的。
Worker-dpu 節點
- ovnkube-node (dpu 模式):OVN-Kubernetes 節點代理。
注意:dpu 模式需要設置 OVNKUBE_NODE_MODE 參數為 "dpu"。 - ovn-controller:OVN 節點代理,將來自 OVN South 資料庫的邏輯流轉換為 OVS 中的邏輯流。ovn-controller 被移至 DPU 中運行。
Worker-host SR-IOV 設定
- 檢查 NIC 支援的 VF 數量:
cat /sys/class/net/enp2s0f0np0/device/sriov_totalvfs 16 |
- 創建 VF:
echo '3' > /sys/class/net/enp2s0f0np0/device/sriov_numvfs |
- 驗證 VF 是否創建成功:
sudo ip link show enp2s0f |