Criação de um Loadbalancer com Haproxy e containers Docker

1. Introdução

Segue uma stack utilizando o Loadbalancer HAproxy e containers Docker, portanto este tutorial irá abordar a criação de um Loadbalancer com HAProxy e balanceamento de carga entre containers Docker.

2. Pré-requisitos

Docker instaladoTutorial instalação do Docker.

Comunicação entre containers – Todos os containers precisam se comunicar, o ping tem que funcionar partindo de qualquer container em qualquer host docker.
Sugiro utilizar a rede Flannel para fazer esta comunicação, e aqui segue o tutorial de instalação do Flannel+Docker.

3. Criação da imagem e containers para o NGINX

Vamos criar as imagens utilizando o Dockerfile. O foco deste tutorial não é Dockerfile, mas em resumo Dockerfile são arquivos com instruções para a criação de imagens Docker.
Está bem intuitivo, se você nunca mexeu com Dockerfile não terá nenhum problema.

Definição do Dockerfile Nginx.
#vi Nginx-Dockerfile

#Utilizar o Centos Latest
FROM centos

#Quem mantem e criou a imagem - informacoes de contato.
MAINTAINER Leonardo DevOpsLab "leonardo@devopslab.com.br"

#Instala o Nginx e configura o Nginx.
RUN yum install -y epel-release
RUN yum install -y nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

#Start do Nginx
CMD ["nginx"]

Criação da imagem “nginximg” utilizando o Dockerfile “Nginx-Dockerfile”.

# docker build -t nginximg -f Nginx-Dockerfile .

O ponto final no comando é proposital.

Start do container rodando o Nginx.

# docker run -d -v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html --name servidor-nginx1 -h servidor-nginx1.devopslab.com.br

Arquivo index.html está sendo compartilhado entre o host docker e o container através do parâmetro:
-v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html“.
Você configura o arquivo index.html do jeito que você quiser.

Eu não preciso expor (EXPOSE) a porta do container Nginx, pois estou utilizando a rede Flannel, sendo assim todos os containers estão se comunicando, tem ping e acesso a todas as portas partindo de qualquer container da rede.

Repita o comando “docker run…” para todos os containers que você for criar.

4. Criação da Imagem Haproxy e criação do container de Loadbalancer

Definição do Dockerfile HAProxy.
#vi Haproxy-Dockerfile

#Utilizar o Centos Latest
FROM centos

#Quem mantem e criou a imagem - informacoes de contato.
MAINTAINER Leonardo leonardo@devopslab.com.br

#Instala o HAproxy.
RUN yum install -y haproxy

#Expor a porta 5000TCP no container.
EXPOSE 5000

#Start do haproxy
CMD ["haproxy", "-f", "/etc/haproxy/haproxy.cfg", "-p", "/var/run/haproxy.pid"]

Criação da imagem “haproxyimg” utilizando o Dockerfile “Haproxy-Dockerfile”.

# docker build -t haproxyimg -f HAproxy-Dockerfile .

Start do container HAproxy.

# docker run -d -p 80:5000 -v /root/dockerfiles/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg --name loadbalancer-haproxy -h loadbalancer-haproxy.devopslab.com.br haproxyimg

Arquivo haproxy.cfg está sendo compartilhado entre o host docker e o container Haproxy através do parâmetro:
“-v /root/dockerfiles/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg”.

Mapeamos a porta 80 do host para a porta 5000 do container:
-p 80:5000

Diferente dos containers rodando o Nginx, o Loadbalacer Haproxy precisa ter a porta 80 exposta, pois ela será acessível para o mundo.

Quando eu falo acessível para o mundo, quero dizer disponível em produção, acessível para clientes externos, ou simplesmente disponível para todas as redes do seu ambiente que não seja a rede do Docker.

Arquivo haproxy.cfg.
O arquivo haproxy.cfg foi copiado de uma instalação padrão do Haproxy.
* Foi comentado a linha “daemon”.
* Adicionei o pool de containers para responder pelas requisições, 5 containers no total.
* Foi definido uma url, no caso “exemplo.devopslab.com.br”.
* Tipo de balanceamento Roundrobin.

Segue o arquivo “haproxy.cfg” completo.

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    #daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:5000
    acl frontend-nginx	hdr(host) -i exemplo.devopslab.com.br
    use_backend servidores-nginx if frontend-nginx

backend servidores-nginx
    balance     roundrobin
    server  servidor-nginx1 10.0.96.2:80 check
    server  servidor-nginx2 10.0.12.3:80 check
    server  servidor-nginx3 10.0.89.3:80 check
    server  servidor-nginx4 10.0.58.2:80 check
    server  servidor-nginx5 10.0.91.2:80 check

5. Teste do Balanceamento de carga do HAproxy

Já está tudo pronto, então vamos testar.
Partindo de qualquer lugar da sua rede, faça um teste em direção do Loadbalancer; neste caso vou utilizar o comando “curl”.

$ for i in {1..10}; do echo "---------Teste curl $i-----------"; curl exemplo.devopslab.com.br; done
---------Teste curl 1-----------
SERVIDOR 1
servidor-nginx1

---------Teste curl 2-----------
SERVIDOR 2
servidor-nginx2

---------Teste curl 3-----------
SERVIDOR 3
servidor-nginx3

---------Teste curl 4-----------
SERVIDOR 4
servidor-nginx4

---------Teste curl 5-----------
SERVIDOR 5
servidor-nginx5

---------Teste curl 6-----------
SERVIDOR 1
servidor-nginx1

---------Teste curl 7-----------
SERVIDOR 2
servidor-nginx2

---------Teste curl 8-----------
SERVIDOR 3
servidor-nginx3

---------Teste curl 9-----------
SERVIDOR 4
servidor-nginx4

---------Teste curl 10-----------
SERVIDOR 5
servidor-nginx5

Utilizei um “for” bem simples, para fazer um get na url exemplo.devopslab.com.br.

6. Bônus

Docker Registry.
Se você tiver utilizando seu próprio Docker Registry para armazenar suas próprias imagens, o comando para iniciar um container seria algo assim:

# docker run -d -v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html --name servidor-nginx5 -h servidor-nginx5.devopslab.com.br repo-dockerimages.devopslab.com.br:5000/nginximg

Segue aqui o Tutorial Docker Registry.

É nóis =)

[]’s
Leonardo

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *