Por Paulo Elias Jr
Uma das vantagens de se trabalhar em nuvens que entregam infraestrutura como serviço é a facilidade de se configurar itens básicos de rede como regras de firewall, VPNs e acesso às redes externas. Um outro exemplo disso é a utilização de balanceadores de carga entre duas máquinas, também chamadas de instâncias. No mundo físico, a configuração deste item exige software e/ou hardware adicional e muitas vezes é superdimensionado devido as grandes capacidades de entrega de equipamentos dedicados. Só que muitas vezes, uma solução simples nos atende para pequenos ambientes que também precisam de balanceamento de carga. Neste artigo, vamos exibir como é simples realizar a configuração de balanceamento de carga entre duas instâncias no OpenStack.
Antes de tudo, é necessário que o agente neutron-lbaas-agent esteja instalado junto ao Neutron. É ele que realizará todos os procedimentos de monitoramento e balanceamento do pool que criaremos. Para verificar se já possui o agente instalado, acesse o Controller Node como administrador (utilizando o script com as variáveis de ambiente apropriadas) e execute o comando neutron agent-list
Caso o comando não retorne nenhuma informação, você pode realizar a instalação e configuração de acordo com a versão da sua cloud em https://wiki.openstack.org/wiki/Neutron/LBaaS/HowToRun. Também vamos utilizar o HAProxy como driver específico para balanceamento do conteúdo HTTP nas instâncias. Entretanto, esta implementação é bastante comum e dificilmente encontraremos ambientes sem esses agentes.
Configurar balanceamento de carga envolve seis curtas tarefas:
- Criar as instâncias que serão balenceadas
- Criar um Pool de Balanceamento
- Criar um Health Monitor
- Associar o Health Monitor ao Pool
- Criar um VIP para o Pool
- Associar um IP Flutuante ao Pool
Tarefa 1: Criar as Instâncias
Neste passo, configuramos duas instâncias e alocamos um IP flutuante para cada uma. Importante ressaltar que as instâncias devem ter acesso a uma rede externa por meio de um router e devem existir regras liberando o acesso à porta 80/TCP, conforme exibido abaixo.
figura 02
Em seguida, instalamos nelas o Apache com uma webpage simples, apenas para identificar os servidores e facilitar a visualização do balanceamento de carga em funcionamento.
figura 03
- Criar um Pool de balanceamento
Nota: Todos os comandos devem ser executados no Controller Node.
Para criar o pool de balanceamento, precisamos identificar a rede onde as instâncias estão conectadas. Esta informação será utilizada na criação do pool.
Execute o comando
neutron net-list
e copie o ID da rede interna do seu projeto, no nosso caso 192.168.1.0/24
Agora, crie o pool com o comando:
neutron lbpoolcreate –lbmethod ROUND_ROBIN –name Pool_Webserver –description “Pool WebServers Producao” –protocol HTTP –subnet-id <Id da rede> provider haproxy
Detalhando:
- –lbmethod: especifica qual o método para balanceamento utilizado, neste caso, Round Robin.
- –name, indica o nome do pool.
- –description, uma descrição do pool
- –protocol, protocolo que será balanceado, no caso HTTP.
- –subnet-id, id da rede onde as instâncias balanceadas estão.
- –provider, componente responsável pelo balanceamento, no caso, o HAProxy, conforme descrito acima.
figura 05
Para verificar o estado do pool, execute o comando:
neutron lb-pool-list
figura 06
O próximo passo é adicionar membros ao pool de balanceamento. Neste passo, vamos declarar que os dois servidores que criamos pertencem ao pool recém criado com os comandos:
neutron lb-member-create –address <endereço_ip_SRV1> –protocol-port 80 Pool_Webserver
neutron lb-member-create –address <endereço_ip_SRV2> –protocol-port 80 Pool_Webserver
Detalhando:
- –address, indica o ip do membro
- –protocol-port, porta de acesso onde o membro escutará conexões
Dica: Podemos obter os IPs com o comando nova list | grep <nome da instância>
Com os IPs em mãos, vamos criar os membros.
figura 08
Para verificar se os membros estão ok, insira o comando neutron lb-member-list
figura 09
Tarefa 3: Criar um Health Monitor
Nosso próximo passo é criar um Health Monitor, responsável por monitorar o estado dos membros e identificar se algum deles está com problemas, impedindo o redirecionamento de conexões a ele. O Health Monitor será vinculado ao pool que criamos anteriormente.
É possível criar o HealthMonitor com o seguinte comando:
neutron lb-healthmonitor-create –delay 3 –type HTTP –maxretries 3 –timeout 3
Detalhando:
- –delay, indica de quanto em quanto tempo o monitor enviará mensagens ao membro para verificar seu estado, no caso, de 3 em 3 segundos.
- –type, HTTP, indica o monitor de integridade utilizado, componente orientado à conexão que faz análises específicas no membro
- –max-retries, indica o numero máximo de falhas admitidas pelo monitor antes de declarar um membro como inativo
- –timeout, define o tempo máximo em que uma conexão deve ser estabelecida para que seja considerada como bem-sucedida, levando-a a expirar caso ultrapasse este intervalo.
Com as informações acima, vamos definir todas as métricas de tempo para 3 segundos e criar o monitor.
Nota: Copie o Id do Health Monitor.
Tarefa 4: Associar o Health Monitor ao Pool
Com o ID em mãos, execute o comando abaixo, que relaciona o monitor ao pool “Pool_Webserver”.
neutron lb-healthmonitor-associate <ID_do_HEALTHMONITOR > Pool_Webserver
figura 11
Tarefa 5: Criar um VIP para o Pool
Nosso penúltimo passo é criar o VIP para o balanceador de carga. Para criar o VIP, precisamos de um IP para tráfego na rede interna e um ip flutuante para acesso dos usuários na rede externa.
Vamos primeiro criar o VIP com o endereço interno, utilizando o ID da rede interna, obtido por meio do comando neutron net-list. Para criar o VIP, utilize o comando abaixo.
neutron lb-vip-create –name VIPWEB –protocol-port 80 –protocol HTTP –subnet-id <SUBNET_ID> Pool_WebServer
Detalhando:
- –name, define o nome do VIP
- –protocol-port, define a porta onde o VIP escutará as conexões, no nosso caso 80 (HTTP)
- –subnet-id, define o endereço da rede onde o VIP será alocado.
Executando o comando…
figura 12
Tarefa 6: Associar um IP Flutuante ao Pool
Nosso último passo será associar um ip flutuante ao VIP. Esta configuração especificamente é feita por meio do Horizon. Efetue login pelo seu browser favorito ao projeto no qual está sendo criado a nova estrutura de balanceamento.
Dica, aproveite o acesso para verificar as suas cotas de IPs flutuantes. Você só precisará de mais um.
figura 14
Em seguida, navegue até Computação > Acesso e Segurança > IPs Flutuantes e em seguida, clique em Alocar IP para Projeto.
figura 15
Selecione a rede correta (mesma rede pública na qual os clientes acessarão sua aplicação. Não confundir com o IP interno dos servidores) e clique em Alocar IP.
De volta à tela principal, identifique o IP não associado e clique em Associar.
figura 17
Em “Porta”, selecione o VIP e clique em Associar.
figura 18
Terminamos com as configurações. Agora vamos aos testes!
Em qualquer navegador, acesse http://ip_do_vip. Pressione Ctrl+F5 algumas vezes para verificar a alternância entre os servidores web.
Um outro teste que pode ser realizado é executando repetidamente o comando wget –O – http://ip_do_vip em qualquer máquina que tenha acesso ao VIP. Verifique os itens destacados abaixo que diferenciam um servidor do outro.
figura 20
Tendo resultados semelhantes a estes, seu balanceamento está configurado apropriadamente!
Load Balancing como serviço é apenas uma das vantagens de se trabalhar no modelo de Infraestrutura como serviço. Ainda é possível realizar a integração deste componente com appliances físicos como o F5 Big-IP para utilizar os recursos avançados da plataforma do fabricante na sua nuvem, garantindo a disponibilidade e mantendo baixos os custos de gestão e manutenção, itens que só SDN (Software-Defined Network) podem oferecer nessa nova geração de serviços de TI. Até a próxima.