eRDMA デバイスを Docker コンテナにマッピングするか、eRDMA Controller を使用してセルフマネージド Kubernetes クラスターの Pod に公開することができます。
制限事項
Docker での eRDMA は、次のイメージのみをサポートしています。
-
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 イメージはサポートされていません。
仕組み
Docker の --device オプションを使用して、/dev/infiniband/rdma_cm および /dev/infiniband/uverbsX キャラクタデバイスをコンテナにマップします。これにより、ユーザーモードプログラムはカーネルをバイパスして eRDMA デバイスに直接アクセスできます。
-
/dev/infiniband/rdma_cm:eRDMA 接続管理用のキャラクタデバイスで、接続の作成と破棄、および接続イベントの処理を行います。 -
/dev/infiniband/uverbsX:ユーザースペース eRDMA 操作用のキャラクタデバイスで、デバイスのオープン、通信エンドポイントの管理、メモリバッファの登録などが含まれます。説明/dev/infiniband/uverbsX:Xはデバイスインデックス番号です。ls /dev/infiniband | grep uverbsを実行してデバイス名を確認します。
Docker コンテナでの eRDMA の設定
ステップ 1:インスタンスでの eRDMA の設定
インスタンスタイプが eRDMA をサポートしていること、Elastic RDMA Interface がアタッチされていること、eRDMA ドライバーがデプロイされていること、および eRDMA デバイスが正しく動作していることを確認してください。
-
エンタープライズレベルの CPU インスタンス: 「エンタープライズレベルのインスタンスで eRDMA を有効化する」をご参照ください。
-
GPU 高速化インスタンス: 「GPU 高速化インスタンスで eRDMA を有効化する」をご参照ください。
ステップ 2:(オプション)インスタンスへの Docker のデプロイ
インスタンスに Docker がすでにインストールされている場合は、このステップをスキップしてください。
-
インスタンスに接続します。詳細については、「Workbench を使用して Linux インスタンスにログオンする」をご参照ください。
-
Docker がインストールされているかどうかを確認します。
sudo docker -vDocker がインストールされている場合、バージョン番号が返されます。

インストールされていない場合は、インスタンスに Docker をデプロイするに進んでください。

-
インスタンスに Docker をデプロイします。
-
Alibaba Cloud Linux または CentOS:「Docker をインストールする」をご参照ください。
-
Ubuntu: Ubuntu ドキュメントをご参照ください。
-
ステップ 3:(オプション)Docker イメージのデプロイ
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 イメージのリージョン ID。例:cn-hangzhou。<TAG>: オプション。 Docker イメージのタグ。このパラメーターを指定すると、指定された Docker イメージバージョンがダウンロードされます。指定しない場合は、最新の Docker イメージバージョンがダウンロードされます。
コマンド例:
中国 (杭州) リージョンで Alibaba Cloud Linux 3 Docker イメージのバージョン 220901.1 をダウンロードします。
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次の出力は、Alibaba Cloud Linux 3 Docker イメージのバージョン 220901.1 と Alibaba Cloud Linux 2 Docker イメージの最新バージョンがダウンロードされていることを示しています。

ステップ 4:コンテナの起動と eRDMA デバイスのアタッチ
Docker の --device オプションを使用して、/dev/infiniband/rdma_cm および /dev/infiniband/uverbsX キャラクターデバイスをコンテナにマップします。詳細については、「仕組み」をご参照ください。
-
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 操作に十分なメモリをロックできるようにします。 -
<IMAGE ID>: Docker イメージ ID です。sudo docker imagesを実行して表示します。ターゲットイメージ ID の確認:
sudo docker imagesこの例では、ステップ 3 の Alibaba Cloud Linux イメージを使用します。出力例:

-
ステップ 5:Docker コンテナへの eRDMA ドライバーパッケージのデプロイ
eRDMA ユーザーモードドライバーパッケージもコンテナにデプロイする必要があります。これがなければ、コンテナ内から eRDMA デバイスを検出できません。Alibaba Cloud は、簡単にインストールできる yum および apt ソースを提供しています。
-
インスタンスに接続します。詳細については、「Workbench を使用して Linux インスタンスにログオンする」をご参照ください。
-
ターゲットコンテナに入ります。
ステップ 4 でコマンドを実行した場合、すでにコンテナ内にいます。コンテナにユーザーモードのドライバーパッケージをインストールする手順に進んでください。
-
ターゲットコンテナ 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-config-managerは yum-utils パッケージの一部です。 -
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.list -
Ubuntu 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.list -
Ubuntu 22.04
echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu jammy/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list -
Ubuntu 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 デバイスがコンテナ内から検出されます。
SMC-R または NetACC を使用してコンテナ内の TCP アプリケーションに eRDMA を統合するには、「アプリケーションの適応の概要」をご参照ください。
eRDMA Controller を使用したセルフマネージド Kubernetes クラスターへの eRDMA Pod のデプロイ
ステップ 1:eRDMA Controller のインストール
-
マスターノードに Helm をインストールします。
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.sh -
マスターノードで eRDMA Controller のソースコードをダウンロードします。
git clone https://github.com/AliyunContainerService/alibabacloud-erdma-controller.git -
インストール設定ファイルは
deployment/helm/values.yamlです。動作モードを選択してパラメーターを設定するには、このファイルを変更します。2 つのモードがサポートされています。-
Regular Mode:eRDMA Controller は Elastic RDMA Interface (ERI) を自動的に管理し、eRDMA リソースを動的に割り当てます。
-
Local Mode:eRDMA 環境が Kubernetes ノードですでに準備されており、eRDMA デバイスが Pod に公開されます。動的なリソース管理は行われません。
設定項目:
-
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}"Local Mode では不要です。
-
preferDriver: ノードの eRDMA ドライバータイプです。-
default: デフォルトのドライバーモード。 -
compat: RoCE 互換のドライバーモード。 -
ofed:OFED ベースのドライバーモードで、GPU アクセラレーション対応のインスタンスタイプに適しています。
-
-
allocateAllDevices: 通常モードにおけるデバイス割り当てポリシーです。-
true: ノード上のすべての eRDMA デバイスをポッドに割り当てます。 -
false: NUMA トポロジに基づいて eRDMA デバイスを 1 つ割り当てます。
-
-
exposedLocalERIs: ローカルモードでポッドに公開するノード上の eRDMA デバイス。設定形式については、例をご参照ください。exposedLocalERIs: - i-XXX erdma_0/erdma_1 # インスタンス ID と公開する eRDMA デバイス (erdma_0/erdma_1) を指定します - i-* erdma_0 # すべての未指定ノードに対して公開する eRDMA デバイス (erdma_0) を指定します - i-* erdma_* # すべての未指定ノードに対して既存のすべての eRDMA デバイスを公開します -
イメージ設定: デフォルトの
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>
-
-
erdma-controllerコンポーネントをhelmでインストールします。helm install -f deploy/helm/values.yaml --namespace kube-system alibaba-erdma-controller deploy/helm/ -
インストールを確認します。
-
通常モードでは、
erdma-agentとerdma-controllerの両方のポッドが作成されていることを確認します:kubectl get pods -n kube-system | grep erdmaノード上の eRDMA デバイスリソースをクエリします。
kubectl get erdmadevices -
ローカルモードでは、
erdma-agentポッドのみが作成されます。erdma-controllerポッドとerdmadevicesリソースは利用できません。
-
ステップ 2:eRDMA ネットワークアクセラレーションをサポートする Pod の作成
-
コンテナの spec の
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"アノテーションを追加します。カーネル 5.10.134-17 以降の Alibaba Cloud Linux 3 が必要です。 -
設定ファイルに基づいて Deployment をデプロイします。Deployment は指定された数の Pod レプリカを起動します。
kubectl apply -f example.yaml
関連ドキュメント
ACK クラスターで eRDMA を設定するには、「ACK クラスターで eRDMA を使用してコンテナネットワークを高速化する」をご参照ください。
