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, aqui no MundoDocker, 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 utiliza-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 utilizar um Executor, 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 replicas 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 – Replicas, 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 para-lo ou escala-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 as falhas aplicando a regra definida pelo usuário, dentro dessas regras o administrador pode definir número máximo de tentativos de restart de um serviço, quanto tempo depois de uma falha esse serviço deve ser reiniciado, etc. Por padrão 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 reinicio 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 se conversam 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 os 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 ele, 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 utilizar ela em seus labs e entender um pouco melhor como pode trabalhar em cluster com Docker. Espero que tenham gostado, e nos ajude divulgando o blog
Abraço!