Infinibandをdockerコンテナーにパススルーして、ipoib上でいくつかの高性能アプリを実行してrdmaを使用できるようにしたいと考えています。
現在、私はxen仮想マシンでこれを行っています。現在、CoreOSとdockerをはるかに軽量で管理しやすい代替手段として使用することを検討しています。
10.10.10.10の静的IPが割り当てられたIPoIBデバイスib0があります。私はそれをDockerコンテナ内に公開することに成功しました:
docker run --net = Host --device =/dev/infiniband/uverbs0 --device =/dev/infiniband/rdma_cm -t -i ubuntu:14.04/bin/bash
素晴らしい、それはうまくいく。 ib0はdockerコンテナー内で使用できます。
ここで、デュアルポートHCAがあるとします。ホスト上では、これらはib0およびib1として表示され、2つのIPが割り当てられています。 10.10.10.10/ib0および10.10.10.11/ ib1
次に、ib0を最初のコンテナーに渡し、ib1を2番目のコンテナーに渡します。上記の方法を使用すると、-net = Hostオプションがあるため、両方が両方のコンテナーに表示されます。ただし、指定しないと、デバイスがまったく表示されません。
もう1つのシナリオは、SR-IOVを使用してインフィニバンドデバイスをパススルーして仮想マシンをxenするマシンがたくさんあることです。代わりに、仮想関数のインフィニバンドデバイスをDockerコンテナに渡して、それを表示させるにはどうすればよいですか?
注:この状況では配管は機能しませんが、理解が深ければ、ハッキングされてやりたいことができるかもしれません。私はそれが何をしているのかよくわかりません...まだ。
そして今、私はこれを行う方法についての私自身の質問に答えることができます。
InfinibandまたはRDMAIPoIBデバイスで動作するようにパッチを適用したばかりの pipework を使用します。
このように実行します。
~ $ docker run --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm -d container
~ $ pipework ib0 container-id ip/netmask
IPoIBデバイスはブリッジングをサポートしていないため、コマンドが発行された後、ib0デバイス全体がホストから隠されます。つまり、コンテナのネットワーク名前空間に移動されます。
ブリッジせずにブリッジのような機能を取得するには、SR-IOVを使用し、配管を介して仮想関数を渡します。
最新の化身は、macvlanに似た仮想IPoIBを使用しています。したがって、実際のib0はホストに表示されたままになります。イーサネットバージョンと非常によく似ています。