Мониторинг Docker с помощью Prometheus, cAdvisor, Node Exporter и Grafana

Введение

По мере того как компании внедряют контейнеры 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, для сопоставления контейнеров с хостами

Я надеюсь, что это исследование метрик, мониторинга и видимости поможет вам надежно управлять инфраструктурой! Дайте мне знать, если у вас есть другие вопросы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *