- Добавлен сбор информации о виртуальных машинах и контейнерах Proxmox - Генерация уникального vm_id на основе cluster_uuid + vmid (16 символов SHA256) - Убрана информация о VM из коллектора proxcluster - Обновлена документация по коллектору GPU - Исправлен возврат пустого массива вместо null для vms Автор: Сергей Антропов, сайт: https://devops.org.ru
445 lines
17 KiB
Markdown
445 lines
17 KiB
Markdown
# Коллектор proxcluster
|
||
|
||
## Автор: Сергей Антропов, сайт: https://devops.org.ru
|
||
|
||
## Описание
|
||
|
||
Коллектор `proxcluster` собирает подробную информацию о Proxmox кластере, включая основную информацию о кластере, кворуме, хранилищах, нодах и данных corosync.
|
||
|
||
## Поддерживаемые платформы
|
||
|
||
- **Linux**: Полная поддержка
|
||
- **macOS/Windows**: Не поддерживается (возвращает пустой JSON)
|
||
|
||
## Собираемые данные
|
||
|
||
### Основная информация о кластере
|
||
|
||
```json
|
||
{
|
||
"cluster_id": "a1b2c3d4e5f67890", // Уникальный ID на основе cluster_name + cluster_uuid (SHA256, 16 символов)
|
||
"name": "production-cluster", // Имя кластера из corosync.conf
|
||
"cluster_uuid": "12345678-1234-1234-1234-123456789abc", // UUID кластера
|
||
"version": "8.1.4" // Версия Proxmox VE
|
||
}
|
||
```
|
||
|
||
### Информация о кворуме
|
||
|
||
```json
|
||
{
|
||
"quorum": {
|
||
"quorate": true, // Есть ли кворум
|
||
"members": 3, // Количество участников
|
||
"total_votes": 3, // Общее количество голосов
|
||
"expected_votes": 3 // Ожидаемое количество голосов
|
||
}
|
||
}
|
||
```
|
||
|
||
### Хранилища кластера
|
||
|
||
```json
|
||
{
|
||
"storages": [
|
||
{
|
||
"storage_id": "local-lvm", // Идентификатор хранилища
|
||
"type": "lvmthin", // Тип хранилища
|
||
"content": ["images", "rootdir"], // Типы контента
|
||
"total_gb": 500, // Общий размер в ГБ
|
||
"used_gb": 320, // Использовано в ГБ
|
||
"avail_gb": 180, // Доступно в ГБ
|
||
"shared": false // Является ли хранилище общим
|
||
},
|
||
{
|
||
"storage_id": "nfs-storage",
|
||
"type": "nfs",
|
||
"content": ["images", "backup"],
|
||
"total_gb": 2000,
|
||
"used_gb": 1500,
|
||
"avail_gb": 500,
|
||
"shared": true
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Подробная информация о нодах
|
||
|
||
```json
|
||
{
|
||
"nodes": [
|
||
{
|
||
"node_uid": "d8b7a93c2f0e4f16", // Уникальный ID ноды (SHA256 от cluster_uuid + node_id, 16 символов)
|
||
"node_id": "1", // ID ноды в кластере
|
||
"name": "pve1", // Имя ноды
|
||
"ip": "192.168.1.10", // IP адрес ноды
|
||
"online": true, // Статус ноды
|
||
"cluster_id": "a1b2c3d4e5f67890", // ID кластера (SHA256 от cluster_name + cluster_uuid, 16 символов)
|
||
"cluster_uuid": "12345678-1234-1234-1234-123456789abc", // UUID кластера
|
||
"machine_id": "4b1d2c3a4e5f6789aabbccddeeff0011", // Machine ID системы
|
||
"product_uuid": "C9E4DDB2-1F27-4F3B-B3A9-ACD2C66F73B0", // UUID продукта
|
||
"os": { // Информация об ОС
|
||
"kernel": "Linux 5.15.108-1-pve",
|
||
"pve_version": "7.4-3",
|
||
"uptime_sec": 523423
|
||
},
|
||
"hardware": { // Информация о железе
|
||
"cpu_model": "Intel(R) Xeon(R) Gold 6226R",
|
||
"cpu_cores": 32,
|
||
"sockets": 2,
|
||
"threads": 64,
|
||
"memory_total_mb": 262144
|
||
},
|
||
"resources": { // Использование ресурсов
|
||
"cpu_usage_percent": 25.3,
|
||
"memory_used_mb": 98304,
|
||
"swap_used_mb": 512,
|
||
"loadavg": [0.52, 0.61, 0.72]
|
||
},
|
||
"network": [ // Сетевая информация
|
||
{
|
||
"iface": "eth0",
|
||
"mac": "52:54:00:12:34:56",
|
||
"ip": "192.168.1.10",
|
||
"rx_bytes": 123456789,
|
||
"tx_bytes": 987654321,
|
||
"errors": 0
|
||
},
|
||
{
|
||
"iface": "vmbr0",
|
||
"type": "bridge",
|
||
"ip": "192.168.1.1"
|
||
}
|
||
],
|
||
"disks": [ // Информация о дисках
|
||
{
|
||
"device": "/dev/sda",
|
||
"model": "Samsung SSD 870 EVO",
|
||
"size_gb": 1000,
|
||
"used_gb": 200,
|
||
"health": "PASSED"
|
||
},
|
||
{
|
||
"device": "rpool",
|
||
"type": "zfs",
|
||
"size_gb": 5000,
|
||
"used_gb": 2300,
|
||
"status": "ONLINE"
|
||
}
|
||
],
|
||
"services": [ // Статус сервисов
|
||
{"name": "pve-cluster", "active": true},
|
||
{"name": "pvedaemon", "active": true},
|
||
{"name": "pveproxy", "active": true},
|
||
{"name": "corosync", "active": true}
|
||
],
|
||
"logs": [], // Логи ноды (пустой массив в упрощенной версии)
|
||
"gpus": [ // Информация о GPU
|
||
{
|
||
"index": 0,
|
||
"model": "NVIDIA GeForce RTX 4090",
|
||
"memory_total_mb": 24576,
|
||
"memory_used_mb": 8192,
|
||
"utilization_percent": 45.5,
|
||
"temperature_c": 65.0
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"node_uid": "e2f0c1a87d9b5d44",
|
||
"node_id": "2",
|
||
"name": "pve2",
|
||
"ip": "192.168.1.11",
|
||
"online": false, // Офлайн нода
|
||
"cluster_id": "a1b2c3d4e5f67890", // ID кластера
|
||
"cluster_uuid": "12345678-1234-1234-1234-123456789abc", // UUID кластера
|
||
"machine_id": "",
|
||
"product_uuid": "",
|
||
"os": {
|
||
"kernel": "",
|
||
"pve_version": "",
|
||
"uptime_sec": 0
|
||
},
|
||
"hardware": {
|
||
"cpu_model": "",
|
||
"cpu_cores": 0,
|
||
"sockets": 0,
|
||
"threads": 0,
|
||
"memory_total_mb": 0
|
||
},
|
||
"resources": {
|
||
"cpu_usage_percent": 0,
|
||
"memory_used_mb": 0,
|
||
"swap_used_mb": 0,
|
||
"loadavg": [0.0, 0.0, 0.0]
|
||
},
|
||
"network": [],
|
||
"disks": [],
|
||
"services": [],
|
||
"logs": [],
|
||
"gpus": []
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Информация о corosync
|
||
|
||
```json
|
||
{
|
||
"corosync": {
|
||
"bindnetaddr": "192.168.1.0", // Сетевой адрес для привязки
|
||
"mcastport": 5405, // Порт для multicast
|
||
"ttl": 1, // TTL для multicast
|
||
"quorum_provider": "corosync_votequorum" // Провайдер кворума
|
||
}
|
||
}
|
||
```
|
||
|
||
### Агрегированные ресурсы кластера
|
||
|
||
```json
|
||
{
|
||
"cluster_resources": {
|
||
"cpu": { // Агрегированная информация о CPU
|
||
"total_cores": 96, // Общее количество ядер
|
||
"total_sockets": 6, // Общее количество сокетов
|
||
"total_threads": 192, // Общее количество потоков
|
||
"online_cores": 64, // Ядра онлайн нод
|
||
"online_sockets": 4, // Сокеты онлайн нод
|
||
"online_threads": 128 // Потоки онлайн нод
|
||
},
|
||
"memory": { // Агрегированная информация о памяти
|
||
"total_mb": 524288, // Общая память в МБ
|
||
"used_mb": 196608, // Использованная память в МБ
|
||
"online_total": 393216, // Память онлайн нод в МБ
|
||
"online_used": 131072 // Использованная память онлайн нод в МБ
|
||
},
|
||
"storage": { // Агрегированная информация о хранилищах
|
||
"total_gb": 10000, // Общий размер всех хранилищ в ГБ
|
||
"used_gb": 6500, // Использованное место в ГБ
|
||
"avail_gb": 3500, // Доступное место в ГБ
|
||
"shared_gb": 5000, // Размер общих хранилищ в ГБ
|
||
"local_gb": 5000 // Размер локальных хранилищ в ГБ
|
||
},
|
||
"disks": { // Агрегированная информация о дисках
|
||
"total_count": 12, // Общее количество дисков
|
||
"total_size_gb": 24000, // Общий размер всех дисков в ГБ
|
||
"ssd_count": 6, // Количество SSD дисков
|
||
"ssd_size_gb": 12000, // Размер SSD дисков в ГБ
|
||
"hdd_count": 6, // Количество HDD дисков
|
||
"hdd_size_gb": 12000, // Размер HDD дисков в ГБ
|
||
"online_count": 8, // Количество дисков онлайн нод
|
||
"online_size_gb": 16000 // Размер дисков онлайн нод в ГБ
|
||
},
|
||
"gpu": { // Агрегированная информация о GPU
|
||
"total_count": 4, // Общее количество GPU
|
||
"online_count": 3, // Количество GPU онлайн нод
|
||
"total_memory_mb": 98304, // Общая память всех GPU в МБ
|
||
"used_memory_mb": 32768, // Использованная память GPU в МБ
|
||
"online_memory_mb": 73728, // Память GPU онлайн нод в МБ
|
||
"online_used_mb": 24576, // Использованная память GPU онлайн нод в МБ
|
||
"avg_utilization": 35.2, // Средняя утилизация GPU в процентах
|
||
"avg_temperature": 58.5, // Средняя температура GPU в градусах Цельсия
|
||
"models": [ // Список уникальных моделей GPU
|
||
"NVIDIA GeForce RTX 4090",
|
||
"NVIDIA GeForce RTX 3080",
|
||
"AMD Radeon RX 6800 XT"
|
||
]
|
||
},
|
||
"nodes": { // Статистика нод
|
||
"total": 3, // Общее количество нод
|
||
"online": 2 // Количество онлайн нод
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### config.yaml
|
||
|
||
```yaml
|
||
collectors:
|
||
proxcluster:
|
||
enabled: true
|
||
type: exec
|
||
key: proxcluster
|
||
interval: "1800s" # 30 минут
|
||
timeout: "30s"
|
||
exec: "./collectors/proxcluster"
|
||
platforms: [linux]
|
||
```
|
||
|
||
### Переменные окружения
|
||
|
||
- `COLLECTOR_TIMEOUT`: Таймаут выполнения коллектора (по умолчанию 30s)
|
||
|
||
## Требования
|
||
|
||
### Системные требования
|
||
|
||
- Proxmox VE кластер
|
||
- Доступ к файлам конфигурации:
|
||
- `/etc/corosync/corosync.conf` (основной)
|
||
- `/etc/pve/corosync.conf` (альтернативный)
|
||
- `/var/lib/pve-cluster/corosync.conf` (альтернативный)
|
||
|
||
### Команды
|
||
|
||
Коллектор использует следующие команды (должны быть доступны):
|
||
|
||
- `pveversion` - версия Proxmox VE
|
||
- `corosync-quorumtool` - информация о кворуме
|
||
- `pvecm` - управление кластером
|
||
- `pvesm` - управление хранилищами
|
||
- `systemctl` - управление сервисами
|
||
- `ps` - список процессов
|
||
- `getent` - разрешение имен хостов
|
||
- `nvidia-smi` - информация о NVIDIA GPU
|
||
- `lspci` - информация о PCI устройствах (для AMD/Intel GPU)
|
||
|
||
## Уникальные идентификаторы
|
||
|
||
### cluster_id
|
||
Генерируется на основе:
|
||
- `cluster_name` из corosync.conf
|
||
- `cluster_uuid` из corosync.conf
|
||
|
||
Формула: `SHA256(cluster_name + ":" + cluster_uuid)[:16]` (первые 16 символов SHA256 хеша)
|
||
|
||
### node_uid
|
||
Генерируется на основе:
|
||
- `cluster_uuid` кластера
|
||
- `node_id` ноды
|
||
|
||
Формула: `SHA256(cluster_uuid + ":" + node_id)[:16]` (первые 16 символов SHA256 хеша)
|
||
|
||
Это обеспечивает уникальность идентификаторов для каждого кластера и ноды, даже если имена совпадают. Использование SHA256 повышает криптографическую стойкость.
|
||
|
||
## Примеры использования
|
||
|
||
### Проверка работы коллектора
|
||
|
||
```bash
|
||
# Запуск коллектора напрямую
|
||
./bin/agent/collectors/proxcluster
|
||
|
||
# Запуск через агент
|
||
make run
|
||
```
|
||
|
||
### Фильтрация данных
|
||
|
||
```bash
|
||
# Только информация о кластере
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_id, .name, .version'
|
||
|
||
# Только кворум
|
||
./bin/agent/collectors/proxcluster | jq '.quorum'
|
||
|
||
# Только хранилища
|
||
./bin/agent/collectors/proxcluster | jq '.storages'
|
||
|
||
# Только ноды
|
||
./bin/agent/collectors/proxcluster | jq '.nodes'
|
||
|
||
# Только онлайн ноды
|
||
./bin/agent/collectors/proxcluster | jq '.nodes[] | select(.online == true)'
|
||
|
||
# Информация о corosync
|
||
./bin/agent/collectors/proxcluster | jq '.corosync'
|
||
|
||
# Агрегированные ресурсы кластера
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources'
|
||
|
||
# Только CPU ресурсы
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.cpu'
|
||
|
||
# Только память
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.memory'
|
||
|
||
# Только хранилища
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.storage'
|
||
|
||
# Только диски
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.disks'
|
||
|
||
# Статистика нод
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.nodes'
|
||
|
||
# Только GPU ресурсы
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.gpu'
|
||
|
||
# Только модели GPU
|
||
./bin/agent/collectors/proxcluster | jq '.cluster_resources.gpu.models'
|
||
|
||
# GPU на конкретной ноде
|
||
./bin/agent/collectors/proxcluster | jq '.nodes[] | select(.name == "pve1") | .gpus'
|
||
```
|
||
|
||
## Устранение неполадок
|
||
|
||
### Частые проблемы
|
||
|
||
1. **"no cluster data found"**
|
||
- Проверьте, что система является Proxmox VE кластером
|
||
- Убедитесь в доступности файла corosync.conf
|
||
- Проверьте права доступа к файлам конфигурации
|
||
|
||
2. **"failed to parse corosync.conf"**
|
||
- Проверьте формат файла corosync.conf
|
||
- Убедитесь, что в файле есть cluster_name и cluster_uuid
|
||
|
||
3. **"cluster version not found"**
|
||
- Убедитесь, что установлен Proxmox VE
|
||
- Проверьте доступность команды pveversion
|
||
|
||
4. **Пустые данные о нодах/хранилищах**
|
||
- Проверьте доступность команд pvecm, pvesm
|
||
- Убедитесь в правильности конфигурации кластера
|
||
|
||
### Отладка
|
||
|
||
```bash
|
||
# Проверка доступности команд
|
||
which pveversion pvecm pvesm corosync-quorumtool
|
||
|
||
# Проверка файлов конфигурации
|
||
ls -la /etc/corosync/corosync.conf /etc/pve/corosync.conf
|
||
|
||
# Проверка статуса сервисов
|
||
systemctl status pve-cluster corosync pveproxy pvedaemon
|
||
|
||
# Проверка кворума
|
||
corosync-quorumtool -s
|
||
|
||
# Проверка нод кластера
|
||
pvecm nodes
|
||
|
||
# Проверка хранилищ
|
||
pvesm status
|
||
```
|
||
|
||
## Безопасность
|
||
|
||
- Коллектор требует права на чтение системных файлов конфигурации
|
||
- Не передает пароли или секретные ключи
|
||
- Собирает только публичную информацию о кластере
|
||
- Для офлайн нод возвращает пустые значения вместо попыток подключения
|
||
|
||
## Производительность
|
||
|
||
- Время выполнения: ~10-30 секунд (зависит от размера кластера и количества нод)
|
||
- Интервал сбора: рекомендуется 30 минут (1800s)
|
||
- Потребление ресурсов: минимальное
|
||
- Для офлайн нод сбор данных пропускается
|
||
|
||
## Совместимость
|
||
|
||
- **Proxmox VE**: 6.0+
|
||
- **Кластеры**: от 1 ноды (без кворума) до 32 нод
|
||
- **Хранилища**: все поддерживаемые типы (local, nfs, ceph, lvm, zfs и др.)
|
||
- **Сети**: все типы интерфейсов (eth, ens, enp, vmbr и др.)
|
||
- **Диски**: все типы устройств (sda, nvme, vda и др.) |