Neste artigo, irei cobrir o monitoramento de containers em Docker com o Zabbix. Nós usaremos o template oficial Docker by Zabbix agent 2 para fazer as coisas mais simples possíveis. O link para download do template e os passos para configurá-lo podem ser encontrados na página de Integrações do Zabbix.
Se você necessitar de um guia visual, eu te convido para assistir ao meu vídeo sobre esse tópico.
Importando o template oficial para Docker
Já que faremos uso do template oficial Docker by Zabbix agent2, primeiro, nós precisamos nos certificar que o template está disponível em nossa instância Zabbix. O template está disponível para o Zabbix nas versões 5.0, 5.4 e 6.0. Se você não conseguir encontrar esse template em Configurações – Templates, é possível que você não tenha importado ele em seu ambiente após realizar o upgrade do Zabbix para uma das versões previamente citadas.
Lembre-se de que o Zabbix não modifica ou importa quaisquer templates durante o processo de upgrade, então teremos que realizar a importação manualmente. Se for esse o caso, simplesmente faça o download na página do git oficial do Zabbix (ou através do link na introdução) e importe para sua instância Zabbix utilizando o botão “Importar” na seção Configurações – Templates.
Instalando e configurando Zabbix agent2
Antes de começarmos configurando nosso host, precisamos realizar a instalação do Zabbix agent2 e configurá-lo de acordo com as diretrizes do template. Siga os passos na seção de download no website da Zabbix e instalar o pacote do zabbix-agent2.
Sinta-se livre para usar qualquer outro método de deployment que você quiser (como compilar o agent a partir do source files).
Instale o repositório de pacotes Zabbix:
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
Instale o pacote Zabbix agent2:
dnf install zabbix-agent2
Configure o parâmetro Server preenchendo com com o endereço de seu Zabbix server/proxy:
vi /etc/zabbix/zabbix_agent2.conf
### Option: Server # List of comma delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies. # Incoming connections will be accepted only from the hosts listed here. # If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally # and '::/0' will allow any IPv4 or IPv6 address. # '0.0.0.0/0' can be used to allow any IPv4 address. # Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com # # Mandatory: yes, if StartAgents is not explicitly set to 0 # Default: # Server= Server=192.168.50.49
Configuração específica para Plugin do Zabbix agent2
Zabbix agent2 provê parâmetros de configuração específicos para plugins. A maioria destes são parâmetros opcionais relacionados a um plugin específico. Você pode encontrar a lista completa dos parâmetros de configuração específicos para plugins na documentação do Zabbix.
Nas novas versões do Zabbix agent2, os parâmetros específicos de plugin são definidos em um arquivo de configuração de plugins separado, localizado em /etc/zabbix/zabbix_agent2.d/plugins.d/, enquanto em versões mais antigas eles são definidos diretamente no arquivo de configuração zabbix_agent2.conf.
Para o plugin Docker do Zabbix agent 2, é necessário prover a localização do unix-socket do daemon Docker. Isso pode ser feito especificando o seguinte parâmetro de plugin:
### Option: Plugins.Docker.Endpoint # Docker API endpoint. # # Mandatory: no # Default: unix:///var/run/docker.sock # Plugins.Docker.Endpoint=unix:///var/run/docker.sock
A localização padrão do socket será a correta para o seu ambiente Docker – nesse caso, você pode deixar a configuração como está.
Uma vez que as mudanças necessárias tenham sido realizadas nos arquivos de configuração do Zabbix agent2, inicie e habilite o agent:
systemctl enable zabbix-agent2 --now
Verifique se o Zabbix agent2 está rodando:
tail -f /var/log/zabbix/zabbix_agent2.log
Antes de seguirmos para o frontend do Zabbix, eu gostaria de chamar a atenção para a permissão do arquivo socket do Docker – o usuário Zabbix precisa ter acesso ao arquivo socket do Docker. O usuário Zabbix deve ser adicionado ao grupo Docker para resolver a seguinte mensagem de erro:
[Docker] cannot fetch data: Get http://1.28/info: dial unix /var/run/docker.sock: connect: permission denied
ZBX_NOTSUPPORTED: Cannot fetch data.
Você pode adicionar o usuário Zabbix ao grupo Docker executando o comando a seguir:
usermod -aG docker zabbix
Configurando o host Docker
Após importar o template, nós temos que criar o host que representará a nossa instância Docker. Dê ao host um nome e o adicione a um Grupo de host – eu adicionarei ao grupo Linux servers.
Defina o template Docker by Zabbix agent 2 para o host. Já que o template utiliza o Zabbix agent 2 para coletar as métricas, nós também precisamos adicionar uma interface do tipo Agent nesse host.
O endereço da interface deve apontar para a máquina onde estão rodando os seus containers Docker. Finalize a configuração do host clicando no botão “Adicionar”.
Docker by Zabbix agent2 template
O template contém um conjunto de itens padrão para métricas gerais da instância Docker, como o número de imagens disponíveis, informação da arquitetura do Docker, número total de containers, e mais.
Além disso, o template também coleta informações específicas de containers e imagens utilizando regras de descoberta abaixo nível (low-level discovery rules).
Uma vez que o Zabbix descobre seus containers e imagens, essas regras de descobertas serão utilizadas para criar itens, triggers, e gráficos a partir de protótipos para cada um de seus containers e imagens.
Desta forma, podemos monitorar métricas específicas, como memória de um container, informações de rede, status de um container, e mais.
Verificando configurações do host e template
Para verificar que o agent e o host estão configurados corretamente, podemos utilizar a ferramenta de linha de comando zabbix-get para buscar informações de nosso agent. Se você não tiver o zabbix-get instalado, utilize o comando abaixo em seu Zabbix server ou Zabbix proxy:
dnf install zabbix-get
Agora podemos utilizar o zabbix-get para verificar se nosso agent pode obter as métricas relacionadas ao Docker. Execute o comando abaixo:
zabbix_get -s docker-host -k docker.info
Utilize o parâmetro -s para especificar o hostname de seu host com o agent, ou o endereço IP. O parâmetro -k especifica a chave (item key) da métrica que queremos obter de nosso agent com o zabbix-get.
zabbix_get -s 192.168.50.141 -k docker.info {"Id":"SJYT:SATE:7XZE:7GEC:XFUD:KZO5:NYFI:L7M5:4RGO:P2KX:QJFD:TAVY","Containers":2,"ContainersRunning":2,"ContainersPaused":0,"ContainersStopped":0,"Images":2,"Driver":"overlay2","MemoryLimit":true,"SwapLimit":true,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIP6tables":true,"Debug":false,"NFd":39,"OomKillDisable":true,"NGoroutines":43,"LoggingDriver":"json-file","CgroupDriver":"cgroupfs","NEventsListener":0,"KernelVersion":"5.4.17-2136.300.7.el8uek.x86_64","OperatingSystem":"Oracle Linux Server 8.5","OSVersion":"8.5","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","NCPU":1,"MemTotal":1776848896,"DockerRootDir":"/var/lib/docker","Name":"localhost.localdomain","ExperimentalBuild":false,"ServerVersion":"20.10.14","ClusterStore":"","ClusterAdvertise":"","DefaultRuntime":"runc","LiveRestoreEnabled":false,"InitBinary":"docker-init","SecurityOptions":["name=seccomp,profile=default"],"Warnings":null}
Além disso, também podemos utilizar chaves de descoberta de baixo nível – docker.containers.discovery[false] para checar o resultado da descoberta.
zabbix_get -s 192.168.50.141 -k docker.containers.discovery[false] [{"{#ID}":"a1ad32f5ee680937806bba62a1aa37909a8a6663d8d3268db01edb1ac66a49e2","{#NAME}":"/apache-server"},{"{#ID}":"120d59f3c8b416aaeeba50378dee7ae1eb89cb7ffc6cc75afdfedb9bc8cae12e","{#NAME}":"/mysql-server"}]
Podemos ver que o Zabbix irá descobrir e começar a monitorar dois containers – apache-server e mysql-server. Qualquer regra de descoberta de baixo nível ou item pode ser verificado com zabbix-get.
Template Docker em ação
Agora que temos nosso host e agent configurados, aplicamos o template Docker, e verificamos que tudo está funcionando de acordo, nós devemos ser capazes de visualizar as entidades descobertas no frontend.
Além disso, nossas métricas devem estar começando a chegar. Podemos verificar na seção Latest data e verificar se elas foram realmente coletadas.
Por último, nós tempos algumas opções adicionais para modificações futuras do template e do resultado de nossa descoberta de baixo nível.
Se você abrir a seção Macros do seu host e selecionar Macros herdadas e de host, você poderá ver que temos 4 macros herdadas do template Docker. Essas macros são responsáveis pela filtragem de containers e imagens descobertas. Sinta-se livre para modificar esses valores se você deseja filtrar a descoberta dessas entidades de acordo com seus requisitos.
Note que o item de descoberta de container tem um parâmetro, que pode ser definido como false no template:
- docker.containers.discovery[false] – Descobre apenas containers em execução.
- docker.containers.discovery[true] – Descobre todos os containers, independente do estado.
E é isso! Nós importamos o template, instalamos e configuramos o Zabbix agent2, criamos um host, e aplicamos o template Docker com sucesso.
Por fim, nossa instância Zabbix está monitorando o ambiente Docker!
Se você tem quaisquer perguntas ou comentários, sinta-se livre para deixar uma mensagem na seção de comentários dessa publicação.