Мониторинг необходим, чтобы знать состояние наших запущенных приложений. Когда вы запускаете свои приложения в масштабируемой среде, такой как 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 как рабочие. Вы можете создать столько узлов, сколько захотите. Просто повторите команды с именами хостов. Чтобы создать виртуальные машины, выполните следующие команды.

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

Privacy Preference Center