Oi, pessoal!
Queremos trazer para vocês hoje uma solução para coleta e visualização de métricas para o Docker Swarm. Um dos maiores desafios, principalmente para as equipes de operações, é saber o quanto está sendo utilizado por cada container. OK, existem soluções na engine do Docker, como é o caso do docker stats, mas e quando você tem diversos hosts, e eles estão em cluster e não está definido quais containers estão em cada host. Complicou, né?!
A intenção com este artigo é mostrar como é possível ter, de forma fácil, todas as informações de consumo de seu cluster, utilizando soluções simples, e que a maioria de vocês já deve ter visto. Para este lab vamos usar o Cadvisor, Influxdb e Grafana. Vamos entender melhor onde cada um irá atuar neste ambiente.
Cadvisor
O Cadvisor é uma ferramenta desenvolvida justamente para realizar a coleta de recursos de containers/aplicações dentro de um servidor. É possível estender seu uso através de integração com a API que essa ferramenta disponibiliza, e enviar os dados coletados para diversos backends. Em nosso lab, vamos utilizar o InfluxDB, que você verá logo abaixo o que é e como funciona.
InfluxDB
Para quem não conhece, o InfluxDB faz parte de um conjunto de soluções da empresa InfluxData, que tem seus produtos voltadas para análise, monitoramento e armazenamento de informações cronológicas. O InfluxDB é conhecido como um data series database, que serve justamente para armazenar dados em ordem cronológica.
Grafana
O Grafana talvez seja uma das mais completas ferramentas para criação e exibição de gráficos, e uma ferramenta extremamente flexível e adaptável, tendo como input diversos tipos de backend, o que facilita ainda mais o nosso lab. Você pode inclusive ter mais datasources e montar o seu dashboard unindo todas as essas informações. Bacana, né?
Ok, teoria é muito bonita, mas… Vamos praticar?
Primeiramente, você deve ter em execução o seu cluster. Caso não tenha feito isso ainda, faça agora; caso tenha dúvidas, veja este artigo, onde mostramos na prática como fazê-lo. Certo! Agora vamos criar os serviços de coleta para o nosso cluster. Para isso, você pode executar o seguinte passo-a-passo:
- Crie uma rede do tipo overlay para que seja possível a comunicação entra as ferramentas, e que essa comunicação seja realizada de forma isolada:
$ docker network create -d overlay --attachable coleta
- Em um dos dos hosts (de preferência o menos utilizado), crie o servidor de Influx, que será utilizado como backend para as informações coletadas:
$ docker run -d --restart=always -v /data:/var/lib/influxdb --network coleta --name influx influxdb
- Devemos criar a database dentro do influx para que seja possível salvar as informações:
$ docker exec -it influx influx -execute 'CREATE DATABASE cadvisor'
- Ok, agora basta criar o serviço de coleta no cluster:
$ docker service create --name agentes --network coleta --mode global --mount type=bind,source=/,destination=/rootfs,readonly=true --mount type=bind,source=/var/run,destination=/var/run --mount type=bind,source=/sys,destination=/sys,readonly=true --mount type=bind,source=/var/lib/docker,destination=/var/lib/docker,readonly=true google/cadvisor -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086
Se tudo correu bem, você deve terá criado um serviço do tipo global, ou seja, cada host de seu cluster terá um container desse tipo (Cadvisor), e todos eles enviarão os dados para o banco influx. Para ter certeza de que tudo correu bem, você pode executar o comando:
$ docker service ls
Dessa forma, você visualizará os serviços que estão em execução, e terá certeza de que os containers iniciaram em todos os nós. O retorno do comando deverá ser algo parecido com isso:
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 5ras37n3iyu2 agentes global 2/2 google/cadvisor:latest
Viu? Tudo certo. Mas ainda não acabou. Continuando…
- A última etapa é subir nosso serviço de Grafana para podermos visualizar as informações que foram coletadas pelo Cadvisor, e armazenadas no InfluxDB. Execute:
$ docker run -d --restart=always -v /data:/var/lib/grafana --network coleta --name grafana -p 80:3000 grafana/grafana
Simples, né? Agora temos que acessar a interface do Grafana, para podermos configurar e termos os gráficos que desejamos, acesse: http://ip-do-host/login. Você visualizará a interface de acesso dele, como ilustrado abaixo:
Os dados de acesso default do Grafana são:
- User: admin
- Password: admin
Estando dentro da interface do Grafana, vá até “Source” e adicione uma nova fonte de dados. Nela informe “InfluxDB”, conforme imagem abaixo:
Após clique em “save & test” para validar o acesso ao seu InfluxDB. Se tudo ocorrer conforme o planejado, você terá sucesso nessa adição e, em seguida, deverá montar o gráfico baseado nas informações que estão no banco. Para isso, existem duas formas: uma mais complexa, onde você precisará montar as querys e depois criar o gráfico com essas querys, ou importar um template pronto para isso. E neste caso, eu agradeço ao Hanzel Jesheen pela contribuição à comunidade, em ter criado o template e disponibilizado em seu github.
Você pode baixar este arquivo, salvar em seu computador e depois ir até a área de Dashboard de seu Grafana e clicar em import, informe o caminho de onde salvou o template, escolha o source criado anteriormente e depois clique em “import”, conforme imagem abaixo:
Parabéns! Você acaba de montar seu sistema de coleta e visualização de recursos para todo o seu cluster! Indo até Dashboards – Cadvisor você terá uma visualização parecida com esta:
Bacana, não?!
A partir desse protótipo, você pode evoluir seu ambiente para atender a sua demanda. Em nosso lab, a coleta é realizada pelo Cadvisor e enviada ao InfluxDB a cada 60 segundos. Isso quer dizer que o gráfico tem um delay de um minuto entre a coleta e a visualização; para alguns, isso é problema, para outros não. Outro ponto que você deve se atentar é: quanto mais containers você tiver, mais poluído ficará o seu gráfico; isso por motivos óbvios, então talvez você precisa alterar o layout do dashboard. Ah! Não se esqueça de trocar a senha do usuário admin do Grafana.
Por hoje era isso gente. Espero que isso ajude vocês!