Bond-vlan-xen
De Xen-BR wiki
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.