Monitoramento do Proxmox Virtual Environment (PVE) com Prometheus

Saturday, March 7, 2020

Neste artigo estarei dando início à uma série sobre monitoramento com Prometheus e para iniciar quero mostrar como provisionar uma stack simples para monitorar o Proxmox Virtual Environment (PVE), pois o utilizo bastante para provisionar minhas VMs de estudo.

O Prometheus é um sistema de monitoramento open-source desenvolvido pela SoundCloud e que hoje é graduado pela Cloud Native Computing Foundation.

O Proxmox Virtual Environment é uma plataforma open-source de virtualização. Pra mim, o melhor projeto open-source de virtualização.

Para continuarmos, preciso que você já estude ou trabalhe com as ferramentas abordadas aqui, pois não irei me aprofundar em cada uma delas. Meu objetivo é te proporcionar um norte nessa jornada sobre monitoramento do PVE.

Criando um usuário específico para monitoramento no PVE

Seguindo a primeira boa prática, criaremos um usuário somente leitura chamado prometheus na qual terá a role PVEAuditor. O objetivo desse usuário é somente ter acesso as metricas do PVE.

Conectado via SSH como root no host PVE, utilize o utilitário ‘‘pveum’’ para criar o usuário em questão.

Crie um grupo chamado Monitoring Group.

pveum group add monitoring -comment 'Monitoring Group'

Conceda a permissão PVEAuditor ao grupo criado.

pveum aclmod / -group monitoring -role PVEAuditor

Agora crie o usuário prometheus.

pveum user add prometheus@pam

Adicione o usuário no grupo monitoring. Dessa forma ele herdará a role PVEAuditor.

pveum usermod prometheus@pam -group monitoring

Finalize essa parte criando uma senha para o usuário prometheus.

pveum passwd prometheus@pam

Instalando o Exporter

Para que o Prometheus colete as métricas do PVE utilizaremos um exporter na qual conversa com a API do hypervisor e exporte as métricas num formato na qual o Prometheus conheça.

Utilizaremos um exporter sensacional escrito em Python, desenvolvido pelo usuário znreol. O cara mandou muito bem. Clique aqui para conferir o projeto no Github.

Ainda conectado via SSH no host PVE com o usuário root execute os passos abaixo.

Instale o pip.

apt install python-pip -y

Na sequência, instale o virtualenv.

pip install virtualenv

Crie um ambiente Python isolado para instalarmos o exporter.

virtualenv /opt/prometheus-pve-exporter

Agora sim instale o exporter com o comando abaixo.

/opt/prometheus-pve-exporter/bin/pip install prometheus-pve-exporter

O resultado do comando acima precisa ser semelhante ao resultado abaixo.

Successfully installed Werkzeug-1.0.0 certifi-2019.11.28 chardet-3.0.4 idna-2.9 prometheus-client-0.7.1 prometheus-pve-exporter-1.1.2 proxmoxer-1.0.4 pyyaml-5.3 requests-2.23.0 urllib3-1.25.8

Crie o arquivo /etc/prometheus/pve.yml com o seguinte conteúdo:

default:
  user: prometheus@pam
  password: 8JJ7te6zepQnO74Jt2urc1VkxXPsTG
  verify_ssl: false
  • user: usuário criado nos passos acima com permissão PVEAudit.
  • password: senha atribuída ao usuário prometheus@pam.
  • verify_ssl: parâmetro para ignorar erros devido a certificados não reconhecidos.

Crie o usuário exporter.

useradd --user-group --no-create-home --shell /sbin/nologin --comment "Prometheus Exporter" exporter

Crie o arquivo /etc/systemd/system/pve_exporter.service.

[Unit]
Description=Prometheus Exporter for Proxmox VE
Documentation=https://github.com/znerol/prometheus-pve-exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple

User=exporter
Group=exporter

ExecStart=/opt/prometheus-pve-exporter/bin/pve_exporter /etc/prometheus/pve.yml

Restart=on-failure

[Install]
WantedBy=multi-user.target

Recarregue as configurações do systemd.

systemctl daemon-reload

Habilite o serviço para ser inicializado no boot do sistema operacional, mas que também o execute de imediato.

systemctl enable --now pve_exporter.service

Confira se ficou tudo OK com o serviço executando o comando abaixo.

systemctl status pve_exporter.service

Por padrão, o serviço do exporter utiliza a porta 9122/tcp.

Lembrando que todo o processo realizado acima pode ser automatizado com o uso do Ansible, por exemplo. Principalmente quando você suporta vários nós PVE.

Configurando o Prometheus

Toda a stack de monitoramento que utilizo roda sob containers Docker, com isso você precisa possuir algum conhecimento sobre.

Faça o clone do meu repositório contendo os arquivos necessários para execução do Prometheus.

git clone https://github.com/ewerton-silva00/pve-monitoring.git

O diretório pve-monitoring possui a seguinte estrutura.

../monitoring-pve
├── alertmanager
│   └── alertmanager.yml
├── docker-compose.yml
├── prometheus
│   ├── alerts.yml
│   └── prometheus.yml
├── pve_monitoring.json
└── README.md

2 directories, 6 files

No arquivo prometheus.yml você definirá os targets, ou seja, os hosts PVE na qual você quer monitorar.

  - job_name: 'pve'
    metrics_path: /pve
    params:
      module: [default]
    static_configs:
      - targets: ['pve.meudominio.local:9221']
        labels:
          costumer: 'blog'
          environment: 'desenvolvimento'
          hostname: 'pve.meudominio.local'

Perceba que os hosts monitorados são definidos na sessão scrape_configs e no exemplo acima, o host que estou definindo para ser monitorado se chama pve.meudominio.local.

Veja também que defino três labels para esse job_name. Isso facilita no momento em que precisamos elaborar as queries para extração de métricas, pois posso executar sempre as mesmas queries com o detalhe de que os resultados variam de acordo com as labels definidas. Útil também para estabelecer uma distinção entre os ambientes à serem monitorados e prioridade dos alertas.

Para saber mais, indico fortemente a leitura da documentação oficial do Prometheus, pois o que estou mostrando aqui é somente o básico.

Inicializando a stack de monitoramento

Por que stack?

Aqui serão executados vários containers/serviços, uns conversando com os outros.

  • Traefik: esse serviço será responsável pelo proxy reverso. Assim evitaremos ficar acessando os serviços via IP + Porta.
  • Prometheus: como já mencionado, esse serviço é o coração de toda a stack. Ele quem irá coletar e processar todas as métricas.
  • AlertManager: esse serviço será responsável pelos alertas, ou seja, nele definimos como, quando e para onde as notificações são enviadas.
  • Grafana: nesse serviço criamos os dashboards para acompanhamento visual do nosso cenário monitorado.

Crie uma network chamada public_network. Será nessa network que o traefik conversará com os demais containers que serão acessados via proxy.

docker network create public_network

Agora, adicione no seu /etc/hosts o seguinte conteúdo:

127.0.0.1 traefik.meudominio.local
127.0.0.1 prometheus.meudominio.local
127.0.0.1 alertmanager.meudominio.local
127.0.0.1 grafana.meudominio.local

Inicialize a stack com o comando abaixo.

docker-compose up --detach

O arquivo docker-compose.yml está adaptado para ser executado apenas como ambiente de estudos, por isso não há volumes criados.

Caso necessite, basta criar os volumes para persistência dos dados.

Feito! Com os containers em execução, basta chamar no browser o nome dos serviços e começar a brincadeira.

No meu exemplo, posso chamar no browser o endereço http://pve.meudominio.local:9221/pve?target=localhost para ter uma idéia de como as métricas são modeladas para o Prometheus.

No Prometheus, confira na aba Status / Targets se o endpoint do PVE está com o status UP.

No arquivo alerts.yml definimos as regras para os alertas. Aqui no nosso exemplo criei apenas dois na qual notifica quando um exporter está down e quando uma VM também fica down.

- name: PVEAlerts
  rules:
  - alert: PVEGuestDown
    expr: sum by (costumer, environment, hostname, id) (pve_up{environment="desenvolvimento"}  == 0)
    for: 2m
    labels:
      severity: high
    annotations:
      summary: "A VM de id {{ $labels.id }} encontra-se indisponível."
      description: "VM indisponível no PVE {{ $labels.hostname }}, no ambiente de {{ $labels.environment }} do cliente {{ $labels.costumer }}."

No caso acima o alerta só irá funcionar quando o ambiente for de desenvolvimento. Apenas exemplo.

Criando um dashboard no Grafana

Acesse o endereço grafana.meudominio.local, informe grafana como usuário e grafana para senha. Em Add data source selecione o Prometheus e no campo URL informe http://prometheus:9090.

Na sequência importe o dashboard pve_monitoring.json disponível como arquivo no repositório baixado.

Com isso temos o seguinte:

Imagem 00Visão do PVE Node

Imagen 01Visão dos Guests

Imagen 02Visão da utilizaçao de recursos dos guests

Chegamos então no fim deste artigo. Agora você já possui o norte que faltava para desenvolver uma stack de monitoração.

Essa stack pode ficar ainda mais robusta, adicionando os receivers, que são os alvos das notificações, como por exemplo: Rocketchat, Slack, Telegram, E-mail…

Em ambientes maiores e mais complexos podemos integrar o Prometheus à um serviço de Service Discovery, como por exemplo o Consul. As possibilidades são inúmeras.

Obrigado por ter lido este artigo. Sucesso!

proxmoxproxmoxprometheus

Provisionando um repositório privado para Vagrant Boxes

comments powered by Disqus