Мониторинг необходим, чтобы знать состояние наших запущенных приложений. Когда вы запускаете свои приложения в масштабируемой среде, такой как 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.8Docker Compose
: версия> = 1.10, для поддержки Docker Compose версии 3
Мы создадим 3 Virtualbox
машины, Virtualbox
swarm, Virtualbox
plugin Virtualbox
docker-machine
. Для этого вам необходимо установить Virtualbox в систему. Вы также можете развернуть узлы в облачных сервисах с помощью разных плагинов. Шаги после создания в виртуальных машинах одинаковы для всех подключаемых модулей.
Мы будем использовать параметры по умолчанию для создания виртуальных машин. Мы создадим хост с именем manager
который будет agent1
как менеджер для swarm, и два хоста agent1
и agent2
будут agent2
как рабочие. Вы можете создать столько узлов, сколько захотите. Просто повторите команды с именами хостов. Чтобы создать виртуальные машины, выполните следующие команды.
docker-machine create manager docker-machine create agent1 docker-machine create agent2
Эти команды могут занять некоторое время. После создания VMS вывод для команды docker-machine ls
должен выглядеть примерно так.
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS agent1 - virtualbox Running tcp://192.168.99.101:2376 v17.03.1-ce agent2 - virtualbox Running tcp://192.168.99.102:2376 v17.03.1-ce manager - virtualbox Running tcp://192.168.99.100:2376 v17.03.1-ce
Теперь вам нужно переключить контекст, чтобы использовать механизм докера в менеджере. Мы будем выполнять остальную часть демонстрации в докерском движке менеджера а НЕ в нашей локальной системе. Для этого выполните следующую команду.
eval `docker-machine env manager`
Теперь мы перешли на управление докером в manager
. Мы инициализируем рой менеджером, который будет его менеджером. Мы должны упомянуть IP, который будет опубликован для других узлов, чтобы присоединиться к рою. Для этого мы будем использовать IP-адрес manager
. Команда, docker-machine ip manager
выведет результат. Итак, чтобы создать рой, запустите следующую команду.
docker swarm init --advertise-addr `docker-machine ip manager`
Теперь нам нужно добавить два узла к этому рою. Для этого нам нужно передать Join Token
соединения и IP-адрес, опубликованный при создании роя. Чтобы получить токен для присоединения к рою в качестве рабочего узла, вы можете выполнить команду docker swarm join-token -q worker
. Как и прежде, docker-machine ip manager
получит IP-адрес для соединения. Мы могли бы присоединиться к рою, изменив контекст на каждого из рабочих узлов, но легче выполнить команды, через SSH. Чтобы присоединить рабочий узел к рою, выполните следующие команды.
docker-machine ssh agent1 docker swarm join --token `docker swarm join-token -q worker` `docker-machine ip manager`:2377 docker-machine ssh agent2 docker swarm join --token `docker swarm join-token -q worker` `docker-machine ip manager`:2377
Вы можете увидеть узлы в рое с помощью docker node ls
. Как только рабочие узлы добавлены, результат команды должен выглядеть примерно так.
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 3j231njh03spl0j8h67z069cy * manager Ready Active Leader muxpteij6aldkixnl31f0asar agent1 Ready Active y2gstaqpqix1exz09nyjn8z41 agent2 Ready Active
Стек докера
С версией 3 docker-compose мы можем определить весь стек со стратегией развертывания с одним файлом и развернуть его с помощью одной команды. Основное отличие между версиями 2 и 3 docker-compose — введение параметра развертывания для каждой службы. Этот параметр определяет, где и как вы хотите развернуть контейнеры. Ниже приведен файл для docker-compose
файла мониторинга для файла мониторинга.
version: '3' services: influx: image: influxdb volumes: - influx:/var/lib/influxdb deploy: replicas: 1 placement: constraints: - node.role == manager grafana: image: grafana/grafana ports: - 0.0.0.0:80:3000 volumes: - grafana:/var/lib/grafana depends_on: - influx deploy: replicas: 1 placement: constraints: - node.role == manager cadvisor: image: google/cadvisor hostname: '{{.Node.ID}}' command: -logtostderr -docker_only -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influx:8086 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro depends_on: - influx deploy: mode: global volumes: influx: driver: local grafana: driver: local
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
и выполните следующую команду.
docker stack deploy -c docker-stack.yml monitor
Это запустит службы в стеке, который называется monitor
. Это может занять некоторое время в первый раз, когда узлы загружают изображения. Кроме того, вам нужно создать базу данных cadvisor
в InfluxDB для хранения метрик.
docker exec `docker ps | grep -i influx | awk '{print $1}'` influx -execute 'CREATE DATABASE cadvisor'
Эта команда может не сработать, указав, что контейнер 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
образом.
ID NAME MODE REPLICAS IMAGE 0fru8w12pqdx monitor_influx replicated 1/1 influxdb:latest m4r34h5ho984 monitor_grafana replicated 1/1 grafana/grafana:latest s1yeap330m7e monitor_cadvisor global 3/3 google/cadvisor:latest
Вы можете видеть работающие контейнеры в стеке с помощью команды docker stack ps monitor
. Его вывод будет выглядеть следующим образом.
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS n7kobaozqzj6 monitor_cadvisor.y78ac29r904m8uy6hxffb7uvn google/cadvisor:latest agent2 Running Running about a minute ago 1nsispop3hsu monitor_cadvisor.z52c9vloiutl5dbuj5lnykzvl google/cadvisor:latest agent1 Running Running about a minute ago 9n6djc80mamd monitor_cadvisor.qn82bfj5cpin2cpmx9qv1j56s google/cadvisor:latest manager Running Running about a minute ago hyr8piriwa0x monitor_grafana.1 grafana/grafana:latest manager Running Running about a minute ago zk7u8g73ko5w monitor_influx.1 influxdb:latest manager Running Running about a minute ago
В следующей статье мы рассмотрим настройку Grafana
[…] предыдущей статье мы говорили о необходимости мониторинга docker swarm и как […]