- Добавлен новый коллектор proxvms для сбора информации о виртуальных машинах и контейнерах Proxmox - Реализован парсинг конфигураций VM/контейнеров с структурированием данных - Добавлена поддержка парсинга сетевых интерфейсов, IP конфигураций, SCSI/IDE устройств - Реализован парсинг JSON из поля description с переводом русских ключей на английский - Добавлена генерация уникальных идентификаторов (cluster_uid, node_uid, machine_uid) - Обновлена документация для всех коллекторов: - proxcluster (существующая) - gpu (существующая) - proxnode (новая) - proxvms (новая) - system (новая) - docker (новая) - hba (новая) - sensors (новая) - kubernetes (новая) - macos (новая) - uptime (новая) - Обновлен основной файл docs/collectors.md с полным списком коллекторов - Добавлена поддержка платформ для каждого коллектора - Включены примеры использования и устранение неполадок Автор: Сергей Антропов, сайт: https://devops.org.ru
348 lines
12 KiB
Markdown
348 lines
12 KiB
Markdown
# Коллектор kubernetes
|
||
|
||
**Автор:** Сергей Антропов
|
||
**Сайт:** https://devops.org.ru
|
||
|
||
## Описание
|
||
|
||
Коллектор `kubernetes` собирает агрегированную информацию о Kubernetes кластере через kubectl. Предоставляет детальную информацию о нодах, подах, сервисах и других ресурсах кластера.
|
||
|
||
## Поддерживаемые платформы
|
||
|
||
- **Linux**: Полная поддержка
|
||
- **macOS**: Полная поддержка
|
||
- **Windows**: Не поддерживается (возвращает пустой JSON)
|
||
|
||
## Собираемые данные
|
||
|
||
### Информация о кластере
|
||
|
||
```json
|
||
{
|
||
"cluster": {
|
||
"name": "production-cluster", // Имя кластера
|
||
"version": "v1.28.2", // Версия Kubernetes
|
||
"context": "production", // Контекст kubectl
|
||
"server": "https://kubernetes.default.svc.cluster.local:443" // Сервер API
|
||
}
|
||
}
|
||
```
|
||
|
||
### Информация о нодах
|
||
|
||
```json
|
||
{
|
||
"nodes": [
|
||
{
|
||
"name": "worker-1", // Имя ноды
|
||
"status": "Ready", // Статус ноды
|
||
"roles": ["worker"], // Роли ноды
|
||
"version": "v1.28.2", // Версия kubelet
|
||
"os": "linux", // Операционная система
|
||
"arch": "amd64", // Архитектура
|
||
"kernel": "5.4.0-74-generic", // Версия ядра
|
||
"container_runtime": "containerd://1.6.6", // Контейнерный runtime
|
||
"capacity": { // Емкость ноды
|
||
"cpu": "4", // CPU (cores)
|
||
"memory": "8Gi", // Память
|
||
"pods": "110", // Максимум подов
|
||
"ephemeral_storage": "20Gi" // Эфемерное хранилище
|
||
},
|
||
"allocatable": { // Доступные ресурсы
|
||
"cpu": "3920m", // CPU (millicores)
|
||
"memory": "7.5Gi", // Память
|
||
"pods": "110", // Максимум подов
|
||
"ephemeral_storage": "18Gi" // Эфемерное хранилище
|
||
},
|
||
"conditions": [ // Условия ноды
|
||
{
|
||
"type": "Ready",
|
||
"status": "True",
|
||
"last_heartbeat": "2024-01-01T12:00:00Z"
|
||
}
|
||
],
|
||
"taints": [], // Taints ноды
|
||
"labels": { // Метки ноды
|
||
"kubernetes.io/hostname": "worker-1",
|
||
"node-role.kubernetes.io/worker": ""
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Информация о подах
|
||
|
||
```json
|
||
{
|
||
"pods": [
|
||
{
|
||
"name": "web-server-7d4b8c9f6-abc12", // Имя пода
|
||
"namespace": "default", // Namespace
|
||
"node": "worker-1", // Нода
|
||
"status": "Running", // Статус пода
|
||
"phase": "Running", // Фаза пода
|
||
"restart_count": 0, // Количество перезапусков
|
||
"age": "2d", // Возраст пода
|
||
"containers": [ // Контейнеры в поде
|
||
{
|
||
"name": "web-server", // Имя контейнера
|
||
"image": "nginx:1.21", // Образ
|
||
"ready": true, // Готовность
|
||
"restart_count": 0, // Количество перезапусков
|
||
"state": "running" // Состояние
|
||
}
|
||
],
|
||
"labels": { // Метки пода
|
||
"app": "web-server",
|
||
"version": "v1.0.0"
|
||
},
|
||
"requests": { // Запрошенные ресурсы
|
||
"cpu": "100m", // CPU
|
||
"memory": "128Mi" // Память
|
||
},
|
||
"limits": { // Лимиты ресурсов
|
||
"cpu": "500m", // CPU
|
||
"memory": "512Mi" // Память
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Информация о сервисах
|
||
|
||
```json
|
||
{
|
||
"services": [
|
||
{
|
||
"name": "web-server-service", // Имя сервиса
|
||
"namespace": "default", // Namespace
|
||
"type": "ClusterIP", // Тип сервиса
|
||
"cluster_ip": "10.96.0.1", // Cluster IP
|
||
"external_ip": "", // External IP
|
||
"ports": [ // Порты
|
||
{
|
||
"name": "http",
|
||
"port": 80,
|
||
"target_port": 8080,
|
||
"protocol": "TCP"
|
||
}
|
||
],
|
||
"selector": { // Селектор
|
||
"app": "web-server"
|
||
},
|
||
"labels": { // Метки сервиса
|
||
"app": "web-server"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Информация о деплойментах
|
||
|
||
```json
|
||
{
|
||
"deployments": [
|
||
{
|
||
"name": "web-server", // Имя деплоймента
|
||
"namespace": "default", // Namespace
|
||
"replicas": 3, // Желаемое количество реплик
|
||
"ready_replicas": 3, // Готовые реплики
|
||
"available_replicas": 3, // Доступные реплики
|
||
"updated_replicas": 3, // Обновленные реплики
|
||
"strategy": "RollingUpdate", // Стратегия обновления
|
||
"labels": { // Метки деплоймента
|
||
"app": "web-server"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Статистика кластера
|
||
|
||
```json
|
||
{
|
||
"stats": {
|
||
"nodes_total": 3, // Общее количество нод
|
||
"nodes_ready": 3, // Готовые ноды
|
||
"nodes_not_ready": 0, // Неготовые ноды
|
||
"pods_total": 15, // Общее количество подов
|
||
"pods_running": 12, // Запущенные поды
|
||
"pods_pending": 2, // Ожидающие поды
|
||
"pods_failed": 1, // Неудачные поды
|
||
"services_total": 5, // Общее количество сервисов
|
||
"deployments_total": 3, // Общее количество деплойментов
|
||
"namespaces_total": 4, // Общее количество namespace
|
||
"total_cpu_cores": 12, // Общее количество CPU ядер
|
||
"total_memory_gb": 24, // Общая память в ГБ
|
||
"used_cpu_cores": 6, // Использованные CPU ядра
|
||
"used_memory_gb": 12 // Использованная память в ГБ
|
||
}
|
||
}
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### config.yaml
|
||
|
||
```yaml
|
||
collectors:
|
||
kubernetes:
|
||
enabled: true
|
||
type: exec
|
||
key: kubernetes
|
||
interval: "300s" # 5 минут
|
||
timeout: "12s"
|
||
exec: "./collectors/kubernetes"
|
||
platforms: [linux, darwin]
|
||
```
|
||
|
||
### Переменные окружения
|
||
|
||
- `COLLECTOR_TIMEOUT`: Таймаут выполнения коллектора (по умолчанию 12s)
|
||
- `KUBECONFIG`: Путь к файлу конфигурации kubectl
|
||
|
||
## Требования
|
||
|
||
### Системные требования
|
||
|
||
- Kubernetes кластер
|
||
- Настроенный kubeconfig
|
||
- Доступ к Kubernetes API
|
||
- Права на чтение ресурсов кластера
|
||
|
||
### Команды
|
||
|
||
Коллектор использует следующие команды (должны быть доступны):
|
||
|
||
- `kubectl` - утилита командной строки Kubernetes
|
||
- `kubectl get nodes` - список нод
|
||
- `kubectl get pods` - список подов
|
||
- `kubectl get services` - список сервисов
|
||
- `kubectl get deployments` - список деплойментов
|
||
- `kubectl get namespaces` - список namespace
|
||
|
||
## Примеры использования
|
||
|
||
### Проверка работы коллектора
|
||
|
||
```bash
|
||
# Запуск коллектора напрямую
|
||
./bin/agent/collectors/kubernetes
|
||
|
||
# Запуск через агент
|
||
make run
|
||
```
|
||
|
||
### Фильтрация данных
|
||
|
||
```bash
|
||
# Информация о кластере
|
||
./bin/agent/collectors/kubernetes | jq '.cluster'
|
||
|
||
# Все ноды
|
||
./bin/agent/collectors/kubernetes | jq '.nodes'
|
||
|
||
# Только готовые ноды
|
||
./bin/agent/collectors/kubernetes | jq '.nodes[] | select(.status == "Ready")'
|
||
|
||
# Все поды
|
||
./bin/agent/collectors/kubernetes | jq '.pods'
|
||
|
||
# Только запущенные поды
|
||
./bin/agent/collectors/kubernetes | jq '.pods[] | select(.status == "Running")'
|
||
|
||
# Поды с определенным namespace
|
||
./bin/agent/collectors/kubernetes | jq '.pods[] | select(.namespace == "default")'
|
||
|
||
# Все сервисы
|
||
./bin/agent/collectors/kubernetes | jq '.services'
|
||
|
||
# Все деплойменты
|
||
./bin/agent/collectors/kubernetes | jq '.deployments'
|
||
|
||
# Статистика кластера
|
||
./bin/agent/collectors/kubernetes | jq '.stats'
|
||
|
||
# Общее количество нод
|
||
./bin/agent/collectors/kubernetes | jq '.stats.nodes_total'
|
||
|
||
# Общее количество подов
|
||
./bin/agent/collectors/kubernetes | jq '.stats.pods_total'
|
||
|
||
# Использование ресурсов
|
||
./bin/agent/collectors/kubernetes | jq '.stats | {total_cpu_cores, used_cpu_cores, total_memory_gb, used_memory_gb}'
|
||
```
|
||
|
||
## Устранение неполадок
|
||
|
||
### Частые проблемы
|
||
|
||
1. **"kubectl not found"**
|
||
- Убедитесь, что kubectl установлен
|
||
- Проверьте PATH для команды kubectl
|
||
|
||
2. **"Unable to connect to the server"**
|
||
- Проверьте конфигурацию kubeconfig
|
||
- Убедитесь в доступности Kubernetes API
|
||
- Проверьте права доступа к кластеру
|
||
|
||
3. **"Permission denied"**
|
||
- Проверьте права доступа к ресурсам кластера
|
||
- Убедитесь в правильности RBAC настроек
|
||
|
||
4. **"Context not found"**
|
||
- Проверьте конфигурацию kubeconfig
|
||
- Убедитесь в правильности контекста
|
||
|
||
### Отладка
|
||
|
||
```bash
|
||
# Проверка установки kubectl
|
||
kubectl version --client
|
||
|
||
# Проверка подключения к кластеру
|
||
kubectl cluster-info
|
||
|
||
# Проверка конфигурации
|
||
kubectl config view
|
||
|
||
# Проверка текущего контекста
|
||
kubectl config current-context
|
||
|
||
# Проверка прав доступа
|
||
kubectl auth can-i get pods
|
||
kubectl auth can-i get nodes
|
||
kubectl auth can-i get services
|
||
|
||
# Проверка ресурсов
|
||
kubectl get nodes
|
||
kubectl get pods --all-namespaces
|
||
kubectl get services --all-namespaces
|
||
```
|
||
|
||
## Безопасность
|
||
|
||
- Коллектор требует права на чтение ресурсов кластера
|
||
- Не передает пароли или секретные ключи
|
||
- Собирает только публичную информацию о кластере
|
||
- Не выполняет привилегированные операции
|
||
|
||
## Производительность
|
||
|
||
- Время выполнения: ~5-12 секунд
|
||
- Интервал сбора: рекомендуется 5 минут (300s)
|
||
- Потребление ресурсов: минимальное
|
||
- Собирает только локальную информацию о кластере
|
||
|
||
## Совместимость
|
||
|
||
- **Kubernetes**: 1.20+
|
||
- **Платформы**: Linux, macOS
|
||
- **Архитектуры**: x86_64, ARM64
|
||
- **Типы нод**: master, worker
|
||
- **Контейнерные runtime**: containerd, docker, cri-o
|