Desenvolvimento

12 out, 2016

Aprendendo sobre Docker Overlay

Publicidade

Oi, pessoal!

Como vimos neste artigo, é possível utilizar plugins diversos para resolver o desafio da rede, e mostramos neste aqui  um pouco da teoria de como usar o driver de overlay. Hoje, queremos mostrar isso na prática e, para isso, nada melhor do que colocar a mão na massa, certo?  Claro, mas antes precisamos entender um pouco de teoria, e lá vamos nós.

Se você estiver utilizando o Swarm, não é necessário configurar um serviço de chave-valor externo, pois o próprio Swarm faz o controle e persistência das informações de rede que você utiliza. E você deve ter cuidado, pois se quiser utilizar o Overlay com um serviço externo de chave-valor, o modo de cluster via Swarm fica impossibilitado.

Veja abaixo uma tabela com algumas informações relevantes sobre o funcionamento do Overlay:

Protocolo Porta Descrição
udp 4789 Data plane (VXLAN)
tcp/udp 7946 Control plane

Ou seja, você deve cuidar para que em seus firewalls essas portas estejam liberadas; caso contrário, a comunicação entre os nós não ocorrerá, o que impossibilitará o funcionamento do Overlay.

Veja abaixo os principais parâmetros em que você deve ter atenção:

  • –cluster-store=PROVIDER://URL: Endereço do seu servidor/serviço de chave-valor
  • –cluster-advertise=HOST_IP|HOST_IFACE:PORT: IP ou interface do host que será utilizado para comunicação do cluster
  • –cluster-store-opt=KEY-VALUE OPTIONS: Configuração opcional, onde é possível definir regras de monitoramento dos hosts e validação TLS

Ok, Cristiano, entendi tudo isso, mas, como vamos testar, qual será o ambiente de laboratório que vamos seguir? Vamos lá, para exemplificar como será o ambiente que vamos montar, segue abaixo uma imagem que ilustra o funcionamento do Docker com o serviço de chave-valor. Todos os hosts consultam esse serviço para identificar quais redes existem e qual bloco/ip deve ser alocado por container. Veja:

docker-1

Vamos colocar a mão na massa?

Dependências/configuração

Você deve ter um serviço de chave-valor, no qual o Docker persistirá as informações de rede que você criar. Em nosso lab, utilizamos o Consul dentro de um container Docker, rodando em um server a parte dos que participarão do ambiente multi-host. Para isso, executamos:

[root@consul ~]# docker run -d  -p "8500:8500"  -h "consul"  progrium/consul -server -bootstrap

Dessa forma, iniciamos um container com Consul, mapeando a porta 8500 do host para o container, ou seja, para ter acesso ao serviço do Consul, basta acessar ip-do-host:8500. Agora, vamos ao nosso ambiente de Docker.

Nos hosts de Docker (obviamente você já tem o Docker instalado, mas se quiser saber como instalar, veja este artigo), você precisará configurar o daemon para consultar o Consul e buscar as informações de rede. Em nosso laboratório, utilizamos o CentOS; com isso, o arquivo a ser modificado é o: /lib/systemd/system/docker.service, e o deixamos da seguinte forma:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-advertise=eth0:2376 --cluster-store=consul://ip-do-consul:8500
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target

Feito isso, basta reiniciar o serviço e seguirmos para o próximo passo.

Utilização/testes

Agora que você já definiu um serviço de chave-valor a ser consultado, basta criar a sua rede com o driver Overlay. Para isso:

[root@docker01 ~]# docker network create --driver overlay rede1

Você pode definir ainda qual o bloco de ip que deseja para essa rede. Caso não faça essa definição, o Docker associará um bloco automaticamente para você. Fácil, certo? Basta testarmos; para isso, vamos validar em todos os hosts se ambos estão visualizando a mesma rede. Execute este comando em qualquer outro host:

[root@docker01 ~]# docker network ls

Será retornado algo como isto:

NETWORK ID          NAME                DRIVER
64507d0be843f        rede1               overlay
d0bdae8fbe7bd        bridge              bridge
1c0eb8f68962d        none                null
3412c2496d0eb        host                host
697102a22e8d2        docker_gwbridge     bridge

Vamos utilizar essa rede; crie os containers em pelo menos 2 hosts, informando essa nova rede, veja:

[root@docker01 ~]# docker run -it --net=rede1 centos /bin/bash

Agora basta pingar ou acessar os serviços entre os containers que estão nessa mesma rede.

Dessa forma, você pode definir uma rede diferente por grupo de containers, e pode ainda isolar essas redes utilizando o método VXLAN. Para isso, deve passar como parâmetro na criação da rede o seguinte argumento: –opt “com.docker.network.driver.overlay.vxlanid_list=257″. Esse parâmetro fará com que essa rede receba uma vlan, ou seja, todo o trafego direcionado a essa rede receberá uma identificação, impossibilitando que outros containers que não estejam nessa vlan tenham acesso a esse trafego. 

Grande abraço!