
Введение
По мере того как компании внедряют контейнеры Docker для повышения эффективности и скорости развертывания приложений, мониторинг и наблюдаемость становятся все более важными для работы контейнеров в производстве. Мониторинг позволяет получать ценные метрики, журналы и сведения о работе приложений и инфраструктуры. Это позволяет командам заблаговременно устранять неполадки до того, как они приведут к последующим последствиям, а также оптимизировать использование и расходы на ресурсы контейнеров.
В этом комплексном руководстве мы настроим интегрированный стек мониторинга с открытым исходным кодом для визуализации метрик хостов и контейнеров Docker с помощью:
- Prometheus: Популярная база данных временных рядов с открытым исходным кодом для хранения и запроса числовых метрик.
- cAdvisor: Утилита, которая собирает данные об использовании ресурсов и производительности запущенных контейнеров.
- Node Exporter: Предоставляет метрики аппаратного обеспечения и ОС с физических и виртуальных узлов Docker-серверов.
- Grafana: Многофункциональные приборные панели и графики для аналитики и визуализации
В совокупности эти инструменты обеспечивают сквозное наблюдение за Docker-ориентированными средами, начиная с физической инфраструктуры и заканчивая работающими приложениями. Мы развернем их вместе с Docker и настроим конвейеры получения метрик, хранения, запросов и дашбордов, чтобы понять, как именно контейнеры используют ресурсы хоста с течением времени.
Зачем мониторить контейнеры и хосты?
Во-первых, почему мониторинг так важен для контейнерной инфраструктуры?
Поскольку приложения упаковываются в переносные изолированные контейнеры, они становятся все более распределенными по пулам виртуализированных контейнерных узлов, как узлы в кластере.
Эта эфемерная архитектура создает проблемы видимости, включая:
- Понимание того, как контейнеры используют физические ресурсы, такие как процессор, память, диск и сеть
- Сопоставление того, какие контейнеры запускаются на тех или иных узлах с течением времени
- Корреляция производительности приложений с метриками ресурсов нижнего уровня
- Выявление тенденций и скачков в использовании для предотвращения переиспользования
- Настройка конфигураций и размещения контейнеров на основе поведения
- Установка оповещений для обнаружения аномалий или проблем
Хотя контейнеризация приносит архитектурные преимущества благодаря свободному соединению и переносимости, среда становится все более сложной с точки зрения операций.
Собирая, сохраняя и отображая подробные метрики временных рядов, мы получаем возможность видеть, в том числе:
- Мониторинг использования ресурсов в реальном времени с разбивкой по хостам, контейнерам, пространствам имен
- Анализ исторических тенденций для планирования и оптимизации мощностей
- Оповещение на основе метрик при превышении пороговых значений
- Корреляция между временем отклика приложения и характеристиками более низкого уровня
- Приборная панель для понимания инфраструктуры с первого взгляда
Точное понимание того, как приложения потребляют ресурсы, позволяет повысить эффективность работы, автоматизировать реагирование и предотвратить нестабильность, вызванную чрезмерной нагрузкой или узкими местами в ресурсах.
Предварительные условия
Для работы со всеми компонентами вам понадобятся:
- Сервер Linux под управлением Docker с последней версией Docker Compose
- Разрешение демона Docker на запись метрик из экспортеров
- Порты 9090, 9100 и 3000 доступны для инструментов мониторинга
- Базовое администрирование Linux и знакомство с Docker
Для удобства мы будем использовать систему Ubuntu 20.04. Но любой современный дистрибутив Linux должен работать хорошо.
Теперь давайте рассмотрим, как подключить получение метрик Prometheus и визуализированные информационные панели для контейнерных сред!
Шаг 1 — Создание изолированной сети мониторинга Docker
Сначала создайте пользовательскую сеть-мост для связи между службами мониторинга с помощью:
$ docker network create monitoring-net
Это позволит открывать службы на постоянных именах хостов вместо динамических IP-адресов, которые могут меняться:
prometheus
grafana
cadvisor
node-exporter
Теперь запустите каждую службу, подключенную к этой сети, для упрощения подключения.
Шаг 2 — Настройка базы данных временных рядов Prometheus
Prometheus это специализированная база данных временных рядов, оптимизированная для получения и запроса числовых метрик, таких как счетчики, датчики и гистограммы, даже при высоком масштабе или кардинальности. Она собирает и хранит числовые метрики через регулярные интервалы времени.
Prometheus отлично работает в контейнерах и интегрируется с окружениями Docker с помощью экспортеров для получения метрик о контейнерах, образах, томах и многом другом.
Получите последний образ сервера Prometheus:
$ docker pull prom/prometheus:latest
Далее создайте каталог для сохранения данных при перезагрузке контейнера:
$ mkdir -p /prometheus-data
Нам нужно определить конфигурационный файл Prometheus для определения того, что нужно отслеживать. Создайте его по адресу /prometheus-data/prometheus.yml
на вашем хосте с начальными определениями заданий:
global:
scrape_interval: 10s
external_labels:
monitor: production-01
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvisor'
scrape_interval: 5s
static_configs:
- targets: ['cadvisor:8080']
- job_name: 'node'
scrape_interval: 5s
static_configs:
- targets: ['node-exporter:9100']
Это настраивает подключение к:
- Самометрия Prometheus на порту 9090
- cAdvisor отображение метрик контейнеров на 8080
- Node Exporter для получения метрик ОС узла на 9100
Далее мы определим эти службы.
Наконец, запустите сервер Prometheus в отсоединенном режиме:
$ docker run -d --name=prometheus \
--network=monitoring-net \
-p 9090:9090 \
-v=/prometheus-data:/prometheus-data \
prom/prometheus:latest \
--config.file=/prometheus-data/prometheus.yml
Это запустит Prometheus, подключенный к сети мониторинга, загрузит файл конфигурации и постоянный том.
Вы можете получить доступ к пользовательскому интерфейсу Prometheus по адресу http://<server-ip>:9090
. В ближайшее время мы интегрируем Grafana для создания приборных панелей.
Шаг 3 — Установка cAdvisor для метрик контейнеров
cAdvisor (Container Advisor) — это утилита для сбора, агрегирования, обработки и экспорта данных. метрики производительности и использования ресурсов от работающих контейнеров.
Например, cAdvisor показывает статистику использования процессора, памяти, файловой системы и сети для каждого контейнера. Это позволяет понять, сколько ресурсов контейнеры используют относительно своих хост-машин с течением времени.
cAdvisor запускается как демонстрационный набор на каждом узле кластера для мониторинга использования ресурсов. Здесь мы запустим его отдельно с помощью Docker.
Возьмите последний образ cAdvisor:
$ docker pull gcr.io/cadvisor/cadvisor:latest
Затем запустите контейнерный агент cAdvisor:
$ docker run \
--name=cadvisor \
--network=monitoring-net \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
gcr.io/cadvisor/cadvisor:latest
Это запустит cAdvisor с доступом к:
- Файловая система хоста для сбора данных об использовании хранилища для каждого контейнера на
/
- Docker Socket для сбора подробных данных о работающих контейнерах
- Информация о хосте например, процессор/память через
/sys
cAdvisor считывает эти источники и выдает агрегированные метрики на порт 8080.
Prometheus автоматически обнаруживает метрики cAdvisor в нашей сети мониторинга.
Шаг 4 — Установка Node Exporter на хосты Docker
В то время как cAdvisor предоставляет метрики о запущенных контейнерах, Node Exporter собирает метрики ОС и аппаратного обеспечения с самих узлов Docker, такие как CPU, память, использование диска, сеть, службы systemd и другие.
Это позволяет выявить проблемы производительности и насыщенности, которые могут влиять на приложения, операционную систему или физическое оборудование.
Используя docker, запустите node-exporter аналогичным образом:
$ docker run -d \
--name=node-exporter \
--network=monitoring-net \
-p 9100:9100 \
prom/node-exporter:latest
Это откроет метрики узла на порту 9100. Prometheus обнаружит их для скраппинга в такие метрики, как:
node_cpu_seconds_total{mode="idle"}
node_memory_MemAvailable_bytes
node_network_transmit_bytes_total
Теперь у нас есть 2 конвейера, отправляющие системные и контейнерные метрики в Prometheus.
Шаг 5 — Установите Grafana для красивой визуализации данных
Сырые цифры метрик в Prometheus может быть трудно интерпретировать через CLI или UI. Для улучшения анализа, Grafana предоставляет гибкие панели данных с графиками, индикаторами и разбивкой, объединяющей несколько показателей.
Получите и запустите официальный образ Grafana:
$ docker run -d \
--name=grafana \
-p 3000:3000 \
--network=monitoring-net \
grafana/grafana:latest
Это запустит Grafana, подключенную к нашим службам мониторинга на порту 3000.
Перейдите в http://<server-ip>:3000
и войдите в Grafana, используя учетные данные по умолчанию:
- Имя пользователя: admin
- Пароль: admin
Давайте настроим наш источник данных Prometheus…
Шаг 6 — Настройка источника данных Prometheus в Grafana
В боковом меню Grafana нажмите на «Конфигурация», а затем на «Источники данных».
Здесь вы можете управлять соединениями с базами данных мониторинга, такими как Prometheus, Graphite, InfluxDB и другими.
Выберите «Добавить источник данных» и установите следующие поля:
- Имя: Prometheus
- Тип: Прометей
- URL:
http://prometheus:9090
- Доступ: Прокси
Затем нажмите «Сохранить и протестировать». Теперь Grafana имеет доступ ко всем метрикам, хранящимся в Prometheus!
Шаг 7 — Импорт шаблонов панелей
Вместо того чтобы создавать приборные панели полностью с нуля, мы можем воспользоваться экосистемой приборных панелей сообщества Grafana с помощью предварительно созданных шаблонов.
Наведите курсор на значок «+» в левом меню и выберите «Импорт». Затем введите идентификатор приборной панели 1860 который работает с контейнерами, или 893 для представления хоста Docker.
Grafana импортирует эти шаблоны, предварительно заполненные графиками и разбивками для нашего нового источника данных Prometheus. Настройте их или расширьте с помощью более специализированных панелей!
Теперь ваш экземпляр Grafana должен иметь проницательные панели мониторинга:
- Метрики использования ресурсов в каждом контейнере
- Статистика ОС, памяти процессора и Docker на уровне хоста
Теперь Prometheus и Grafana обеспечивают сквозные конвейеры данных, их хранение и визуализацию для контейнерных сред. Далее обсудим административную функциональность для поддержки и масштабирования нашего нового стека мониторинга.
Администрирование служб мониторинга
Теперь, когда у вас запущены Prometheus, Node Exporter, cAdvisor и Grafana, приведем лучшие практики для их долгосрочного администрирования.
Сохранение истории метрик Prometheus
По умолчанию Prometheus хранит метрики локально на диске, что ограничивает емкость и долговечность. Для производственных систем используйте удаленное хранилище, чтобы сохранить историю для более длительного анализа тенденций и планирования мощностей.
Популярные долговременные хранилища, совместимые с Prometheus, включают:
- Azure Blob Storage
- AWS S3
- Облачное хранилище Google
- Танос
Настройте их в разделе prometheus.yml
‘s remote_write:
и remote_read:
разделы.
Сохранение истории приборной панели в Grafana
Чтобы сохранить историю дашбордов при перезапуске Grafana, настройте базу данных, например PostgreSQL или MySQL, в разделе «Конфигурация — Источники данных — База данных Grafana». Синхронизируйте панели мониторинга с системой контроля исходного кода для сохранения истории версий.
Ограничение кардинальности данных
Из-за большого объема метрик для каждого контейнера можно наблюдать «взрывы кардинальности» метрик. Тщательно фильтруйте метрики с помощью перемаркировки, чтобы контролировать рост хранилища. Отказ от менее ценных метрик может повысить производительность.
Горизонтальное чередование
Чтобы распределить нагрузку по мере роста среды, запустите несколько стручков Prometheus в StatefulSet с конфигурациями хеширования или федерации. Аналогичным образом Grafana можно сделать высокодоступной с помощью контроллеров репликации.
Резюме
В этом руководстве мы создали комплексный стек мониторинга для хостов Docker и контейнерных комплексов, включающий:
- Prometheus: Центральная база данных метрик для сбора и хранения статистики контейнеров/хостов
- cAdvisor: Сбор данных об использовании ресурсов запущенными контейнерами
- Node Exporter: Сбор метрик ОС и аппаратного обеспечения серверов
- Grafana: Визуализация показателей с помощью проницательных информационных панелей
Вместе эти инструменты обеспечивают сквозную видимость и предупреждения для обнаружения аномалий в динамических контейнерных средах.
Теперь, когда у вас есть рабочая основа для мониторинга, возможные следующие шаги включают:
- Интеграция данных журнала в Elasticsearch для корреляции трасс с метриками
- Создание правил оповещения и веб-хуков в Prometheus и Grafana
- Автомасштабирование контейнеров на основе использования с помощью Kubernetes Horizontal Pod Autoscaler
- Изучение таких инструментов, как Weave Scope или Lens, для сопоставления контейнеров с хостами
Я надеюсь, что это исследование метрик, мониторинга и видимости поможет вам надежно управлять инфраструктурой! Дайте мне знать, если у вас есть другие вопросы.