Proxmox
January 24

Мониторинг Proxmox с Grafana

Теорию о пользе и важности мониторинга я опущу. Мониторинг может рассылать уведомления о превышении каких-то параметров, а расследование причин в моем конкретном случае заняло бы пару минут, а не часов.

TL:DR

Установка контейнера и настройка Docker

• Создаем LXC контейнер на Proxmox
• Устанавливаем Docker и связанные пакеты
• Скачиваем и редактируем конфигурационные файлы

Настройка Prometheus и Grafana

• Запускаем контейнеры Prometheus и Grafana
• Настраиваем Prometheus для мониторинга Proxmox
• Настраиваем Grafana для отображения данных Prometheus

Настройка Proxmox VE

• Создаем группу и пользователя для мониторинга
• Устанавливаем PVE-exporter и добавляем его в PATH
• Создаем файл конфигурации для PVE-exporter

Запуск PVE-exporter

• Запускаем PVE-exporter с указанием конфигурационного файла
• Проверяем, что PVE-exporter возвращает метрики
• Настраиваем автозапуск pve_exporter через systemd

Добавление дашборда Proxmox в Grafana

• Импортируем дашборд в Grafana
• Наслаждаемся результатом

Схема

  • На устройстве, которое мы хотим мониторить, запускается сервис по сбору различной телеметрии (использование ЦП, памяти, сети и пр.);
  • Эта информация передается на центральный узел, где собирается и хранится в базе данных;
  • Grafana берет данные из этой базы и рисует нам красивые графики.

Подготовка

Для начала нам надо графану где-то запускать. Да и не только графану, но об этом позже. Поэтому мы создадим LXC контейнер. Нет, не виртуалку с линуксом, ибо жрет много и смысла в данном случае нет, a LXC контейнер, который ест в разы меньше.

Заходим в хранилище local (не local-lvm) в веб интерфейсе proxmox (если у вас его нет, то посмотрите, где у вас хранятся ISO образы и резервные копии, вот туда вам надо). Выбираем вкладку CT Templates, далее Templates.

Перед нами открывается выбор шаблонов. Выбираем образ Debian 12 и нажимаем Download.

После того как мы загрузили Debian, он отобразится во вкладке CT Templates.

После чего выбираем Create CT.

В открывшемся окне указываем пароль и нажимаем Next.

В следующей вкладке выбираем шаблон.

Рамер диска и настройки памяти можно не трогать, ибо 8GB, 1 ядра и 512MB ОЗУ нам хватит.

В вкладке Network для IPv4 выбираем DHCP. Firewall снимаем галку.

Проходим до конца Next. Создаем и запускаем.

Переходим во вкладку Console, ждем пока загрузится и логинимся с паролем, который мы указали в самом начале создания контейнера.

Вводим команду ip a, чтобы не гадать потом на кофейной гуще почему же не работает apt update.

Как видим, IP адрес успешно получен, а значит и интернет у нас есть.

Резервируем адрес на роутере

Теперь надо присвоить статику. Присвоение статики зависит от того роутера, который вы используете, поэтому тут я подробно показывать не буду, т.к у меня Keenetic.

Находим наш контейнер, указываем постоянный IP адрес, подтверждаем и статика присвоена.

Так же можно задать статику на этапе создания контейнера, но я так предпочитаю не делать, ибо любое устройство может случайно занять эту статику, если контейнер будет выключен.

Настройка SSH

Я предпочитаю подключаться через SSH из клиента, поэтому меняю настройки и перезагружаю службу.

nano /etc/ssh/sshd_config

Находим закомментированную строку и редактируем параметр PermitRootLogin — задаем значение yes

Это я уже через SSH Termius
по умолчанию, значение может быть without-password или prohibit-password — оно разрешает вход для root средствами GSSAPI (не парольной аутентификации), например, смарт-карты или отпечатка пальца.

Сохраняемся и выходим из редактора: Ctrl+X, Y, Enter

Перезагружаем SSH службу

systemctl restart ssh

Docker в LXC

Почему Docker? Попробуй без VPN установить Grafana в 2025 году из России. Я пытался.

Далее пробуем подключиться через терминал и приступаем к установке Docker, согласно официальному ману для Debian.

# Обновляем список доступных пакетов из репозиториев.
apt-get update

# Устанавливаем пакеты `ca-certificates` и `curl`.
apt-get install ca-certificates curl
  
# Создаем директорию `/etc/apt/keyrings` с правами доступа `0755`.
install -m 0755 -d /etc/apt/keyrings
  
# Скачиваем GPG-ключ Docker и сохраняем его в файл `/etc/apt/keyrings/docker.asc`.
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc

# Устанавливаем права на чтение для всех пользователей на файл `docker.asc`.
chmod a+r /etc/apt/keyrings/docker.asc
  
# Добавляем репозиторий Docker в файл `/etc/apt/sources.list.d/docker.list`.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  
# Обновляем список пакетов после добавления нового репозитория Docker.
apt-get update
  
# Устанавливаем Docker и связанные с ним пакеты.
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  
# Запускаем тестовый контейнер `hello-world` для проверки корректности установки Docker.
docker run hello-world
Если у вас ubuntu, просто замените debian

Prometheus

# Создаем директорию `prometheus` с поддиректориями `config` и `snmp_exporter`.
mkdir -p prometheus/{config,snmp_exporter}

# Переходим в директорию `prometheus`.
cd prometheus

# Скачиваем файл `docker-compose.yml` для развертывания Prometheus и Grafana.
wget https://raw.githubusercontent.com/andrey-dvur/Scripts/main/Prometheus-Grafana/docker-compose.yml

# Переходим в директорию `config`.
cd config

# Скачиваем файл конфигурации `prometheus.yml`.
wget https://raw.githubusercontent.com/andrey-dvur/Scripts/main/Prometheus-Grafana/config/prometheus.yml

# Переходим в директорию `prometheus/config`.
cd ~/prometheus/config

# Открываем файл `prometheus.yml` для редактирования.
nano prometheus.yml

Что же мы сделали:

  • файл docker-compose.yml описывает какие докер контейнеры и с какими параметрами мы будем запускать. На начальном этапе это два контейнера - Prometheus и Grafana.
  • в папку config скачался файл настроек prometheus.yml

Настройки Prometheus

Указываем в файле prometheus.yml узел, который будем мониторить. Порт 9221 оставляю по умолчанию.

Здесь можно указать сразу несколько хостов Proxmox для мониторинга. После изменения настроек перезапускаем сервис/контейнер Prometheus.

Тут используется синтаксис YAML, поэтому, да, важно количество пробелов-отступов

Переходим в папку prometheus, где находится наш файл docker-compose.yml и запускаем наши контейнеры

cd ~/prometheus/

# Запускаем контейнеры в фоновом режиме с использованием `docker-compose.yml`.
docker compose up -d

Ждем запуска обоих контейнеров, после этого открываем браузер, вбиваем ip-адрес нашего сервера, на котором мы только что запустили контейнеры и порт графаны: 3000.

Grafana - Базовые настройки

Переходим по ip адресу в браузере:http://ip-адрес:3000.

Начальные логин/пароль admin/admin

Выбираем, откуда Grafana будет брать данные - Data sources.

Выбираем Prometheus

Адреc нашего Prometheus указываем http://prometheus:9090

докер понимает написание адреса в таком виде

Внизу страницы нажимем Save & test

Ожидаем увидеть:

Prometheus и Grafana настроили, осталось на сам узел установить

Настройки Proxmox VE

На хосте Proxmox создадим группу и пользователя для мониторинга и назначим соответствующую роль

# Создаем группу `monitoring` с комментарием 'Monitoring group'.
pveum groupadd monitoring -comment 'Monitoring group'

# Назначаем группе `monitoring` роль `PVEAuditor` для доступа только на чтение.
pveum aclmod / -group monitoring -role PVEAuditor

# Создаем пользователя `pve_exporter@pve`.
pveum useradd pve_exporter@pve

# Добавляем пользователя `pve_exporter@pve` в группу `monitoring`.
pveum usermod pve_exporter@pve -group monitoring

# Устанавливаем пароль для пользователя `pve_exporter@pve`.
pveum passwd pve_exporter@pve

Устанавливаем PVE-exporter

# Обновляем список доступных пакетов из репозиториев.
apt update

# Устанавливаем `python3-pip` и `pipx` для управления Python-пакетами.
apt install python3-pip pipx

# Добавляем `pipx` в PATH.
pipx ensurepath

# Устанавливаем `prometheus-pve-exporter` через `pipx`.
pipx install prometheus-pve-exporter

# Выводим список приложений, установленных через `pipx`.
pipx list

# Проверяем значение переменной окружения PATH.
echo $PATH

# Добавляем `~/.local/bin` в PATH.
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

# Применяем изменения в текущей сессии.
source ~/.bashrc

Создаем файл настроек для PVE-exporter

# Создаем директорию `/usr/share/pve_exporter/` для хранения конфигурации.
mkdir -p /usr/share/pve_exporter/

# Создаем файл конфигурации `pve_exporter.yml` с настройками для подключения к Proxmox VE.
cat > /usr/share/pve_exporter/pve_exporter.yml << EOF
default:
    user: pve_exporter@pve
    password: пароль_пользователя_pve_exporter
    verify_ssl: false
EOF

# Выводим содержимое файла конфигурации для проверки.
cat /usr/share/pve_exporter/pve_exporter.yml

Запускаем pve_exporter

# Запускаем `pve_exporter` с указанием конфигурационного файла.
pve_exporter --config.file /usr/share/pve_exporter/pve_exporter.yml

# Проверяем, какие процессы используют порт 9221.
ss -tuln | grep 9221

# Проверяем, какие процессы используют порт 9221.
lsof -i :9221

# Проверяем статус службы `pve_exporter`.
systemctl status pve_exporter

# Проверяем, что `pve_exporter` возвращает метрики.
curl http://localhost:9221/metrics

Добавим автозапускpve_exporter через systemd.

# Редактируем файл systemd-юнита для `pve_exporter`.
nano /etc/systemd/system/pve_exporter.service

Копируем содержимое и сохраняем.

[Unit]
Description=Prometheus PVE Exporter
After=network.target

[Service]
User=root
ExecStart=/root/.local/bin/pve_exporter --config.file /usr/share/pve_exporter/pve_exporter.yml
Restart=always

[Install]
WantedBy=multi-user.target

Ctrl+X, Y, Enter

# Включаем автозапуск службы `pve_exporter`.
systemctl enable pve_exporter

# Запускаем службу `pve_exporter`.
systemctl start pve_exporter

# Проверяем статус службы `pve_exporter`.
systemctl status pve_exporter

Добавление дашборда Proxmox в Grafana

Источник и коллектор данных настроили, перейдем к самой красоте - графикам.

Вообще Prometheus и сам может рисовать графики без графаны. Плюс графаны в данном случае - огромный выбор уже готовых наборов графиков (дашбордов), которые достаточно импортировать в свою конфигурацию.

Нам нужен дашборд 10347.

Откроем импорт дашборда в нашей графане.

Вставим скопированный ID, жмем Load

Укажем источник данных для этого дашборда - наш, уже сконфигурированный Prometheus

Наслаждаемся

Для отслеживания кластера - достаточно установить PVE-exporter на любой узел (для надежности можно и на все). А еще можно создавать свои графики и настраивать уведомления о событиях. Процесс улучшайзинга графаны - бесконечен.

upd. 14.03.2025

Доработка дашборда

Все никак не брался дополнить статью по данному дашборду. Обратил внимание не сразу. 2 виджета CPU history и Current CPU отображают данные в сотых долях, а нам нужно в процентах.

Для этого, в CPU History:

1. В query - usage формулу меняем на:

pve_cpu_usage_ratio{instance="$instance"}*100

2. Удаляем total;

3. В правой колонке в разделе Standart options в Unit выставляем Percent (0-100).

После внесения изменений не забываем сохранить

В Current CPU нужно лишь добавить умножение на 100

pve_cpu_usage_ratio{instance="$instance"}*100 / pve_cpu_usage_limit and on(id) pve_node_info

После внесения изменений не забываем сохранить

И все красиво

Мне помогли:

https://blog.levintalk.ru/graf

https://andrey.dvur.me/posts/grafana/

https://andrey.dvur.me/posts/pve-exporter/