В данном подразделе описывается архитектура подсистемы Observability (подсистемы наблюдаемости) Deckhouse Kubernetes Platform (DKP).
В подсистему Observability входят следующие модули:
В подразделе на данный момент описаны:
|
Компонент |
Описание |
|---|---|
|
prometheus-operator |
Модуль DKP, отвечающий за запуск Prometheus в кластере. |
|
prometheus-main |
Основной Prometheus, который выполняет scrape каждые 30 секунд (с помощью параметра scrapeInterval можно изменить это значение). Он обрабатывает все правила, отправляет алерты и является основным источником данных. |
|
prometheus-longterm |
Дополнительный Prometheus, хранящий выборку разреженных данных из основного prometheus-main |
|
aggregating-proxy |
Агрегирующий и кеширующий прокси, объединяющий main и longterm в один источник. Помогает избежать провалов в данных при недоступности одного из Prometheus. |
|
memcached |
Сервис кеширования данных в оперативной памяти. |
|
grafana |
UI для отображения метрик в формате дашбордов. |
|
metrics-adapter |
Компонент, предоставляющий API Kubernetes для доступа к метрикам. Необходим для правильной работы VPA. |
|
Различные exporter’ы |
Набор готовых exporter’ов Prometheus для всех необходимых метрик: kube-state-metrics, node-exporter, oomkill-exporter, image-availability-exporter. |
|
upmeter |
Модуль для оценки доступности компонентов DKP. |
|
trickster |
Кеширующий прокси, снижающий нагрузку на Prometheus. В ближайшем времени будет deprecated. |
DKP может интегрироваться с большим количеством разнообразных решений следующими способами:
|
Название |
Описание |
|---|---|
|
Alertmanagers |
Alertmanager’ы могут быть подключены к Prometheus и Grafana и находиться как в кластере DKP, так и за его пределами. |
|
Long-term metrics storages |
Используя протокол remote write, возможно отсылать метрики из DKP в большое количество хранилищ, включающее Cortex, Thanos, VictoriaMetrics. |
Prometheus собирает метрики и выполняет правила:
- отправляет алерты;
- или сохраняет новые метрики (результат выполнения правил) в свою базу данных.
Prometheus устанавливается модулем prometheus-operator DKP, который выполняет следующие функции:
- Prometheus — определяет инсталляцию (кластер) Prometheus;
- ServiceMonitor — определяет, как собирать метрики с сервисов;
- Alertmanager — определяет кластер Alertmanager‘ов;
- PrometheusRule — определяет список Prometheus rules.
- генерирует StatefulSet с самим Prometheus;
- создает секреты с необходимыми для работы Prometheus конфигурационными файлами (prometheus.yaml — конфигурация Prometheus, и configmaps.json — конфигурация для prometheus-config-reloader);
- следит за ресурсами ServiceMonitor и PrometheusRule и на их основании обновляет конфигурационные файлы Prometheus через внесение изменений в секреты.
Два контейнера:
- следит за изменениями prometheus.yaml и, при необходимости, вызывает reload конфигурации Prometheus’у (специальным HTTP-запросом, см. подробнее ниже);
- следит за PrometheusRule’ами (см. подробнее ниже) и по необходимости скачивает их и перезапускает Prometheus.
- config — примонтированный secret (два файла: prometheus.yaml и configmaps.json). Подключен в оба контейнера;
- rules — emptyDir, который наполняет prometheus-config-reloader, а читает prometheus. Подключен в оба контейнера, но в prometheus в режиме read only;
- data — данные Prometheus. Подмонтирован только в prometheus.
- scrape_configs — настройки поиска target’ов (целей для мониторинга, см. подробней следующий раздел);
- rule_files — список директорий, в которых лежат rule’ы, которые необходимо загружать:
(1) Prometheus читает секцию конфига scrape_configs, согласно которой настраивает свой внутренний механизм Service Discovery;
(2) Механизм Service Discovery взаимодействует с API Kubernetes (в основном — получает endpoint`ы);
(3) На основании происходящего в Kubernetes механизм Service Discovery обновляет Targets (список target’ов).
- добавление и удаление Pod’ов (при добавлении/удалении Pod’ов Kubernetes изменяет endpoint’ы, а Prometheus это видит и добавляет/удаляет target’ы);
- добавление и удаление сервисов (точнее endpoint’ов) в указанных пространствах имён;
- нужно добавить новый scrape config (обычно — новый вид сервисов, которые надо мониторить);
- нужно изменить список пространств имён.
1. Prometheus Operator следит за PrometheusRule’ами (подходящими под указанный в ресурсе prometheus ruleSelector).
2. Если появился новый (или был удален существующий) PrometheusRule — Prometheus Operator обновляет prometheus.yaml (а дальше срабатывает логика в точности соответствующая обработке Service Monitor’ов, которая описана выше).
3. Как в случае добавления/удаления PrometheusRule’а, так и при изменении содержимого PrometheusRule’а, Prometheus Operator обновляет ConfigMap prometheus-main-rulefiles-0.
4. Штатными средствами самого Kubernetes данные из ConfigMap прилетают в Pod
5. Изменение файла замечает prometheus-config-reloader, который:
6. Prometheus перечитывает конфиг и видит изменившиеся rule’ы.
Оценка доступности в DKP осуществляется модулем upmeter.
Состав модуля upmeter:
- status — показывает уровень доступности за последние 10 минут (требует авторизации, но ее можно отключить);
- webui — показывает дашборд со статистикой по пробам и группам доступности (требует авторизации).
Модуль отправляет около 100 показаний метрик каждые 5 минут. Это значение зависит от количества включенных модулей Deckhouse Kubernetes Platform.
Модуль log-shipper упрощает настройку сбора логов в Kubernetes-кластере. Он позволяет организовать сбор логов как с приложений, запущенных в кластере, так и с самих узлов, а затем отправлять их в любую систему хранения — внутреннюю или внешнюю (например, Loki, Elasticsearch и другие).
Deckhouse Kubernetes Platform (DKP) обеспечивает интеграцию с системами хранения логов. Сами системы хранения пользователь разворачивает и настраивает самостоятельно.
Для упрощения схемы приняты следующие допущения: На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой. Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура модуля log-shipper на уровне 2 модели C4 и его взаимодействия с другими компонентами DKP изображены на следующей диаграмме:
Модуль состоит из одного компонента:
- vector — агент логирования на базе Datadog Vector.
Настраивается с помощью кастомных ресурсовClusterLogDestination, ClusterLoggingConfig и PodLoggingConfig.
- vector-reloader — сайдкар-контейнер Reloader, который отслеживает изменения секрета с конфигурацией. При наличии изменений он проверяет обновленную конфигурацию и перезапускает vector для применения обновлений.
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к метрикам агента.
Модуль взаимодействует со следующими компонентами:
1. Источники логов в кластере:
2. Приемники логов:
В качестве внутренних и внешних приемников логов могут использоваться Elasticsearch, Kafka, Logstash, Loki, Splunk.
3. Kube-apiserver:
С модулем взаимодействуют следующие внешние компоненты:
Prometheus-main — сбор метрик log-shipper-agent.
В Kubernetes системные логи на узлах хранятся недолго и могут быть утеряны при перезапуске или обновлении узлов. Модуль loki разворачивает в кластере собственное хранилище оперативных логов на базе Grafana Loki.
Возможности модуля:
Кратковременное хранилище на базе Grafana Loki не поддерживает работу в режиме высокой доступности (HA). Для долговременного хранения важных логов используйте внешние системы, поддерживаемые модулем log-shipper.
Архитектура модуля loki на уровне 2 модели C4 и его взаимодействия с другими компонентами DKP изображены на следующей диаграмме:
Модуль состоит из одного компонента:
- loki — контейнер с Grafana Loki;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищенного доступа к loki и его метрикам.
С модулем взаимодействуют следующие внешние компоненты:
Опишите вашу задачу, и мы поможем вам ее решить