Bond-vlan-xen

De Xen-BR wiki

Xen-BR 
Rede de maquinas virtuais Xen com interface de rede bond e multiplas Vlan's

Xenlogo.png




Tabela de conteúdo

Introdução

Este documento aborda a configuração de rede de maquinas virtuais considerando garantir alta disponibilidade de rede e a inclusão de TAG de ID de vlans em cima do Xen sobre a distribuição Debian. O hardware utilizado para a configuração contém 2 interfaces de rede que serão utilizadas para tal fim. Para instalação do Xen indico seguir este howto.

Entendendo os modos do modulo bonding

Existem 7 modos para uso de bond passado como parametro para o modulo bonding. Abaixo a descrição para cada um deles:

mode=0 (balance-rr) Round-robin policy

Transmite pacotes em ordem sequencial do primeiro dispositivo escravo disponível até o último. 
Este modo disponibiliza balanceamento de carga e tolerancia a falhas.

mode=1 (active-backup) Active-backup policy

Somente um escravo no bond está ativo. Um diferente dispositívo slave se torna ativo se, e 
somente se, o dispositívo ativo falhar. O endereço MAC do bond é externamente visivel em apenas 
uma porta (interface de rede) para evitar confundir o switch. Este modo disponibiliza tolerância 
a falhas. A primeira opção afeta o comportamento deste modo.

mode=2 (balance-xor) XOR policy

Transmição baseada no [(fonte do endereço MAC XOR com endereço MAC de destino) modulo slave cont]. 
Este modo seleciona a mesma interface slave para cada endereço MAC de destino. É disponibilizado 
neste modo balanceamento de carga e tolerancia a falhas.
Para saber mais sobre XOR lei este artigo da wikipedia.


mode=4 (802.3ad) IEEE 802.3ad Dynamic link aggregation.

Cria agregação de grupos que compartilham a mesma velocidade e configurações duplex. Utiliza todos 
as interfaces slaves no agregador ativo de acordo com a especificação 802.3ad.
Pré-requisito para operação neste modo: 
1. Suporte do ethertool nos drivers dos dispositívos para restaurar a velocidade e a função duplex 
em cada interface slave.
2. Um switch com suporte à IEEE 802.3ad Dynamic link affregation. Na maioria dos switches será necessária 
algum tipo de configuração para habilitar suporte ao modo 802.3ad.

mode=5 (balance-tlb) Adaptive transmit load balancing

Canal bonding que não requer qualquer suporte especial do switch. A saida do trafego é distribuida 
de acordo com a carga corrente em cada interface slave. O trafego de entrada é recebido pela interface 
slave atual. Se a interface slave recebedora dos dados falhar, a outra interface slave pega sobre a camada
de endereço MAC o pacote da interface slave que falhou.
Pré-requisito: 
Suporte do ethertool nos drivers dos dispositívos para restaurar a velocidade e a função duplex em cada 
uma das interfaces slave.

mode=6 (balance-alb) Adaptive load balancing

Este modo inclui Transmit Load Balancing (tlb) com Receive Load Balancing (rlb) para trafego IPV4, e não 
requer qualquer suporte especial no switch. O rlb é arquivado pela negociação ARP. O driver bonding 
intercepta a resposta ARP enviada pelo sistema local em sua saída e reescreve o endereço do hardware de 
origem com um único endereço de hardware de um das interfaces slave do bond como pares diferentes usam 
diferentes endereços de hardware para o servidor.

Os primeiros quatro modos são mais comumente usados.

Fonte destas informações: redhat.

Configuração da interface bond

Instale o pacote abaixo:

apt-get install ifenslave-2.6

Insira as linhas abaixo no arquivo /etc/modprobe.d/arch/i386:

alias bond0 bonding
options bonding mode=1 miimon=100 downdelay=200 updelay=200

Neste exemplo estou levantando o modulo com os seguintes parametros:

* modo = 1 (active-backup)
* miimon = 100 ms (Intervalo de checagem)
* downdelay = 200 ms (Delay antes de considerar o link indisponível)
* updelay = 200 ms (Delay antes de considerar o link disponível)

Outros parâmetros:

* max_bonds=X (número máximo de dispositivos bond)
* use_carrier=X (Use o netif_carrier_ok (versus MII ioctls) no miimon; 0 para off e 1 para on (default))
* primary=ethX (Interface primária para uso)
* lacp_rate=[slow/fast] (LACPDU tx rate para requisição de 802.3ad)
* xmit_hash_policy=X (Metodo XOR hashing: 0 para layer 2 (default), 1 para layer 3+4)
* arp_interval=X (Intervalo arp em ms)
* arp_ip_target=n.n.n.n (alvo arp (from))
* arp_validate=[none (default), active, backup or all] (validar src/dst do ARP)

Configuração das vlans

Inicialmente, instale o pacote vlan:

apt-get install vlan

Inclua o modulo 8021q em seu /etc/modules.

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

loop
sbp2
8021q


Para habilitar multiplas vlans com o Xen foi necessário algumas otimizações dos scripts do Xen para habilitar suporte à vlan e bond. O script /etc/xen/scripts/network-bridge no contexto que ele é utilizado não consegue criar as bridges das interfaces bond0 e das VLANs para uso no Xen. Por este motivo, precisei modificar este script para ter este recurso habilitado. Inicialmente, faça um backup do script /etc/xen/scripts/network-bridge:

cd /etc/xen/scripts
cp network-bridge network-bridge.orig

Agora faça o download do script network-bridge modificado com o comando abaixo no mesmo diretorio de scripts do Xen:

wget http://msinhore.xen-br.org/scripts/network-bridge
chmod +x network-bridge

Será necessário criar o script network-bridge-multi que definirá as bridges que serão ativas em cima das vlans. Neste exemplo estou contemplando a existência das vlans com IDs de 2 até 5. Para isso, crie o script network-bridge-multi com o conteúdo abaixo:

#! /bin/sh
dir=$(dirname "$0")

"$dir/network-bridge" "$@" vifnum=2 netdev=bond0.2 bridge=vlanbr2
"$dir/network-bridge" "$@" vifnum=3 netdev=bond0.3 bridge=vlanbr3
"$dir/network-bridge" "$@" vifnum=4 netdev=bond0.4 bridge=vlanbr4
"$dir/network-bridge" "$@" vifnum=5 netdev=bond0.5 bridge=vlanbr5

Salve o arquivo e de permissão de execução:

chmod +x network-bridge-multi

Agora, edite o arquivo de configuração xend-config.sxp alterando a linha do network-script:

# (network-script network-bridge)
(network-script network-bridge-multi)

Isto fará com que, quando do carregamento do daemon xend seja carregado o network-script network-bridge-multi.

configuração das interfaces

Inicialmente é necessário que todas as interfaces tando bond0 quanto bond0.2, bond0.3, bond0.4 e bond0.5 estejam definidas e ativas para que os scripts do Xen funcionem corretamente. O arquivo /etc/network/interfaces abaixo descreve como deve ser configurado para o nosso caso. Defina o número de vlans e endereços IPs conforme sua necessidade.

auto lo
iface lo inet loopback

auto bond0
iface bond0 inet static
       address 10.20.0.200
       netmask 255.255.255.0
       network 10.20.0.0
       up /sbin/ifenslave bond0 eth0
       up /sbin/ifenslave bond0 eth1

auto bond0.2
iface bond0.2 inet static
       vlan-raw-device bond0
       address 192.168.120.19
       netmask 255.255.255.0
       gateway 192.168.120.254

auto bond0.3
iface bond0.3 inet static
       vlan-raw-device bond0
       address 10.20.3.200
       netmask 255.255.255.0
       network 10.20.2.0

auto bond0.4
iface bond0.4 inet static
       vlan-raw-device bond0
       address 10.20.4.200
       netmask 255.255.255.0
       network 10.20.4.0

auto bond0.5
iface bond0.5 inet static
       vlan-raw-device bond0
       address 10.20.5.200
       netmask 255.255.255.0
       network 10.20.5.0

Para ver se tudo está funcionando, reinicie o servidor:

reboot

Pós-configuração

Confira após já ter reiniciado o seu sistema se tudo correu bem:

# ifconfig
bond0     Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.0.200  Bcast:10.20.0.255  Mask:255.255.255.0
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:270305 errors:0 dropped:0 overruns:0 frame:0
         TX packets:9288 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:21847859 (20.8 MiB)  TX bytes:2550844 (2.4 MiB)

bond0.2   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:192.168.120.19  Bcast:192.168.120.255  Mask:255.255.255.0
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:133635 errors:0 dropped:0 overruns:0 frame:0
         TX packets:7825 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:8185613 (7.8 MiB)  TX bytes:2243842 (2.1 MiB)

bond0.3   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.3.200  Bcast:10.20.3.255  Mask:255.255.255.0
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:2908 errors:0 dropped:0 overruns:0 frame:0
         TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:122136 (119.2 KiB)  TX bytes:810 (810.0 b)

bond0.4   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.4.200  Bcast:10.20.4.255  Mask:255.255.255.0
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:2908 errors:0 dropped:0 overruns:0 frame:0
         TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:122136 (119.2 KiB)  TX bytes:846 (846.0 b)

bond0.5   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.5.200  Bcast:10.20.5.255  Mask:255.255.255.0
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:2908 errors:0 dropped:0 overruns:0 frame:0
         TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:122136 (119.2 KiB)  TX bytes:846 (846.0 b)

eth0      Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
         RX packets:104683 errors:0 dropped:0 overruns:0 frame:0
         TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:8658096 (8.2 MiB)  TX bytes:1132 (1.1 KiB)
         Interrupt:21 

eth1      Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet6 addr: fe80::213:d4ff:feb9:3a22/64 Scope:Link
         UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
         RX packets:165622 errors:0 dropped:0 overruns:0 frame:0
         TX packets:9272 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100 
         RX bytes:13189763 (12.5 MiB)  TX bytes:2549712 (2.4 MiB)
         Base address:0xc800 Memory:ddee0000-ddf00000 

lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

vlanbr2   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:192.168.120.19  Bcast:192.168.120.255  Mask:255.255.255.0
         inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:119067 errors:0 dropped:0 overruns:0 frame:0
         TX packets:7820 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:7456074 (7.1 MiB)  TX bytes:2243464 (2.1 MiB)

vlanbr3   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.3.200  Bcast:10.20.3.255  Mask:255.255.255.0
         inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2909 errors:0 dropped:0 overruns:0 frame:0
         TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:122164 (119.3 KiB)  TX bytes:468 (468.0 b)

vlanbr4   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.4.200  Bcast:10.20.4.255  Mask:255.255.255.0
         inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2908 errors:0 dropped:0 overruns:0 frame:0
         TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:122136 (119.2 KiB)  TX bytes:468 (468.0 b)

vlanbr5   Link encap:Ethernet  HWaddr 00:13:D4:B9:3A:22  
         inet addr:10.20.5.200  Bcast:10.20.5.255  Mask:255.255.255.0
         inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2908 errors:0 dropped:0 overruns:0 frame:0
         TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:122136 (119.2 KiB)  TX bytes:468 (468.0 b)

Configurando uma maquina para acessar a vlan

Siga este howto para criar uma maquina virtual debian alterando somente a variavel no arquivo de configuração da maquina virtual para a vlan desejada:

import commands
krn_vers = commands.getoutput('uname -r')
builder = 'linux'
name ='debian'
disk = [ 'phy:/dev/VGxen/debian.disk,xvda,w' ]
memory = 512
vif = [ 'bridge=vlanbr3' ]
kernel = '/boot/vmlinuz-' + krn_vers
ramdisk = '/boot/initrd.img-' + krn_vers
root = '/dev/xvda2 ro'
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
extra = 'xencons=xvc console=xvc0 video=tty'
vfb = [ 'type=vnc,vncunused=-1' ]

Conclusão

É possivel ter um setup complexo com maquinas virtuais obedecendo as suas definições de networking integrando o Xen com seus ativos de rede de modo a obedecer as políticas de segurança de rede definidas em seu ambiente. Este setup apresentado foi executado em um ambiente de produção. O Xen e o Linux se mostraram estáveis e robustos para esta solução não ocorrendo perdas ou overhead de qualquer natureza. De fato ambos os projetos se mostraram muito maduros para o objetivo proposto e nos deram satisfação desde a concepção do projeto até a sua execução.

Breve irei postar um benchmark comparando acesso à rede em um linux nativo, em uma maquina virtual com a bridge tradicional do xen e com esta solução.
Ferramentas pessoais