Trabalhando com clusters no Docker Swarm

Neste post, vou falar um pouco sobre Docker Swarm, que é uma ferramenta do Docker que permite a criação de clusters de containers. Antes de começar a parte prática, vou repassar alguns conceitos.

 

O que é um Cluster?

De acordo com a Wikipedia: Cluster (do inglês cluster : ‘grupo, aglomerado’) consiste em computadores fracamente ou fortemente ligados que trabalham em conjunto, de modo que, em muitos aspectos, podem ser considerados como um único sistema. Diferentemente dos computadores em grade, computadores em cluster têm cada conjunto de nós, para executar a mesma tarefa, controlado e programado por software.

Tipos de cluster:

  • Alto desempenho: também conhecido como cluster de alta performance, ele funciona permitindo que ocorra uma grande carga de processamento com um volume baixo de gigaflops em computadores comuns e utilizando sistema operacional gratuito, o que diminui seu custo;
  • Alta disponibilidade: são clusters cujos sistemas conseguem permanecer ativos por um longo período de tempo e em plena condição de uso; sendo assim, podemos dizer que eles nunca param seu funcionamento; além disso, conseguem detectar erros se protegendo de possíveis falhas;
  • Balanceamento de carga: esse tipo de cluster tem como função controlar a distribuição equilibrada do processamento. Requer um monitoramento constante na sua comunicação e em seus mecanismos de redundância, pois, se ocorrer alguma falha, haverá uma interrupção no seu funcionamento.

 

Por que utilizar clusters?

  • Melhoria de Performance;
  • Disponibilidade de serviços;
  • Melhor utilização do hardware (balanceamento de carga);

 

O que é Docker Swarm?

Ele é a ferramenta nativa do Docker para orquestrar um cluster. Composto por uma série de nodes, que são engines do Docker sendo executadas em um mesmo host ou em servidores cloud. Se você estava na dúvida sobre o que é um node, sugiro que leia o post sobre como controlar um host do Docker remotamente, nele criamos e trabalhamos com vários nodes em um site chamado Play-With-Docker.

No Swarm, eles tem os seguintes papeis:

  • Leader Node (Node Líder): Utilizando o algoritmo de consenso Raft, ele orquestra as tarefas que devem ser despachadas para os workers. Só existe um líder por vez, se o atual parar de funcionar, outro pode tomar seu lugar;
  • Manager Nodes (Nodes Gerentes): Despacham tarefas para os workers e também tomam decisões relativas ao balanceamento de carga;
  • Worker Nodes (Nodes de Trabalho): Recebe tarefas (de um Node Gerente) que serão executadas. Nestes nodes existe um agente que reporta para o gerente o status da tarefa que está sendo executada.

 

O que é o algoritmo de consenso de Raft?

De acordo com a Wikipedia: O Raft é um algoritmo de consenso desenvolvido como uma alternativa ao Paxos. Ele foi concebido para ser mais compreensível que o Paxos por meio da separação da lógica, mas também é formalmente comprovado como seguro e oferece alguns recursos adicionais.

 

Como usar o Docker Swarm?

Vou utilizar a ferramenta Play-With-Docker (a mesma que já usamos nos posts anteriores da série).  Para esta parte do post, criei 5 nodes (instancias do docker) la no PWD. Poderíamos utilizar mais, mas este é o limite que eles definiram.

 

Inicializando o Docker Swarm

No node1, vou inicializar o Docker Swarm:

docker swarm init --advertise-addr <ip>

Explicando o comando acima:

  • docker swarm: Indica que vamos utilizar o comando swarm;
  • init: Inicializa swarm
  • –advertise-addr <ip>: Esta flag é necessária, sempre que o engine estiver rodando em alguma maquina que possua mais de um endereço IP. Quando é este o caso, você precisa especificar qual será utilizado.

Após executar este comando, se tudo der certo, vai aparecer uma mensagem parecida com esta assim:

Swarm initialized: current node (lnambce2g58abi88vgko4ap1b) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0tpkjvr57edfofi4ycbj17svssn1obbc0qc300e58se1z122pi-1n467rluzgcqjawhkkkgtjyhd 192.168.42.23:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

 

Isso quer dizer o swarm foi inicializado corretamente e ele já te forneceu o comando para permitir que os outros nodes se juntem a esta maquina, mas espere: Não saia utilizando este comando em todos os outros nodes! Ele é para adicionar outras como Workers!

 

Adicionando Workers

Como temos 5 nodes, vou deixar 3 como managers e os 2 últimos como workers. Sendo assim:

  • Clique no node 4;
  • Execute o comando:
docker swarm join --token SWMTKN-1-0tpkjvr57edfofi4ycbj17svssn1obbc0qc300e58se1z122pi-1n467rluzgcqjawhkkkgtjyhd 192.168.42.23:2377
  • Repita os dois passos anteriores, mas com o node5.

Se o comando acima der certo, você vai ver uma mensagem parecida com esta:

7rluzgcqjawhkkkgtjyhd 192.168.0.23:23770tpkjvab5adfdfdf4ycbj17svssn1obbc0qc300e58se1z192pi-1n467
This node joined a swarm as a worker.

 

Conferindo status do Swarm

Agora é um bom momento para verificarmos se o que foi feito até o momento está funcionando. Para fazer isso:

  1. Clique no node1. Como ele foi utilizado para inicializar o Swarm, ele é o Líder (e um manager).
  2. Utilize o comando:
docker node ls

 

Este comando vai listar todos os nodes que estão no swarm inicializado, os status e papeis deles.

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
lnambce2gabcdi88vgko4ap1b *   node1               Ready               Active              Leader              18.09.4
xl82fqxdskefgfdoazk312mud     node4               Ready               Active                                  18.09.4
7fhoxigkxsik93f9asdegi9yq     node5               Ready               Active                                  18.09.4

Na tabela acima, vemos que o primeiro node está marcado como Leader e os outros dois não possuem qualquer especificação na coluna “manager status”. Isso indica que eles são nodes workers.

 

Adicionando outros managers no Swarm

Até o momento, ainda temos 2 nodes que não fazem parte do Swarm e vou adicioná-los como managers. Para isso, preciso gerar um comando parecido com o que utilizamos para adicionar os workers, mas específico para o papel de manager.

docker swarm join-token manager

No comando acima:

  • docker swarm: utilizando o comando swarm;
  • join-token: vai gerar um comando que você pode utilizar em outros nodes, para que eles se juntem ao seu Swarm;
  • manager: este é o papel que será atribuído aos nodes que entrarem através deste comando. você poderia substituir manager por workers, se quisesse adicionar mais trabalhadores ao invés de gerentes.

 

Este comando vai gerar um retorno parecido com este:

To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0tpkjvr15auiofi4ycbj17svssn1obbc0qc300e58se1z192pi-6asdfgwro8p96sh67nimfstx6 192.168.42.23:2377

 

Para adicionar os outros managers:

  • Clique no node2
  • Execute o comando:
docker swarm join --token SWMTKN-1-0tpkjvr15auiofi4ycbj17svssn1obbc0qc300e58se1z192pi-6asdfgwro8p96sh67nimfstx6 192.168.42.23:2377
  • Repita os dois últimos passos, mas no node3.

 

Uma observação sobre o comando de adicionar managers/workers no Swarm: Você não precisa gerar um comando para cada node que vai adicionar. Pode gerar apenas um e utilizar em quantos forem necessários.

 

Conferindo (novamente) o status do Swarm

Utilizando o mesmo comando (docker node ls), vamos ver como está o nosso Swarm:

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
lnambce2g58abi88vgko4ap1b *   node1               Ready               Active              Leader              18.09.4
kp7sz62pzk4a8io0auau678or     node2               Ready               Active              Reachable           18.09.4
rxkr0z882n82s0berkvaanlb0     node3               Ready               Active              Reachable           18.09.4
xl82fqxdskclmtgoazk312mud     node4               Ready               Active                                  18.09.4
7fhoxigkxsik93f9uiyegi9yq     node5               Ready               Active                                  18.09.4

 

Agora temos os 5 nodes listados, sendo que 1 é o lider (node1), dois são gerentes (nodes2 e 3, que estão marcados como Reachable) e os outros dois estão definidos como Workers.

 

 

Criando serviço no Swarm

Agora que já temos todos os nodes no lugar e está tudo pronto, vem a pergunta: O que fazer com isso?

Bom, a primeira coisa vai será: Criar um serviço.

docker service create --name my_redis --replicas=10 redis

No comando acima:

  • docker service: utilizamos um comando de controle de serviços do docker;
  • create: indica que estamos criando um serviço;
  • –name my_redis: qual o nome deste serviço. funciona de forma similar ao nome que damos para um container;
  • –replicas=10: Indica quantas replicas (copias) deste container serão criadas;
  • redis: nome da imagem que será utilizada.

 

Conferindo serviços do Swam

Para conferir quais serviços estão rodando no Swarm, no node1 (líder) utilize o comando :

docker service ls

Ele vai exibir uma tabela com ID do serviço, nome (informado na flag –name), modo, quantidade de replicas, imagem utilizada e portas.

 

Outra opção é ver como os container estão distribuídos dentro do seu Swarm:

docker service ps <nome>

A tag <nome> deve ser substituída pelo nome que você utilizou na hora de criar o serviço. Neste caso, foi my_redis.

O resultado será uma lista que mostra quantos containers estão rodando em quais nodes.

 

Alterando o número de replicas no Swarm

Até o momento, temos 5 nodes, que estão 10 containers do Redis em execução. Mas e se você precisar de mais instâncias do Redis?

docker service update --replicas=22 my_redis

No comando acima, temos:

  • docker service: indica que estamos utilizando comandos relacionados ao serviços do docker Swarm
  • update: atualizando swarm
  • –replicas=22: mudando o número de containers simultâneos para 22.
  • my_redis: nome do serviço que será alterado.

 

Após executar este comando, o Docker vai tentar criar os novos containers e garantir que eles estão funcionando corretamente. Ao final do processo, você deve receber uma mensagem do tipo: “verify: Service converged“, o que indica que tudo deu certo.

 

Tolerância a falhas

No passo anterior, configurei o Swarm para ter 22 instancias do Redis, ao invés de 16, mas o que acontece se um dos containers falhar ou se um dos nodes for desligado/removido?

Se o container falhar, mas o node ainda estiver respondendo, o Docker vai subir um novo container. Todavia, se o node parar de responder, os containers que estavam neste node serão redistribuídos para os outros.

Desta forma, você sempre terá a quantidade de containers que precisa. Legal, não?

Claro que a aplicação destes conceitos e ferramentas no mundo real vai ser mais complicado, mas os conceitos estão aí.

 

 

Neste post falei sobre os comandos para criar, configurar e monitorar um cluster de containers, utilizando o Docker Swarm. Espero ter ajudado!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Conhecimento Técnico, Dev, Docker and tagged , .

One Comment

  1. Pingback: O que é e como usar o Docker Stack. – Raccoon Ninja

Comments are closed.