Atualmente, estamos usando o conjunto de ferramentas CentOS libvirt-LXC para criar e gerenciar contêineres no CentOS 7.1. Esse conjunto de ferramentas está sendo substituído, por isso planejamos alterar nossos contêineres para serem executados sob a estrutura linuxcontainers.org. Vou me referir a isso simplesmente como LXC em vez de libvirt-LXC.
Em libvirt-LXC, temos nossos contêineres configurados para usar a ponte do host e, portanto, estão conectados à rede do host. Cada contêiner tem seu próprio IP estático e aparece como máquinas físicas na rede. Eles podem ver uns aos outros, assim como outros sistemas em execução na mesma rede.
Até agora, não consegui fazer com que o host fizesse uma ponte para trabalhar com o LXC. Há uma quantidade razoável de informações disponíveis sobre redes para o LXC, mas muitas delas parecem descrever maneiras ligeiramente diferentes de configurar as coisas e nada que eu tentei funciona da maneira que eu esperava. Eu sou capaz de obter os contêineres para ver uns aos outros, mas não foram capazes de levá-los para ver a rede host. A configuração que estou usando para meus contêineres é assim:
lxc.utsname = test1
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
A interface br0 é a mesma interface de bridge configurada para uso com meus contêineres libvirt-LXC. Alguns dos sites que eu encontrei discutiram sobre como configurar a ponte de host para o LXC para configurar regras no iptables. No entanto, não precisamos de nenhuma dessas regras com o libvirt-LXC e, de fato, o iptables (ou, mais precisamente, o firewalld no CentOS 7) não está habilitado.
Além dessa configuração que estou usando, também criei o / etc / sysconfig / network-scripts / ifcfg-eth0 com as seguintes entradas:
DEVICE=eth0
NM_CONTROLLED=no
ONBOOT=yes
BOOTPROTO=none
IPADDR=172.16.110.222
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
Este é exatamente o mesmo arquivo que eu uso para meus contêineres baseados em libvirt-LXC. Como afirmei, os contêineres podem se ver, mas não podem acessar a rede do host. Eles não podem nem fazer ping em seu próprio host. No entanto, a tabela de roteamento é a mesma para os meus contêineres LXC e libvirt-LXC:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1021 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
Não tenho certeza de qual mágica do LXC estou perdendo para abrir os containers até a rede externa. Estou usando o mesmo modelo para ambos os meus testes LXC e libvirt-LXC, e estou usando o mesmo host para ambos. O que estou perdendo?
A saída de "bridge link show br0" com um contêiner em execução é:
# bridge link show br0
3: bond0 state UP : <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 19
6: virbr0-nic state DOWN : <BROADCAST,MULTICAST> mtu 1500 master virbr0 state disabled priority 32 cost 100
22: veth5BJDXU state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master virbr0 state forwarding priority 32 cost 2
O nome veth é escolhido automaticamente pelo LXC. A configuração equivalente usando libvirt-LXC com um contêiner produz essencialmente a mesma saída, exceto que o nome gerado é veth0.
A interface virbr0-nic BTW é criada pelo libvirt e é usada com contêineres e MVs libvirt-LXC que estão configurados para usar NAT em vez de bridging. Curiosamente, se eu usar o endereçamento NAT com meus contêineres libvirt-LXC, eles se comportam da mesma forma que meus contêineres LXC que, como deveriam, devem estar usando a interligação em rede por meio de br0. Isso me faz pensar se, de fato, estou usando de alguma forma o endereçamento NAT com meus contêineres LXC, em vez de uma rede brdiged.
Tags networking lxc centos-7