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

Настройка и сопровождение Docker и Docker Swarm систем, обращайтесь [email protected]

Мы будем устанавливать агентов cAdvisor в каждом узле для сбора метрик хоста и контейнера. Мы сохраним эти показатели временного ряда в InfluxDB . Мы будем использовать Grafana для настройки панелей индикаторов для этих показателей. Все эти инструменты с открытым исходным кодом и могут быть развернуты в виде контейнера.

Мы будем использовать режим Docker Swarm для создания кластера и развертывания этих служб в виде стека. Это позволяет осуществлять динамическую настройку для мониторинга. Как только мы развёрнем этот стек в рой, все новые узлы, присоединяющиеся к рою, будут автоматически контролироваться.

Обзор инструментов

Существует множество вариантов мониторинга решений. Мы используем сервисы с открытым исходным кодом и контейнером для сборки нашего стека. Наш стек включает в себя следующие сервисы.

CAdvisor

CAdvisor собирает метрику из контейнеров хоста и докера. Он развертывается как образ докера с общими томами в сокет-докере в корневую файловую систему хоста. CAdvisor переносит эти показатели в множество баз данных временного ряда, включая InfluxDB, Prometheus и т. Д. У него даже есть веб-интерфейс, который показывает графики собранных показателей.

InfluxDB

Масштабируемое хранилище данных для показателей, событий и аналитики в реальном времени

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

Grafana

Grafana — это открытая исходная страница, многофункциональная панель показателей и редактор графиков для Graphite, Elasticsearch, OpenTSDB, Prometheus и InfluxDB.

Графана — популярный графический инструмент, который позволяет создавать информационные панели с данными из Graphite, Elasticsearch, OpenTSDB, Prometheus и, конечно же, InfluxDB. Начиная с версии 4 grafana, вы также можете настроить оповещения на основе условий запроса. Мы настроим панель, которую можно развернуть до определенного хоста и сервиса.

Режим «docker-swarm»

Докер представил Swarm Mode в версии 1.12.0. Это позволяет нам легко создавать и управлять роями нескольких хостов. В режиме «Рой» имеется хранилище «ключ-значение» для обнаружения сервисов и возможности оркестровки. Вы можете присоединиться к хостам в рое как менеджер или работник. Как правило, менеджер обрабатывает часть оркестровки, а рабочие используются для запуска контейнеров. Поскольку используем для демострации, мы будем запускать InfluxDB и Grafana в самом менеджере.

В Swarm Mode есть интересная функция, называемая сеткой маршрутизатора. Действует как виртуальный балансировщик нагрузки. Допустим, у нас есть 10 контейнеров, работающих на 5 узлах, и они слушают порт 80. Теперь, если вы получаете доступ к порту 80 любого из хостов, вы будете направлены к любому из 10 запущенных экземпляров, даже к тем экземплярам, которые не находятся на этом конкретном хосте. Таким образом, вы можете опубликовать IP-адрес любого из узлов, и запросы будут автоматически распределены между всеми 10 контейнерами.

Чтобы применить действия с демонстрации, у вас должны быть установлены следующие продукты:

  • Docker : версия> = 1.13, чтобы поддержать Docker Compose File версии 3 и режим Swarm.
  • Docker Machine : версия> = 0.8
  • Docker Compose : версия> = 1.10, для поддержки Docker Compose версии 3

Мы создадим 3 Virtualbox машины, Virtualbox swarm, Virtualbox plugin Virtualbox docker-machine . Для этого вам необходимо установить Virtualbox в систему. Вы также можете развернуть узлы в облачных сервисах с помощью разных плагинов. Шаги после создания в виртуальных машинах одинаковы для всех подключаемых модулей.

Мы будем использовать параметры по умолчанию для создания виртуальных машин. Мы создадим хост с именем manager который будет agent1 как менеджер для swarm, и два хоста agent1 и agent2 будут agent2 как рабочие. Вы можете создать столько узлов, сколько захотите. Просто повторите команды с именами хостов. Чтобы создать виртуальные машины, выполните следующие команды.

 

Эти команды могут занять некоторое время. После создания VMS вывод для команды docker-machine ls должен выглядеть примерно так.

Теперь вам нужно переключить контекст, чтобы использовать механизм докера в менеджере. Мы будем выполнять остальную часть демонстрации в докерском движке менеджера а НЕ в нашей локальной системе. Для этого выполните следующую команду.

Теперь мы перешли на управление докером в manager . Мы инициализируем рой менеджером, который будет его менеджером. Мы должны упомянуть IP, который будет опубликован для других узлов, чтобы присоединиться к рою. Для этого мы будем использовать IP-адрес manager . Команда, docker-machine ip manager выведет результат. Итак, чтобы создать рой, запустите следующую команду.

Теперь нам нужно добавить два узла к этому рою. Для этого нам нужно передать Join Token соединения и IP-адрес, опубликованный при создании роя. Чтобы получить токен для присоединения к рою в качестве рабочего узла, вы можете выполнить команду docker swarm join-token -q worker. Как и прежде, docker-machine ip manager получит IP-адрес для соединения. Мы могли бы присоединиться к рою, изменив контекст на каждого из рабочих узлов, но легче выполнить команды, через SSH. Чтобы присоединить рабочий узел к рою, выполните следующие команды.

Вы можете увидеть узлы в рое с помощью docker node ls . Как только рабочие узлы добавлены, результат команды должен выглядеть примерно так.

Стек докера

С версией 3 docker-compose мы можем определить весь стек со стратегией развертывания с одним файлом и развернуть его с помощью одной команды. Основное отличие между версиями 2 и 3 docker-compose — введение параметра развертывания для каждой службы. Этот параметр определяет, где и как вы хотите развернуть контейнеры. Ниже приведен файл для docker-compose файла мониторинга для файла мониторинга.

influx

Это influxdb и для постоянного хранения, мы создаем том с именем /var/lib/influxdb папку /var/lib/influxdb в контейнере. В ключе развертывания мы говорим, что нам нужна одна копия InfluxDB, которую мы поместим в менеджере. Поскольку мы используем механизм докера в менеджере, мы можем выполнить команды для этого контейнера от самого себя. Так как для обоих других служб необходимо запустить influxDB, мы добавим ключ depends_on к другим сервисам с influx в него.

Grafana

Мы будем ипользовать grafana/grafana и выставим порт 3000 контейнера в порт 80 хоста. Функция router mesh маршрутизатора позволит нам получить доступ к grafana порту 80 любого хоста в рое. У нас есть другой том с именем grafana в /var/lib/grafana в контейнере для постоянных данных. Как и прежде, мы также размещаем одну копию grafana в менеджере.

cadvisor

Для службы cAdvisor требуется гораздо больше настроек, чем для других служб. Ключ имени хоста является сложным. Мы намереваемся поместить одного агента в каждый узел роя, и этот контейнер соберет все показатели из узла и контейнеров, которые в нем находятся. Когда cAdvisor отправляет показатели InfluxDB, он отправляет их с помощью machine тегов, содержащей имя хоста контейнера cAdvisor. Нам нужно сопоставить его с идентификатором узла, на котором он запущен. Докера стеки позволяют использовать шаблоны в именовании.  Мы назвали контейнеры с идентификатором узла, на котором они выполняются, чтобы мы знали, откуда берется метрика. Это делается по значению '{{.Node.ID}}' .

Мы также добавляем некоторые параметры командной строки в cadvisor. logtostderr перенаправляет журналы, сгенерированные cadvsior, в stderr , что облегчает отладку. Флаг docker_only говорит, что нас интересуют только контейнеры, основанные на докерах. Следующие три параметра определяют, где вы хотите, чтобы показатели отображались для хранения. Мы просим cAdvisor подтолкнуть метрики к базе данных cadvisor на сервере InfluxDB, прослушивая influx:8086 . Это отправит метрики в службу потока в стеке. В стеке все порты открыты, и вам не нужно специально их упоминать.

CAdvisor нужны тома, упомянутые в файле, для сбора показателей из системы хоста и докера. Мы используем режим global для развертывания в службе cadvisor. Это гарантирует, что в каждом узле роя будет запущен ровно один экземпляр службы cadvisor.

Наконец, в конце файла у нас есть ключ volumes с volumes influx и grafana . Поскольку мы используем local драйвер для обоих томов, тома будут храниться в manager .

Чтобы docker-stack.yml этот стек, docker-stack.yml файл как docker-stack.yml и выполните следующую команду.

Это запустит службы в стеке, который называется monitor . Это может занять некоторое время в первый раз, когда узлы загружают изображения. Кроме того, вам нужно создать базу данных cadvisor в InfluxDB для хранения метрик.

Эта команда может не сработать, указав, что контейнер influx не существует. Это из-за того, что контейнер еще не готов. Подождите некоторое время и запустите его снова. Мы можем запускать команды в службе influx из-за того, что она запущена в manager и мы используем ее механизм докера. Чтобы найти идентификатор контейнера InfluxDB, вы можете использовать команду docker docker ps | grep -i influx | awk '{print $1}' docker ps | grep -i influx | awk '{print $1}' docker ps | grep -i influx | awk '{print $1}' и мы выполняем команду influx -execute 'CREATE DATABASE cadvisor'для создания новых имен базы данных cadvisor .

Чтобы увидеть службы в стеке, вы можете docker stack services monitor команду docker stack services monitor , вывод команды будет docker stack services monitor образом.

Вы можете видеть работающие контейнеры в стеке с помощью команды docker stack ps monitor . Его вывод будет выглядеть следующим образом.

В следующей статье мы рассмотрим настройку Grafana