Я хочу передать infiniband в контейнер докеров, чтобы я мог запускать некоторые высокопроизводительные приложения через ipoib и использовать rdma.
В настоящее время я делаю это с виртуальными машинами xen. Теперь я смотрю на использование CoreOS и docker как на гораздо более легкую и более простую в управлении альтернативу.
У меня есть IPoIB-устройство ib0 со статическим IP-адресом 10.10.10.10. Мне удалось получить это внутри контейнера докеров с помощью следующего:
docker run --net = host --device = / dev / infiniband / uverbs0 --device = / dev / infiniband / rdma_cm -t -i ubuntu: 14.04 / bin / bash
Отлично, это работает. ib0 доступен внутри контейнера докеров.
Теперь предположим, что у меня есть двухпортовый HCA. На хосте они отображаются как ib0 и ib1 и имеют два назначенных ip. 10.10.10.10/ib0 и 10.10.10.11/ib1
А теперь я хочу передать ib0 первому контейнеру, а ib1 - второму. При использовании описанного выше метода оба появятся в обоих контейнерах из-за параметра --net = host. Однако отсутствие указания означает, что устройства вообще не появляются.
Другой сценарий: у меня есть много машин, которые используют SR-IOV для передачи устройств Infiniband на виртуальные машины xen. Как я мог передать вместо этого виртуальное устройство Infiniband в контейнер докера и получить его?
Примечание. В этой ситуации конвейерная система не работает, но, если я лучше понимаю, ее можно взломать, чтобы она делала то, что я хочу. Я просто не совсем понимаю, что он делает ... пока.
И теперь я могу ответить на свой вопрос, как это сделать.
Использовать трубопровод который я только что исправил для работы с устройствами Infiniband или RDMA IPoIB.
Вы запускаете его вот так.
~ $ docker run --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm -d container
~ $ pipework ib0 container-id ip/netmask
Поскольку устройства IPoIB не поддерживают мостовое соединение, все устройство ib0 скрывается от хоста после выполнения команды. т.е. перемещается в сетевое пространство имен контейнера.
Чтобы получить функциональность моста без моста, используйте SR-IOV и передайте виртуальную функцию через конвейер.
В последнем воплощении используется виртуальный IPoIB, который похож на macvlan. Поэтому реальный ib0 остается видимым на хосте. Он работает очень аналогично версии Ethernet.