Estou querendo passar o infiniband para um contêiner docker para que eu possa executar alguns aplicativos de alto desempenho no ipoib e usar o rdma.
Atualmente, estou fazendo isso com máquinas virtuais xen. Agora estou pensando em usar o CoreOS e o docker como uma alternativa muito mais leve e fácil de gerenciar.
Eu tenho um dispositivo IPoIB ib0 com um IP estático atribuído a ele de 10.10.10.10. Consegui expor isso dentro de um contêiner docker com o seguinte:
docker run --net=host --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm -t -i ubuntu:14.04 /bin/bash
Ótimo, isso funciona. ib0 está disponível dentro do contêiner docker.
Agora vamos supor que eu tenha um HCA de porta dupla. No host, eles aparecem como ib0 e ib1 e têm dois ips atribuídos. 10.10.10.10/ib0 e 10.10.10.11/ib1
E agora quero passar ib0 para o primeiro container e ib1 para o segundo. Usando o método acima, ambos aparecerão em ambos os contêineres devido à opção --net=host. No entanto, não especificá-lo significa que os dispositivos não aparecem.
Outro cenário é que tenho muitas máquinas que usam SR-IOV para passar por dispositivos infiniband para máquinas virtuais xen. Como eu poderia passar, em vez disso, um dispositivo infiniband de função virtual para um contêiner docker e fazer isso aparecer?
Nota: o pipework não funciona nesta situação, mas se eu entender melhor, pode ser hackeado para fazer o que eu quero. Só não entendo muito bem o que está fazendo... ainda.
E agora posso responder minha própria pergunta sobre como fazer isso.
Use a tubulação que acabei de corrigir para funcionar com dispositivos Infiniband ou RDMA IPoIB.
Você dirige assim.
Como os dispositivos IPoIB não suportam bridging, todo o dispositivo ib0 é ocultado do host após a emissão do comando. ou seja, é movido para o namespace de rede do contêiner.Para obter a funcionalidade de ponte sem ponte, use SR-IOV e passe a função virtual por meio de tubulação.A última encarnação usa IPoIB virtual que é semelhante ao macvlan. Portanto, o ib0 real permanece visível no host. Funciona de maneira muito semelhante à versão ethernet.