Estou tentando erguer um conjunto de contêineres Docker ou LXC, cada um com seu próprio endereço IP roteável. O host que contém é, na verdade, uma VM em execução no RedHat Enterprise Virtualization, que é uma versão re-branded e muito antiga do oVirt. Em nosso datacenter, estamos usando VLANs marcadas e, dentro do RHEV, essas VLANs são selecionáveis por meio de diferentes "Perfis de LAN". Espero colocar todos os containers na mesma VLAN / profile que o container Host. Espero permitir que cada contêiner tenha um dispositivo de LAN virtual com seu próprio MAC.
A VM que contém a interface é eth0. Seguindo este guia ("Com dispositivos macvalan") Eu criei um macvlan no modo bridge e o atribuí ao container. Para nossos propósitos, diremos que 10.12.0.117/21
é um endereço roteável que o contêiner deve ter e 10.12.7.254
é seu gateway.
# docker run -d --name test centos7
# dockpid=$(docker inspect --format '{{ .State.Pid }}' test)
# ip link add eth0p0 link eth0 type macvlan mode bridge
# ip link set netns $dockpid eth0p0
# nsenter -t $dockpid -n ip link del eth0
# nsenter -t $dockpid -n ip addr add 10.12.0.117/21 dev eth0p0
# nsenter -t $dockpid -n ip route add default via 10.12.7.254 dev eth0p0
Não é pingável. Na verdade, usando tcpdump
on eth0
e arping
de outro nó na rede, posso ver as solicitações arp chegando ao contêiner, e posso ver o contêiner respondendo (com seu MAC gerado aleatoriamente), mas essas respostas ARP não parecem voltar para o outro host (como visto pelo TCP / IP).
Eu também tentei com o lxc, criando a interface de maneira simples:
# ip link add link eth0 eth4 type macvlan
Se eu der um endereço IP e UP do dispositivo, o IP se tornará pingável na LAN. Mas não quando eu configuro o container:
lxc.network.type = phys
lxc.network.flags = up
lxc.network.link = eth4
e, em seguida, configurar manualmente o IP e o roteamento. Agora é unpingable como com o docker.
Se, por outro lado, eu usar o RHEV-M para criar uma interface de rede adicional com o mesmo perfil, conecte-a à VM e, na VM, atribua essa nova interface ( eth2
) ao namespace do contêiner, tudo funciona muito bem. Então, eu estou supondo que isso tem algo a ver com o RHEV e encaminhamento de solicitações ARP de dentro.
BTW: Eu não tenho raiz no hypervisor da VM RHEVM. (Mas eu posso perguntar educadamente se eu conseguir.)
Existe uma solução óbvia para isso? Alguém tem dicas de solução de problemas? O que estou perdendo?