Моніторинг Kubernetes з Prometheus: збираємо метрики для кластерів та застосунків

З розвитком контейнеризації та масштабованих архітектур Kubernetes став стандартом для оркестрації контейнерів. Однак при використанні Kubernetes необхідний ефективний моніторинг для підтримки стабільності та продуктивності кластерів і додатків, що працюють у подах. Для вирішення цих завдань потрібні спеціалізовані інструменти, здатні збирати дані та надавати їх у зручному для аналізу форматі. Одним із найпопулярніших рішень для моніторингу Kubernetes є Prometheus.

Prometheus — це система моніторингу та збору метрик з відкритим кодом, яка відрізняється високою продуктивністю, гнучкістю налаштувань і потужною інтеграцією з Kubernetes. Його архітектура, побудована навколо концепції time-series даних, дозволяє ефективно аналізувати метрики як самого кластера, так і додатків, що працюють всередині нього.

У цій статті буде розглянуто, як Prometheus допомагає у моніторингу об'єктів Kubernetes та додатків у подах, а також проведено аналіз ключових аспектів його роботи.

Архітектура Prometheus

Prometheus побудований навколо концепції моніторингу часових рядів (time-series), де дані про стан системи або додатка зберігаються у вигляді послідовностей метрик, прив'язаних до часових міток. Його архітектура складається з наступних ключових компонентів:

  1. Prometheus Server
    Основний компонент, який відповідає за збір, обробку та зберігання метрик. Він використовує модель pull, запитуючи дані у заданих кінцевих точках (endpoints).
  2. Exporters
    Це допоміжні додатки, які надають дані у форматі, зрозумілому для Prometheus. Для моніторингу об'єктів Kubernetes та додатків.
  3. Alertmanager
    Система керування сповіщеннями, інтегрована з Prometheus. Використовується для відправки повідомлень при виявленні відхилень від заданих порогових значень.
  4. Хранилище даних
    Prometheus використовує високо ефективне тимчасове хранилище (TSDB), оптимізоване для роботи з часовими рядами.
  5. Інтерфейси візуалізації
    Для аналізу та візуалізації даних Prometheus часто інтегрується з інструментами, такими як Grafana, які надають наочні дашборди.

Інтеграція Prometheus з Kubernetes

Інтеграція Prometheus з Kubernetes базується на використанні механізмів Kubernetes для автоматичного виявлення об'єктів (Service Discovery). Prometheus використовує API Kubernetes для отримання списку доступних об'єктів (ноди, поди, сервіси). Це дозволяє автоматично знаходити кінцеві точки (endpoints) для збору метрик. Це відбувається наступним чином:

  1. Kubernetes API: Prometheus звертається до Kubernetes API для отримання інформації про ресурси, такі як поди, сервіси, ендпоінти та ноди. Це робиться за допомогою Kubernetes Service Discovery, налаштованого у конфігурації Prometheus.
  2. Конфігурація scrape: У конфігурації Prometheus у розділі scrape_configs вказується джерело Service Discovery (kubernetes_sd_configs). Prometheus буде автоматично опитувати Kubernetes API для отримання актуальної інформації про сервіси та поди, які потрібно моніторити.
  3. Label-based Matching: Коли Prometheus виявляє поди, він використовує мітки (labels) для фільтрації та налаштування параметрів збору метрик. Таким чином, можна налаштувати фільтрацію за мітками, щоб збирати метрики тільки з певних подів або сервісів.
  4. EndPoints: Kubernetes створює ендпоінти для сервісів, і Prometheus може виявляти їх через Service Discovery. Якщо сервіс змінюється (наприклад, додається новий под або репліка), Prometheus автоматично оновить свої налаштування та почне збирати метрики з нових ендпоінтів.
    Анотації та мітки для конфігурації: У Kubernetes можна використовувати анотації та мітки для того, щоб вказувати, які поди або сервіси повинні бути виявлені і як з ними взаємодіяти.

Моніторинг об'єктів Kubernetes

Prometheus надає потужні можливості для моніторингу основних об'єктів Kubernetes.

Моніторинг нод
Prometheus збирає метрики нод через Node Exporter або безпосередньо з Kubernetes API. Ці метрики дозволяють відстежувати стан фізичних і віртуальних серверів, на яких працює кластер.

Приклади метрик:

  • node_cpu_usage_seconds_total: використання CPU ноди.
  • node_memory_active_bytes: обсяг активної пам'яті.
  • node_disk_read_bytes_total та node_disk_write_bytes_total: активність дисків.

Моніторинг подів
Поди є основними об'єктами для розміщення додатків у Kubernetes. Prometheus збирає дані про статус подів, їх ресурси та роботу контейнерів.

Приклади метрик:

  • kube_pod_status_phase: поточний статус пода (Running, Pending, Failed).
  • container_cpu_usage_seconds_total: використання CPU контейнером у поді.
  • container_memory_usage_bytes: споживання пам'яті контейнером.

Моніторинг сервісів
Kubernetes-сервіси управляють маршрутизацією запитів до подів. Prometheus збирає дані про роботу сервісів, включаючи мережеві метрики.

Приклади метрик:

  • kube_service_spec_type: тип сервісу (ClusterIP, NodePort, LoadBalancer).
  • kube_endpoint_address_available: кількість доступних кінцевих точок для сервісу.

Моніторинг контролерів Kubernetes
Контролери, такі як Deployment і ReplicaSet, управляють станом подів і забезпечують бажану конфігурацію. Prometheus збирає дані про їхню роботу.

Приклади метрик:

  • kube_deployment_status_replicas: кількість реплік, що відповідають стану.
  • kube_replicaset_status_fully_labeled_replicas: кількість міток, що відповідають ReplicaSet.

Моніторинг стану кластера в цілому
Також є метрики Kubernetes, які допомагають забезпечити повне розуміння стану кластера і швидко реагувати на зміни. До таких метрик можна віднести:

Метрики продуктивності ресурсів

  • node_load1, node_load5, node_load15: середнє навантаження на ноди за 1, 5 і 15 хвилин.

Ці метрики можна використовувати для визначення довготривалої перевантаженості та оптимізації балансу навантаження в кластері.

Метрики доступності

  • kube_pod_container_status_ready: статус готовності контейнера.
  • kube_node_status_condition: стан ноди (наприклад, доступність для розміщення подів).

Ці метрики допомагають підтримувати високий рівень доступності сервісів і запобігати простою.

Метрики мережевих операцій

  • container_network_receive_bytes_total та container_network_transmit_bytes_total: мережевий трафік контейнерів.

Аналіз мережевих метрик дозволяє виявити аномальну активність, наприклад, перевищення пропускної здатності мережі або мережеві атаки.

Моніторинг додатків у подах

Для моніторингу додатків, що працюють у подах, необхідно забезпечити доступність метрик та логів. Це включає кілька кроків:

1. Експорт користувацьких метрик
Додаток, розгорнутий у поді, повинен надавати метрики у форматі Prometheus через HTTP-ендпоінт, зазвичай розташований за адресою /metrics. Для цього необхідно:

  • Додати в код додатку бібліотеку для збору метрик (наприклад, prometheus-client для Python, prometheus-net для C# та prometheus для Go).
  • Визначити ключові метрики, які необхідно відстежувати, наприклад, кількість оброблених запитів, час виконання операцій або HTTP статус-коди.
  • Увімкнути збір і експорт метрик за допомогою бібліотеки.

2.
**Додавання анотацій у поди

Щоб Prometheus міг автоматично виявляти кінцеві точки (ендпоінти) додатків, необхідно додати анотації в маніфести подів або сервісів:

metadata:  
 annotations:  
 prometheus.io/scrape: "true"  
 prometheus.io/port: "8080"

Тут prometheus.io/scrape вказує Prometheus на необхідність збору метрик, а prometheus.io/port задає порт, по якому доступні метрики.

3. Візуалізація в Grafana (необов'язковий, але бажаний крок)

Після налаштування збору метрик Prometheus може інтегруватися з Grafana для створення інтерактивних дашбордів.
Grafana дозволяє створювати складні дашборди для візуалізації метрик Prometheus. Наприклад, можна налаштувати графік, що відображає:

  • Поточне завантаження CPU, супроводжуване лінійним прогнозом на найближчі 2 години.
  • Гістограми затримок запитів, розділені по сервісах.
  • Часові ряди з відхиленнями від нормальної поведінки.

Також візуалізація даних у Grafana спрощує аналіз трендів. Наприклад, метрики, зібрані Prometheus, можуть бути відображені разом з прогнозами, створеними зовнішніми ML-системами.

Використання експортерів для збору метрик та логів
Для збору метрик від сторонніх сервісів, що не надають метрики у форматі Prometheus, потрібно використовувати експортери, такі як:

  • Node Exporter — для моніторингу операційних систем.
  • MySQL Exporter — для баз даних.
  • Blackbox Exporter — для перевірки доступності сервісів.

Для управління логами використовуються такі експортери, як Fluentd або Loki:

  • Fluentd: збирає логи з подів і перетворює їх у єдиний формат.
  • Loki: інтегрується з Grafana для відображення логів разом з метриками Prometheus.

Приклад збору користувацьких метрик

Припустимо, у нас є веб-сервер, який обробляє запити, і ми хочемо додати до нього збір наступних метрик:

  • http_requests_total: загальна кількість HTTP-запитів.
  • http_request_duration_seconds: час виконання запитів.
  • http_errors_total: кількість помилок HTTP.
    Код, який реалізує додавання метрик для Python, буде виглядати наступним чином:
from prometheus_client import start_http_server, Counter, Histogram  
import time  

requests_total = Counter('http_requests_total', 'Total HTTP requests')  
request_duration = Histogram('http_request_duration_seconds', 'Request duration')  

def handle_request():  
 start = time.time()  
 requests_total.inc()  
 # Логіка обробки запиту  
 time.sleep(0.2)  
 request_duration.observe(time.time() - start)  

if __name__ == "__main__":  
 start_http_server(8080)  
 while True:  
 handle_request()

Аналіз метрик

Prometheus дозволяє виконувати запити через мову PromQL, спеціально розроблену для аналізу часового ряду, яка підтримує потужні аналітичні операції, такі як:

  • Усереднення метрик по часу (rate, avg_over_time).
  • Аналіз змін у часових рядах (delta, deriv).
  • Агрегація по мітках і обчислення складних виразів.

Порівняння Prometheus з іншими інструментами моніторингу

Prometheus виділяється серед інших інструментів моніторингу своєю архітектурою та підходом до роботи з метриками. Порівняймо ключові аспекти його функціональності з аналогами, такими як Zabbix і InfluxDB:

1. Збір метрик

  • Prometheus: використовує модель pull для збору метрик, де Prometheus самостійно запитує дані у експортерів. Це зменшує навантаження на джерела даних і дозволяє легко керувати конфігурацією.
  • Zabbix: застосовує модель push, де агенти надсилають метрики на сервер. Це вимагає більше налаштувань на стороні джерел даних.
  • InfluxDB: найчастіше інтегрується з push-орієнтованими системами (наприклад, Telegraf).

2. Зберігання метрик

  • Prometheus: використовує спеціальний формат часового ряду, оптимізований для ефективного зберігання та швидкого доступу до даних.
    Зберігання даних організовано у вигляді блоків, що мінімізує використання дискового простору.
  • InfluxDB: Пропонує реляційну структуру зберігання, що дозволяє виконувати складніші запити, але за рахунок збільшення обсягу даних.
  • Zabbix: Зберігає дані в базі даних (зазвичай MySQL/PostgreSQL), що робить систему більш важкою.

3. Масштабованість

  • Prometheus: Спочатку розроблений для роботи з розподіленими системами, завдяки чому легко масштабується при додаванні нових експортерів або кластерів.
  • Zabbix: Менш гнучкий у розподілених системах, оскільки вимагає складної настройки агентів.
  • InfluxDB: Добре масштабується, але потребує додаткових інструментів (Kapacitor) для моніторингу в реальному часі.

Заключення

Prometheus є потужним інструментом для моніторингу Kubernetes завдяки своїй гнучкості, масштабованості та інтеграції з такими інструментами, як Grafana. Він дозволяє не тільки збирати та аналізувати метрики, але й оперативно реагувати на інциденти, що особливо важливо для високонавантажених систем.

Ключові переваги Prometheus включають:

  • Ефективність збору метрик
  • PromQL, що дозволяє виконувати складні аналітичні операції
  • Інтеграція з Grafana
  • Адаптивність до великих розподілених систем
  • Наявність безлічі готових експортерів

Перекладено з: Мониторинг Kubernetes с Prometheus: собираем метрики для кластеров и приложений

Leave a Reply

Your email address will not be published. Required fields are marked *