eRDMA(Elastic Remote Direct Memory Access)是一種高效能網路通訊技術,將eRDMA功能引入容器(Docker)環境可以實現容器應用程式繞過作業系統核心直接存取主機的物理eRDMA裝置,從而提供更快的資料轉送和通訊效率,適用於在容器中需要大規模資料轉送和高效能網路通訊的應用情境。本文主要介紹如何在容器(Docker)中配置eRDMA,以及在自建k8s叢集上如何使用eRDMA Controller組件在k8s pod上快速配置eRDMA。
使用限制
目前僅支援在以下Docker鏡像中使用eRDMA功能。
Alibaba Cloud Linux 3/Ubuntu 22.04/24.04的鏡像源(ARM和x86執行個體均支援)
Alibaba Cloud Linux 2/CentOS 7/CentOS 8/Ubuntu 18.04/Ubuntu 20.04/24.04的鏡像源(僅x86執行個體支援)
暫不支援Anolis OS的鏡像源。
實現原理
在容器環境中使用eRDMA功能時,使用Docker的--device選項將/dev/infiniband/rdma_cm和/dev/infiniband/uverbsX兩個字元裝置映射到容器中,這樣容器內的使用者態程式就可以繞過作業系統核心直接存取eRDMA裝置進行資料的收發。
/dev/infiniband/rdma_cm:用於eRDMA串連管理的字元裝置。使用者態程式可以通過對這個字元裝置的操作,與eRDMA裝置進行串連的建立、銷毀和管理,包括建立和銷毀串連、發送和接收串連事件等操作。/dev/infiniband/uverbsX:用於使用者空間eRDMA操作的字元裝置。使用者態程式可以通過對這個字元裝置的操作,與eRDMA裝置進行通訊,包括開啟裝置、建立和銷毀eRDMA通訊端點、註冊和登出記憶體緩衝區等操作。說明/dev/infiniband/uverbsX中的X是裝置的索引號,可能會因系統和配置而異,您可以運行ls /dev/infiniband | grep uverbs命令查看字元裝置名稱。
在Docker容器中配置eRDMA
步驟一:為執行個體配置eRDMA
確認Docker所在執行個體的執行個體規格支援eRDMA、已綁定彈性RDMA網卡、已部署eRDMA驅動程式,同時eRDMA裝置工作正常。
企業級CPU執行個體:請參見在企業級執行個體上啟用eRDMA。
GPU執行個體:請參見在GPU執行個體上啟用eRDMA。
步驟二:(可選)為執行個體部署Docker
如果您的執行個體尚未部署Docker相關環境,無法使用Docker,您需要先在執行個體中安裝Docker。
具體操作如下所示:
遠端連線執行個體。
具體操作,請參見使用Workbench登入Linux執行個體。
執行以下命令,確認執行個體是否已部署Docker環境。
sudo docker -v如果Docker已正確部署,則輸出具體版本號碼,如下所示:

如果Docker尚未部署或出現異常,則可能出現如下執行結果,請您參考為執行個體部署Docker。

為執行個體部署Docker。
步驟三:(可選)為Docker部署鏡像
如果您的Docker環境尚未部署任何鏡像,您可以根據實際應用需求,部署對應的鏡像。
本文以Alibaba Cloud Linux基礎鏡像為例,在Docker中下載Alibaba Cloud Linux鏡像(需要開通公網)。
具體操作如下所示:
執行以下命令,下載Alibaba Cloud Linux的Docker鏡像。
sudo docker pull alibaba-cloud-linux-<image_version>-registry.<region_ID>.cr.aliyuncs.com/alinux<image_version>/alinux<image_version>:<TAG><image_version>:Alibaba Cloud Linux的版本,例如2或3。<region_ID>:Docker鏡像所在的地區,例如cn-hangzhou。(可選)
<TAG>:Docker鏡像的版本。如果填寫,表示下載指定版本的鏡像。如果不填,預設下載最新版本的鏡像。
樣本命令如下:
在杭州地區下載220901.1版本的Alibaba Cloud Linux 3 Docker鏡像
sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1在杭州地區下載最新版本的Alibaba Cloud Linux 2 Docker鏡像
sudo docker pull alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2
執行以下命令,查看鏡像是否下載成功。
sudo docker images樣本結果如下,表示已成功下載220901.1版本的Alibaba Cloud Linux 3 Docker鏡像和最新版本的Alibaba Cloud Linux 2 Docker鏡像。

步驟四:啟動容器並掛載eRDMA裝置
使用Docker的--device選項將/dev/infiniband/rdma_cm和/dev/infiniband/uverbsX兩個字元裝置映射到容器中,這樣容器內的使用者態程式就可以繞過作業系統核心直接存取eRDMA裝置進行資料的收發。詳細資料,請參見實現原理。
具體操作如下所示:
遠端連線ECS執行個體。
具體操作,請參見使用Workbench登入Linux執行個體。
執行以下命令,啟動一個Docker容器執行個體並將eRDMA對應的字元裝置映射到容器中。
sudo docker run --net=host --device=/dev/infiniband/uverbsX --device=/dev/infiniband/rdma_cm --ulimit memlock=-1 -t -i <IMAGE ID> /bin/bash參數說明如下:
--net=host:配置容器的通訊模式為host。容器內的應用程式可以直接使用主機的網路介面和網路設定,從而實現與主機相同的網路通訊能力。--device=/dev/infiniband/uverbsX和--device=/dev/infiniband/rdma_cm:將eRDMA對應的使用者態字元裝置暴露到容器中。執行以下命令,查看字元裝置名稱(
uverbsX中的X):ls /dev/infiniband | grep uverbs
--ulimit memlock=-1:將maxlockedmemory設定為unlimited表示不限制非root使用者鎖定記憶體的數量。這可以確保eRDMA應用程式在非root使用者下能夠鎖定所需的記憶體量,從而有效地使用eRDMA功能。<IMAGE ID>:請根據實際環境填寫Docker鏡像的鏡像ID,可以通過sudo docker images命令查看。執行以下命令,查看目標鏡像ID:
sudo docker images本樣本中,以步驟三中部署的Alibaba Cloud Linux鏡像為例,執行結果如下:

步驟五:為Docker容器部署eRDMA驅動程式套件
在容器內使用eRDMA還需要部署eRDMA的使用者態驅動程式套件,否則在容器內部無法識別eRDMA裝置資訊。阿里雲提供了yum、apt源,用於便捷部署相應的程式包。
具體操作如下所示:
遠端連線執行個體。
具體操作,請參見使用Workbench登入Linux執行個體。
進入目標容器內部。
如果您按照本文樣本執行了步驟四的命令,那麼已經直接進入Docker容器內部,直接在容器內安裝使用者態驅動包。
執行以下命令,查看目標容器ID。
sudo docker ps本樣本中以步驟四中啟動的容器為例,執行結果如下所示:

執行以下命令,進入容器內部。
sudo docker exec -it <CONTAINER ID> /bin/bash將CONTAINER ID替換為上一步您實際查詢的目標容器ID。
進入容器內部後,在容器內安裝使用者態驅動程式套件。
重要以下操作樣本中,http://mirrors.cloud.aliyuncs.com表示內網源地址,如果您需要公網訪問,需要將http://mirrors.cloud.aliyuncs.com替換為https://mirrors.aliyun.com。使用公網會產生公網流量,進而可能產生額外費用。有關公網的計費規則,請參見公網頻寬計費。
CentOS 7/CentOS 8
在容器中運行以下命令,在
/etc/yum.repos.d目錄中建立一個erdma.repo源檔案。sudo vim /etc/yum.repos.d/erdma.repo在
erdma.repo檔案中添加如下內容,然後儲存退出。[erdma] name = ERDMA Repository baseurl = http://mirrors.cloud.aliyuncs.com/erdma/yum/redhat/$releasever/erdma/$basearch/ gpgcheck = 1 enabled = 1 gpgkey = http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY運行以下命令,更新yum源緩衝。
sudo yum makecache運行以下命令,安裝使用者態驅動包。
sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
Alibaba Cloud Linux
在容器中運行以下命令,添加repo倉庫。
sudo yum-config-manager \ --add-repo \ http://mirrors.cloud.aliyuncs.com/erdma/yum/alinux/erdma.repo說明如果您的容器中沒有安裝
yum-config-manager命令,請先運行sudo yum install -y yum-utils命令安裝yum-utils包。yum-config-manager是yum-utils包的一部分,用於管理yum配置。運行以下命令,更新yum源緩衝。
sudo yum makecache運行以下命令,安裝使用者態驅動包。
sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
Ubuntu 18.04/20.04/22.04/24.04
在容器中運行以下命令,添加PGP簽名。
Ubuntu 18.04/Ubuntu 20.04
wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo apt-key add -Ubuntu 22.04/24.04
wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg
運行以下命令,添加apt源。
Ubuntu 18.04
echo "deb [ arch=amd64 ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu bionic/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.listUbuntu 20.04
echo "deb [ arch=amd64 ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu focal/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.listUbuntu 22.04
echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu jammy/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.listUbuntu 24.04
echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu noble/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
運行以下命令,更新apt源。
sudo apt update運行以下命令,安裝使用者態驅動。
sudo apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 -y
執行以下命令,在容器內部查看eRDMA裝置資訊。
ibv_devinfo
可以看到在容器內部,已經可以正常識別eRDMA裝置。
Docker容器內配置eRDMA完成後,您可以通過SMC-R或者NetACC將eRDMA整合到容器內部的TCP應用中,實現應用加速。詳細資料,請參見應用適配概述。
在自建k8s叢集上使用eRDMA Controller部署eRDMA pod
步驟一:安裝eRDMA Controller
在master節點執行以下命令,安裝helm工具。
該工具用於管理eRDMA Controller相關組件的安裝和卸載。安裝後通過
helm version驗證是否成功安裝curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.s執行以下命令,在master節點上下載eRDMA Controller源碼。
git clone https://github.com/AliyunContainerService/alibabacloud-erdma-controller.giteRDMA Controller的安裝設定檔是
deployment/helm/values.yaml。通過修改此檔案可以選擇工作模式並配置相關參數。支援兩種工作模式:常規模式 (Regular Mode):適用於需要eRDMA Controller自動管理ERI (Elastic RDMA Interface),並實現eRDMA資源動態分配的情境。
本地模式 (Local Mode):適用於在k8s節點上已經完成eRDMA環境準備,並將eRDMA裝置暴露給Pod的情境。不涉及eRDMA資源的動態管理。
配置項說明:
localERIDiscovery:設定Controller的工作模式。true:本地模式。false:常規模式(預設)。
credentials: 在常規模式下,Controller需要訪問阿里雲API來查詢和配置ECS執行個體及彈性網卡。因此,需先建立 RAM 角色並授予要求的權限。目前支援AccessKey認證。將
type設為access_key,並填入AccessKey ID 和Secret。credentials: type: "access_key" accessKeyID: "{access key}" accessKeySecret: "{access key secret}"本地模式無需配置此項。
preferDriver: 設定節點使用的eRDMA驅動類型。default:預設驅動模式。compat:相容RoCE驅動模式。ofed:基於OFED的驅動模式,適用於GPU機型。
allocateAllDevices: 設定常規模式下的裝置分配策略。true:為Pod分配節點上的所有eRDMA裝置。false:根據NUMA拓撲為Pod分配一個eRDMA裝置。
exposedLocalERIs: 設定本地模式下節點需暴露給Pod的eRDMA裝置。配置格式見樣本。exposedLocalERIs: - i-XXX erdma_0/erdma_1 # specify instance ID and erdma devices(erdma_0/erdma_1) to expose - i-* erdma_0 # specify erdma devices(erdma_0) to expose for all unspecified nodes - i-* erdma_* # expose all existing erdma devices for all unspecified nodes鏡像配置:預設的
erdma-agent鏡像(registry.aliyuncs.com/erdma/agent)不支援本地模式。若要使用本地模式,需自行構建agent鏡像,並將其推送至自訂鏡像倉庫。執行以下命令構建並推送鏡像。樣本使用阿里雲Container Registry (ACR),需提前建立命名空間和鏡像倉庫。
docker build --tag <REGISTRY_NAME>-registry.<REGION_ID>.cr.aliyuncs.com/<NAMESPACE>/agent:<TAG> --target agent . docker push <REGISTRY_NAME>-registry.<REGION_ID>.cr.aliyuncs.com/<NAMESPACE>/agent:<TAG>
使用
helm安裝erdma-controller組件。helm install -f deploy/helm/values.yaml --namespace kube-system alibaba-erdma-controller deploy/helm/驗證安裝。
常規模式安裝完成後,驗證
erdma-agent和erdma-controllerPod 是否已成功建立:kubectl get pods -n kube-system | grep erdma查詢節點上的 eRDMA 裝置資源:
kubectl get erdmadevices在本地模式下,系統僅建立
erdma-agentPod,不會建立erdma-controllerPod,因此erdmadevices資源不可用。
步驟二:建立支援eRDMA網路加速的pod
要建立支援eRDMA網路加速的pod,需在容器的
resources.limits中聲明aliyun/erdma: 1。可依照如下樣本,需要將<ERDMA_POD_IMAGE>替換為實際使用的容器鏡像地址:apiVersion: apps/v1 kind: Deployment metadata: labels: app: erdma name: erdma spec: replicas: 1 selector: matchLabels: app: erdma template: metadata: labels: app: erdma annotations: spec: containers: - command: - sleep - "360000" image: <ERDMA_POD_IMAGE> name: erdma resources: limits: aliyun/erdma: 1如果要開啟SMC-R透明加速,在annotations中配置
network.alibabacloud.com/erdma-smcr: "true"。此功能要求作業系統為Alibaba Cloud Linux 3,其核心版本不低於 5.10.134-17。基於上述設定檔,執行以下命令,部署該Deployment,通過Deployment啟動指定數量的Pod副本。
kubectl apply -f example.yaml
相關文檔
如果您希望在ACK叢集中配置和使用eRDMA,請參見在ACK叢集中使用eRDMA加速容器網路。
