Conheça o projeto SwarmKit, do Docker
O Swarmkit é uma suite para escalonamento e orquestração para sistemas distribuídos, ele possui um sistema de descoberta de nós, dentre outras coisas.
Oi, pessoal!
Hoje, você não pode pensar em utilizar Docker em produção em larga escala sem ter alguma forma de automação e orquestração dessa “coisa”, graças a comunidade e algumas empresas, temos ferramentas que podem nos auxiliar nessas tarefas, todas juntas ou em partes, é claro. Atualmente as ferramentas mais conhecidas para orquestração e scale em Docker são Kubernetes e Mesos – existem muitos projetos mantidos pela comunidade nesse sentido, mas nenhum deles com tanta representatividade quanto aos mencionados anteriormente.
Para não ficar de fora desse mundo, a Docker vem trabalhando bastante em uma suite que atenda essa necessidade, e que futuramente seja incorporado ao Docker Data Center, o projeto chama-se Swarmkit e hoje vamos ver um pouco mais sobre ele.
O Que é?
O Swarmkit é uma suite para escalonamento e orquestração para sistemas distribuídos, ele possui um sistema de descoberta de nós, agendamento de tarefas, e utiliza o raft-based consensus para coordenação do cluster.
O que tem de bom?
- Como já mencionado, ele utiliza o raft-based consensus, isso garante uma melhor coordenação do cluster, eliminando assim o ponto único de falha.
- Todo os nós do cluster Swarm conversam de forma segura, e para ajudar nisso o Swarmkit utiliza TLS para autenticação, autorização e transporte dos dados entre os nós.
- Swarmkit foi projeto para ser simples, por isso ele é independente de base de dados externas, ou seja, tudo que você precisa para utilizá-lo já está nele.
Ele é composto basicamente de duas camadas: Worker e Manager nodes, para entender cada um:
Worker: responsável por executar as tarefas, utiliza um Executor e, por padrão, o Swarmkit vem com o Docker Container Executor, mas que pode ser trocado caso deseja.
Manager: basicamente é o nó eleito pelo administrador para ser o ponto central de administração, lembrando que quanto você adiciona um nó no cluster de Swarm você define se esse nó será Manager ou não.
Como outras ferramentas, para o Swarmkit as tarefas são organizadas em serviços, e para esse serviço você define o que deseja fazer, por exemplo: crie réplicas desse serviço todo dia as 10h, ou: atualize um container por vez baseado nessa nova imagem.
Features
- Oquestração
- Estado desejado: o Swarmkit analise constantemente o cluster, garantindo que todos os serviços estejam de acordo com o pretendido pelo usuário, isso faz com que um serviço seja provisionado em outro nó, caso algum falhe;
- Tipo de serviço: atualmente o Swarmkit suporta apenas 2 tipos: 1 – Réplicas, onde você define quantas cópias daquele container deseja, e 2 – Global, onde você especifica o que deve ser executado em cada nó do cluster;
- Atualização: você pode modificar a qualquer momento o estado de um serviço, seja para pará-lo ou escalá-lo. Quando você atualiza um serviço, por padrão ele executa essa tarefa de atualização de uma vez só para todos os nós do cluster, mas você pode definir de outras duas formas essa atualização: 1 – Paralela, onde o administrador define quantas tarefas de atualização podem ser executadas por mês ou 2 – Delay, dessa forma o Swarmkit executará as tarefas de atualização de serviço de forma sequencial, ou seja, uma tarefa só será executada caso a anterior já tenha terminado;
- Politicas de restart: a camada de orquestração monitora o estado das tarefas e reage às falhas aplicando a regra definida pelo usuário. Dentro dessas regras, o administrador pode definir o número máximo de tentativas de restart de um serviço, quanto tempo depois de uma falha esse serviço deve ser reiniciado etc. Por padrã, o Swarmkit reinicia o serviço dentro de outro nó disponível no cluster, isso garante que os serviços dos nós defeituosos sejam iniciados em outros nós o mais rápido possível.
- Agendamento
- Recursos: o Swarmkit sabe, através das checagens constantes, como está a saúde de cada nó; com isso, quando um serviço precisa ser reiniciado ou realocado, por padrão, essa tarefa será realizada no melhor nó do cluster;
- Restrições: o administrador pode limitar o reinício de um serviço em determinados nós, isso pode ser feito através de labels, exemplo: node.labels.foo!=bar1
- Gerenciamento de cluster
- State Store: permite ter uma visão macro de todo o cluster. Como suas informações ficam em memória, permite ao nó de gerenciamento tomar decisões de forma muito mais rápida e segura.
- Gerenciamento da topologia: o administrador pode alternar quais são os nós de gerenciamento e qual são os Workers através de chamadas de API ou CLI;
- Gerenciamento de nós: é possível definir um nó como pausado, por exemplo; com isso, os serviços que estavam alocados neste nó serão iniciados nos demais nós, assim como a execução de novas tarefas permanece bloqueada.
- Segurança
- TLS: todos os nós conversam entre si através de TLS, e os nós de gerenciamento agem como autoridade certificadora de todos os demais nós, e são responsáveis pela emissão de certificados para os nós que entram no cluster;
- Politica de aceitação: o administrador pode aplicar regras de auto-aceitação, aceitação manual ou troca de chaves. Isso, claro, na adição de novos nós ao cluster, por default o Swarmkit utiliza auto-aceitação;
- Troca de certificados: é possível definir a frequência com a qual serão alterados os certificados ssl utilizados para comunicação do cluster. Por padrão, o tempo é de 3 meses, mas pode-ser definir qualquer período maior que 30 minutos.
Vamos brincar?
Instalando
O Swarmkit foi desenvolvido em GO, então, tenha todo o ambiente pré-configurado e, claro, baixe as fontes para seu $GOPATH. Você pode utilizar:
[root@docker1 ~]# go get github.com/docker/swarmkit/
Acesse o diretório e execute:
[root@docker1 ~]# make binaries
Isso fará com que sejam instaladas as ferramentas para utilização do Swarmkit, em seguida, você pode testar sua instalação:
[root@docker1 ~]# make setup
[root@docker1 ~]# make all
Agora adicione o swarmd e swarmctl ao seu $PATH e seja feliz utilizando-o. Veja abaixo alguns exemplos.
Montando o Cluster
No primeiro nó, execute:
[root@docker1 ~]# swarmd -d /tmp/docker1 --listen-control-api /tmp/manager1/swarm.sock --hostname docker1
Nos demais nós, execute:
[root@docker2 ~]# swarmd -d /tmp/node-2 --hostname docker2 --join-addr 10.1.1.1:4242 [root@docker3 ~]# swarmd -d /tmp/node-3 --hostname docker3 --join-addr 10.1.1.1:4242
Você pode, agora, utilizar outro host para administrar o cluster, no nosso exemplo utilizando o docker4, veja:
[root@docker4 ~]# export SWARM_SOCKET=/tmp/manager1/swarm.sock [root@docker4 ~]# swarmctl node ls ID Name Membership Status Availability Manager status -- ---- ---------- ------ ------------ -------------- 6rj5b1zx4makm docker1 ACCEPTED READY ACTIVE REACHABLE * 91c04eb0s86k8 docker2 ACCEPTED READY ACTIVE nf6xx9hpf3s39 docker3 ACCEPTED READY ACTIVE
Criando os serviços
Vamos começar devagar. Veja como subir um ambiente em redis:
[root@docker4 ~]# swarmctl service create --name redis --image redis:3.0.5 6umyydpxwtzfs3ksgz0e
Listando os serviços:
[root@docker4 ~]# swarmctl service ls ID Name Image Replicas -- ---- ----- --------- 6umyydpxwtzfs3ksgz0e redis redis:3.0.5 1
Inspecionando o serviço:
[root@docker4 ~]# swarmctl service inspect redis ID : 6umyydpxwtzfs3ksgz0e Name : redis Replicass : 1 Template Container Image : redis:3.0.5 Task ID Service Instance Image Desired State Last State Node ------- ------- -------- ----- ------------- ---------- ---- 6umyydpxwtzfs3ksgz0e redis 1 redis:3.0.5 RUNNING RUNNING Up About an hour docker1
Atualizando serviço:
Conforme mencionado anteriormente, podemos atualizar o status de um serviço. No nosso exemplo vamos aumentar o número de replicas dele, veja:
[root@docker4 ~]# swarmctl service update redis --replicas 6 6umyydpxwtzfs3ksgz0e [root@docker4 ~]# swarmctl service inspect redis ID : 6umyydpxwtzfs3ksgz0e Name : redis Replicas : 6 Template Container Image : redis:3.0.5 Task ID Service Instance Image Desired State Last State Node ------- ------- -------- ----- ------------- ---------- ---- xaoyxbuwe13gsx9vbq4f redis 1 redis:3.0.5 RUNNING RUNNING Up About an hour docker1 y8cu8nvl1ggh4sl0xxs4 redis 2 redis:3.0.5 RUNNING RUNNING 10 seconds ago docker2 ksv9qbqc9wthkrfz0jak redis 3 redis:3.0.5 RUNNING RUNNING 10 seconds ago docker2 nnm9deh7t0op6rln3fwf redis 4 redis:3.0.5 RUNNING RUNNING 10 seconds ago docker1 4ya5eujwsuc6cr7xlnff redis 5 redis:3.0.5 RUNNING RUNNING 10 seconds ago docker3 9o4pmrz6q6pf9ufm59mk redis 6 redis:3.0.5 RUNNING RUNNING 10 seconds ago docker3
Vamos atualizar a imagem do serviço?
[root@docker4 ~]# swarmctl service update redis --image redis:3.0.6 6umyydpxwtzfs3ksgz0e [root@docker4 ~]# swarmctl service inspect redis ID : 6umyydpxwtzfs3ksgz0e Name : redis Replicas : 6 Template Container Image : redis:3.0.6 Task ID Service Instance Image Desired State Last State Node ------- ------- -------- ----- ------------- ---------- ---- xaoyxbuwe13gsx9vbq4f redis 1 redis:3.0.6 RUNNING RUNNING 5 seconds ago docker3 y8cu8nvl1ggh4sl0xxs4 redis 2 redis:3.0.6 RUNNING RUNNING 6 seconds ago docker1 ksv9qbqc9wthkrfz0jak redis 3 redis:3.0.6 RUNNING RUNNING 5 seconds ago docker2 nnm9deh7t0op6rln3fwf redis 4 redis:3.0.6 RUNNING RUNNING 6 seconds ago docker1 4ya5eujwsuc6cr7xlnff redis 5 redis:3.0.6 RUNNING RUNNING 6 seconds ago docker2 9o4pmrz6q6pf9ufm59mk redis 6 redis:3.0.6 RUNNING RUNNING 6 seconds ago docker3
Por padrão, todos os containers foram atualizados de uma única vez; isso tem suas vantagens e desvantagens, mas como explicado, você pode mudar essa execução para fazer em partes, veja:
[root@docker4 ~]# swarmctl service update redis --image redis:3.0.7 --update-parallelism 3 --update-delay 20s
Com isso, serão refeitos 3 containers por vez e entre eles terá um intervalo de 20 segundos.
Gerenciando nós
O Swarmkit monitora a saúde de cluster e, baseado nisso, toma ações em cima dos serviços, você pode realizar ações manuais também, como por exemplo, retirar um nós do cluster, veja:
[root@docker4 ~]# swarmctl node drain docker1 [root@docker4 ~]# swarmctl node ls ID Name Membership Status Availability Manager status -- ---- ---------- ------ ------------ -------------- 6rj5b1zx4makm docker1 ACCEPTED READY DRAIN REACHABLE 91c04eb0s86k8 docker2 ACCEPTED READY ACTIVE REACHABLE * nf6xx9hpf3s39 docker3 ACCEPTED READY ACTIVE REACHABLE [root@docker4 ~]# swarmctl service inspect redis ID : 6umyydpxwtzfs3ksgz0e Name : redis Replicas : 6 Template Container Image : redis:3.0.7 Task ID Service Instance Image Desired State Last State Node ------- ------- -------- ----- ------------- ---------- ---- xaoyxbuwe13gsx9vbq4f redis 1 redis:3.0.7 RUNNING RUNNING 2 minute ago docker2 y8cu8nvl1ggh4sl0xxs4 redis 2 redis:3.0.7 RUNNING RUNNING 2 minute ago docker3 ksv9qbqc9wthkrfz0jak redis 3 redis:3.0.7 RUNNING RUNNING 30 seconds ago docker2 nnm9deh7t0op6rln3fwf redis 4 redis:3.0.7 RUNNING RUNNING 34 seconds ago docker3 4ya5eujwsuc6cr7xlnff redis 5 redis:3.0.7 RUNNING RUNNING 28 minutes ago docker2 9o4pmrz6q6pf9ufm59mk redis 6 redis:3.0.7 RUNNING RUNNING 29 seconds ago docker3
O Swarmkit é uma ferramenta em desenvolvimento ainda, mas você pode utilizá-la em seus labs e entender um pouco melhor como pode trabalhar em cluster com Docker.
Espero que tenham gostado!
Abraço!







