# Коллектор 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