Как стать автором
Обновить
588.3
OTUS
Цифровые навыки от ведущих экспертов

Мониторинг контейнеров с помощью cAdvisor

Время на прочтение8 мин
Количество просмотров3.6K

Использование контейнеров для работы приложений давно уже стало нормой. Сейчас многие приложения изначально разрабатываются для функционирования в контейнеризированной среде. При этом очень важным становится знание характеристик использования ресурсов и производительности приложений, так как это является ключевым фактором для их оптимизации и управления жизненным циклом. Поскольку контейнерные приложения становятся нормой, необходим надежный и эффективный способ сбора данных об их использовании и производительности.

Собирать информацию о состоянии контейнеров можно как с помощью агентов, так и безагентскими способами. Одним из способов сделать это эффективно является использование агента, который собирает и экспортирует данные непосредственно из самих контейнеров.

И в этом нам поможет cAdvisor — это инструмент, предназначенный для сбора информации о состоянии контейнеров.

В этой статье мы посмотрим, как с помощью cAdvisor можно отслеживать использование ресурсов контейнеров и их производительность.

Container Advisor

Итак, cAdvisor, сокращение от Container Advisor, — это инструмент с открытым исходным кодом, разработанный компанией Google для мониторинга контейнеров. Он может собирать, агрегировать, обрабатывать и экспортировать метрики контейнеров, такие как использование процессора и памяти, статистика файловой системы и сети. Вы можете легко использовать этот инструмент в любой контейнерной среде, начиная от одного сервера Docker и заканчивая целым кластером Kubernetes.

Ниже представлена общая архитектура взаимодействия контейнеров с cAdvisor.

Преимущества и недостатки

Как и всякое решение, cAdvisor имеет свои достоинства и недостатки. Начнем с тех преимуществ, которое дает нам это решение. Прежде всего, это встроенная поддержка контейнеров Docker и поддержка из коробки других типов контейнеров. При этом, для того, чтобы начать мониторинг контейнеров нам не требуется выполнять каких‑то дополнительных действий, так как cAdvisor автоматически обнаруживает контейнеры в пределах своего узла и начинает сбор данных.

При этом cAdvisor можно развернуть различными способами, например, в качестве отдельного приложения на уровне ОС, контейнера Docker или DaemonSet в Kubernetes. Те данные, которые решение собирает, можно также экспортировать для дальнейшего анализа и обработки в различные системы: Prometheus, Elasticsearch и InfluxDB.

Для управления cAdvisor используется встроенный веб‑интерфейс, который в режиме реального времени отображает метрики собранных данных. Также решение позволяет получить возможность предоставления общего использования ресурсов узла путем анализа корневого контейнера.

При этом cAdvisor можно интегрировать с другими приложениями посредством REST API для запроса метрик контейнеров непосредственно из самого приложения.

Таким образом cAdvisor является достаточно мощным инструментом, но при этом данное решение, так же как и другие приложения, не лишено недостатков.

Прежде всего, cAdvisor собирает только базовую информацию об использовании ресурсов и этого может оказаться недостаточным, если вам требуются более сложные метрики.

Различные операционные системы требуют специальных настроек для сбора метрик. Так запуск в привилегированном режиме требуется для работы RHEL и CentOS, а в Debian требуется включение cgroups.

Сбор метрик для пользовательского оборудования, например GPU, требует дополнительных настроек, которые зависят от базовой инфраструктуры.

Помимо этого, cAdvisor не предоставляет способа изменить параметры запуска после первоначальной настройки. Пользователям придется перезапустить контейнер cAdvisor с новыми параметрами запуска, если требуется их изменение.

И наконец, cAdvisor не предназначен для долгосрочного хранения собранных данных и требует внешнего инструментария для хранения собранных данных и проведения дальнейшей аналитики.

Установка cAdvisor

Итак, мы рассмотрели основные моменты, связанные с достоинствами и недостатками cAdvisor и теперь самое время попробовать развернуть данное решение.

Здесь возможны различные способы установки, но мы рассмотрим самый простой способ — использование контейнера. Для этого необходимо развернуть образ cAdvisor и запустить его как независимый контейнер Docker.

При запуске контейнера нам могут потребоваться дополнительные параметры. Если вы работаете на CentOS, Fedora или RHEL, вам может потребоваться запустить контейнер с параметрами ‑privileged=true и ‑volume=/cgroup:/cgroup:ro \, чтобы cAdvisor мог получить доступ и отслеживать работу контейнеров Docker.

Это связано с тем, что RHEL и CentOS более строги в отношении доступа к контейнерам. Поскольку cAdvisor требуется доступ к демону Docker через его сокет, вам придется установить параметр ‑privileged=true. Кроме того, в некоторых версиях RHEL и CentOS иерархии cgroup монтируются в каталог /cgroup, поэтому для запуска cAdvisor вам потребуется дополнительная опция Docker ‑volume=/cgroup:/cgroup:ro \.

Если ваш демон docker работает с включенным пространством имен пользователей, вам нужно добавить параметр ‑userns=host, чтобы cAdvisor мог отслеживать контейнеры Docker. В противном случае cAdvisor не сможет подключиться к демону Docker.

Сделать это можно с помощью следующей команды:

$ docker run \

  --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 \

  --name=cadvisor \

  gcr.io/cadvisor/cadvisor:номер_версии

Далее нам становится доступен веб интерфейс cAdvisor на порту 8080.

Здесь представлена как общая статистика по состоянию сервера, так и статистика по отдельным контейнерам.

Помимо данных об использовании контейнеров, cAdvisor также способен собирать данные приложений, включая количество активных соединений, а также информацию о том, достаточно ли приложению выделено процессора и памяти.

Контейнер может отображать метрики приложения на странице состояния или в отдельном API для получения статистики. cAdvisor предоставляет возможность собирать эти метрики в общем виде.

Лучшие практики по мониторингу инфраструктуры и отдельных её компонентов можно изучить на онлайн-курсе под руководством экспертов.

Создание конфигурации

Если мы хотим начать сбор метрик приложения, необходимо создать конфигурацию и передать эту конфигурацию в cAdvisor. Конфигурация указывает cAdvisor, где искать метрики приложения, а затем задает другие параметры для экспорта метрик из cAdvisor в пользовательские интерфейсы и бэкенды. Конфигурация метрики включает в себя:

  • Endpoint

  • Тип (датчик, счетчик и т. д.)

  • Название метрики

  • Тип данных (float, int)

  • Частота опроса

  • Единицы измерения (секунды, кбит/с, счетчик)

  • Регулярные выражения для указания того, какие метрики собирать и как их анализировать и обрабатывать

Ниже приведен пример общего сборщика метрик Nginx, который не предполагает никакой структурированной информации:

{
  "endpoint" : "http://localhost:8000/nginx_status",
  "metrics_config" : [
    {
      "name" : "activeConnections",
      "metric_type" : "gauge",
      "units" : "number of active connections",
      "data_type" : "int",
      "polling_frequency" : 10,
      "regex" : "Active connections: ([0-9]+)"
    },

    {
      "name" : "reading",
      "metric_type" : "gauge",
      "units" : "number of reading connections",
      "data_type" : "int",
      "polling_frequency" : 10,
      "regex" : "Reading: ([0-9]+) .*"
    }
  ]

}

cAdvisor использует метки контейнеров Docker для получения конфигураций для каждого контейнера Docker. Любая метка, начинающаяся с io.cadvisor.metric, разбирается как метка метрики приложения cAdvisor. cAdvisor использует значение этой метки в качестве индикатора того, где можно найти конфигурацию. Например, метки вида io.cadvisor.metric.prometheus‑xyz означают, что конфигурация указывает на конечную точку метрики Prometheus.

Файл конфигурации может быть частью образа контейнера или может быть добавлен позже (во время выполнения) с помощью тома. Это гарантирует отсутствие связи между хостом, на котором запущен контейнер, и конфигурацией метрик приложения. Метрическая информация контейнера является самодостаточной, поэтому пример конфигурации для Nginx будет выглядеть следующим образом:

Пример Dockerfile:

 FROM nginx
 ADD nginx_config.json /var/cadvisor/nginx_config.json
 LABEL io.cadvisor.metric.nginx="/var/cadvisor/nginx_config.json"

Где nginx_config.json — конфигурационный файл, содержащий json‑конфигурации, как показано выше. Затем cAdvisor обратится к образу контейнера во время выполнения, обработает конфигурационный файл и начнет собирать и выводить метрики приложения.

Обратите внимание, что cAdvisor явно смотрит на метки контейнера, чтобы извлечь эту информацию. В Docker 1.8 контейнеры не наследуют метки от своих образов; таким образом, вы должны указать метку во время выполнения.

Экспорт данных с помощью cAdvisor

Как уже говорилось ранее, cAdvisor не является инструментом для долгосрочного хранения данных или проведения аналитики. Однако он может экспортировать собранные данные в различные поддерживаемые бэкенды хранения, включая ElasticSearch, Prometheus, BigQuery и InfluxDB.

В этом примере мы настроим cAdvisor на экспорт данных в кластер Elasticsearch. Чтобы создать контейнер cAdvisor, выполните следующую команду, указав в параметрах времени выполнения на Elasticsearch.

$ docker run \

  --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 \

  --name=cadvisor \

  gcr.io/cadvisor/cadvisor:v0.39.3 -storage_driver=elasticsearch -storage_driver_es_host="http://10.10.10.100:9200" -storage_driver_es_type="stats"

В командах выполнения storage_driver указывает на плагин хранения, storage_driver_es_host — на кластер Elasticsearch, а опция storage_driver_es_type задает имя типа Elasticsearch.

Рекомендации по использованию cAdvisor

Чтобы cAdvisor не создал дополнительную нагрузку на сервер Docker, необходимо настроить параметры времени выполнения, которые определяют, какие данные и как часто должен перехватывать cAdvisor. Так значение параметра housekeeping_interval 30 секунд гарантирует, что периодические действия по сбору статистики контейнеров будут выполняться с заданным интервалом.

Использование параметра disable_metrics отключит все неиспользуемые метрики по отдельности. Это минимизирует общую нагрузку, так как уменьшает количество метрик, которые запрашивает cAdvisor

Заключение

Постоянный мониторинг загрузки среды контейнеризации является важной задачей сопровождения работы приложений. cAdvisor является простым, но мощным инструментом, способным извлекать данные об использовании ресурсов и производительности контейнеров. В сочетании с плагинами, экспортирующими данные в такие инструменты, как Prometheus и Elasticsearch, cAdvisor становится одним из самых универсальных решений для сбора метрик.

В завершение хочу напомнить об открытых уроках по мониторингу, которые проведут мои коллеги в Otus:

  • 11 марта: «Проектирование высоконагруженного мониторинга в распределенных системах». Узнать подробнее

  • 17 марта: «GrafanaAlloy — универсальный инструмент доставки логов, метрик и трейсов». Узнать подробнее

Теги:
Хабы:
Всего голосов 4: ↑2 и ↓2+1
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS