Tabela de conteúdo
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 instalado – Tutorial 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
Receio que tenhas esquecido de colocar qual a imagem utilizar nesse comando:
# docker run -d -v /root/nginx-templates/index.html:/usr/share/nginx/html/index.html –name servidor-nginx1 -h servidor-nginx1.devopslab.com.br