eRDMA (Elastic Remote Direct Memory Access) は、高性能なネットワーク通信技術です。Docker コンテナーで eRDMA を使用すると、アプリケーションはオペレーティングシステムカーネルをバイパスして、ホストの物理 eRDMA デバイスに直接アクセスできます。これにより、データ転送が高速化され、通信効率が向上します。これは、コンテナー内で大規模なデータ転送と高性能なネットワーク通信を必要とするシナリオに適しています。このトピックでは、Docker コンテナーで eRDMA を設定する方法について説明します。また、eRDMA Controller コンポーネントを使用して、自己管理型 Kubernetes クラスターの Pod に eRDMA を迅速に設定する方法についても説明します。
制限事項
eRDMA 機能は、次の Docker イメージでのみサポートされています。
Alibaba Cloud Linux 3、Ubuntu 22.04、および Ubuntu 24.04 のイメージソース (ARM および x86 インスタンスの両方でサポート)
Alibaba Cloud Linux 2、CentOS 7、CentOS 8、Ubuntu 18.04、Ubuntu 20.04、および Ubuntu 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 の設定
ステップ 1:インスタンスの eRDMA の設定
Docker が配置されているインスタンスタイプが eRDMA をサポートしていることを確認します。また、Elastic RDMA Interface がアタッチされ、eRDMA ドライバーがデプロイされ、eRDMA デバイスが正常に動作していることを確認します。
エンタープライズレベルの CPU インスタンスについては、「エンタープライズレベルのインスタンスで eRDMA を有効にする」をご参照ください。
GPU インスタンスについては、「GPU インスタンスで eRDMA を有効にする」をご参照ください。
ステップ 2:(任意) インスタンスへの Docker のデプロイ
インスタンスに Docker がデプロイされていない場合は、インストールします。
次の手順に従います。
インスタンスにリモート接続します。
詳細については、「ワークベンチを使用して Linux インスタンスにログオンする」をご参照ください。
次のコマンドを実行して、インスタンスに Docker 環境がデプロイされているかどうかを確認します。
sudo docker -vDocker が正しくデプロイされている場合、次の図に示すように、特定のバージョン番号が返されます。

Docker がデプロイされていないか、エラーが発生した場合、次の結果が表示されることがあります。この場合は、「インスタンスへの Docker のデプロイ」をご参照ください。

インスタンスに Docker をデプロイします。
Alibaba Cloud Linux または CentOS イメージについては、「Docker と Docker Compose のインストールと使用」をご参照ください。
Ubuntu イメージについては、Ubuntu ドキュメントをご参照ください。
ステップ 3:(任意) 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>:イメージのリージョン ID (例:cn-hangzhou)。(任意)
<TAG>:Docker イメージのタグ。指定した場合、Docker は対応するバージョンをプルします。省略した場合、Docker は最新バージョンをプルします。
コマンドの例:
cn-hangzhouリージョンで、Alibaba Cloud Linux 3 Docker イメージの220901.1タグをプルします。sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1cn-hangzhouリージョンで、最新の Alibaba Cloud Linux 2 Docker イメージをプルします。sudo docker pull alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2
イメージのプルを確認します。
sudo docker images次のサンプル出力は、Alibaba Cloud Linux 3 Docker イメージの
220901.1タグと最新の Alibaba Cloud Linux 2 Docker イメージが正常にプルされたことを示しています。
ステップ 4:コンテナーの起動と eRDMA デバイスのアタッチ
Docker の --device オプションを使用して、/dev/infiniband/rdma_cm および /dev/infiniband/uverbsX キャラクターデバイスをコンテナーにマッピングできます。これにより、コンテナー内のユーザーモードプログラムは、オペレーティングシステムカーネルをバイパスして eRDMA デバイスに直接アクセスし、データを送受信できます。詳細については、「仕組み」をご参照ください。
次の手順に従います。
ECS インスタンスにリモート接続します。
詳細については、「ワークベンチを使用して 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 を表示できます。次のコマンドを実行して、ターゲットイメージ ID を表示します。
sudo docker imagesこの例では、「ステップ 3」でデプロイされた Alibaba Cloud Linux イメージが使用されます。コマンドの出力は次のとおりです。

ステップ 5:Docker コンテナー用の eRDMA ドライバーパッケージのデプロイ
コンテナーで eRDMA を使用するには、eRDMA ユーザーモードドライバーパッケージもデプロイする必要があります。そうしないと、コンテナー内から eRDMA デバイス情報を検出できません。Alibaba Cloud は、必要なパッケージを簡単にデプロイできるように、yum および apt ソースを提供しています。
次の手順に従います。
インスタンスにリモート接続します。
詳細については、「ワークベンチを使用して Linux インスタンスにログオンする」をご参照ください。
ターゲットコンテナーに入ります。
「ステップ 4」のコマンドを例のように実行した場合、すでに Docker コンテナー内にいます。「コンテナーにユーザーモードドライバーパッケージをインストールする」に進むことができます。
次のコマンドを実行して、ターゲットコンテナー ID を表示します。
sudo docker psこの例では、「ステップ 4」で開始されたコンテナーを使用します。コマンドの出力は次のとおりです。

次のコマンドを実行して、コンテナーに入ります。
sudo docker exec -it <CONTAINER ID> /bin/bashCONTAINER 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
コンテナーで次のコマンドを実行して、リポジトリを追加します。
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 を使用してコンテナー内の TCP アプリケーションに eRDMA を統合し、アプリケーションの高速化を実現できます。詳細については、「アプリケーション適応の概要」をご参照ください。
eRDMA Controller を使用した自己管理型 Kubernetes クラスターへの eRDMA Pod のデプロイ
ステップ 1:eRDMA Controller のインストール
マスターノードで次のコマンドを実行して、Helm をインストールします。
このツールは、eRDMA Controller コンポーネントのインストールとアンインストールを管理するために使用されます。インストール後、
helm versionを実行して、Helm がインストールされていることを確認します。curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.shマスターノードで次のコマンドを実行して、eRDMA Controller のソースコードをダウンロードします。
git clone https://github.com/AliyunContainerService/alibabacloud-erdma-controller.giteRDMA Controller のインストール構成ファイルは
deployment/helm/values.yamlです。このファイルを変更して、動作モードを選択し、関連パラメーターを設定できます。2 つの動作モードがサポートされています。通常モード:このモードは、eRDMA Controller が Elastic RDMA Interface (ERI) を自動的に管理し、eRDMA リソースを動的に割り当てる必要があるシナリオに適しています。
ローカルモード:このモードは、eRDMA 環境がすでに Kubernetes ノードに準備されており、eRDMA デバイスが Pod に公開されているシナリオに適しています。このモードでは、eRDMA リソースの動的な管理は行われません。
構成項目:
localERIDiscovery:コントローラーの動作モードを設定します。true:ローカルモード。false:通常モード (デフォルト)。
credentials:通常モードでは、コントローラーは Alibaba Cloud API にアクセスして ECS インスタンスと ENI をクエリおよび設定する必要があります。したがって、まず RAM ロールを作成し、必要な権限を付与する必要があります。現在、AccessKey 認証がサポートされています。
typeをaccess_keyに設定し、AccessKey ID とシークレットを入力します。credentials: type: "access_key" accessKeyID: "{access key}" accessKeySecret: "{access key secret}"ローカルモードでは、この項目を設定する必要はありません。
preferDriver:ノードで使用される eRDMA ドライバータイプを設定します。default:デフォルトのドライバーモード。compat:RoCE 互換ドライバーモード。ofed:OFED ベースのドライバーモード。GPU インスタンスタイプに適しています。
allocateAllDevices:通常モードでのデバイス割り当てポリシーを設定します。true:ノード上のすべての eRDMA デバイスを Pod に割り当てます。false:NUMA トポロジーに基づいて 1 つの eRDMA デバイスを Pod に割り当てます。
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) はローカルモードをサポートしていません。ローカルモードを使用するには、エージェントイメージを自分でビルドし、カスタムイメージリポジトリにプッシュする必要があります。次のコマンドを実行して、イメージをビルドしてプッシュします。この例では、Alibaba Cloud 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リソースは利用できません。
ステップ 2: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: 1SMC-R による透過的なアクセラレーションを有効にするには、
network.alibabacloud.com/erdma-smcr: "true"アノテーションを追加します。この機能には、オペレーティングシステムが Alibaba Cloud Linux 3 で、カーネルバージョンが 5.10.134-17 以降である必要があります。上記の構成ファイルに基づいて、次のコマンドを実行してデプロイメントをデプロイします。デプロイメントは、指定された数の Pod レプリカを開始します。
kubectl apply -f example.yaml
参考
ACK クラスターで eRDMA を設定して使用する場合は、「ACK クラスターで eRDMA を使用してコンテナーネットワークを高速化する」をご参照ください。
