Как централизовать журналы Docker с помощью Fluentd и ElasticSearch в Ubuntu 14.04

Статья из Fluentd

Вступление

  • Что такое свободно? *

Fluentd - это сборщик данных с открытым исходным кодом, предназначенный для унификации инфраструктуры ведения журналов. Он предназначен для объединения инженеров по эксплуатации, разработчиков приложений и инженеров данных, делая его простым и масштабируемым для сбора и хранения журналов.

Before Fluentd

image: https: //assets.digitalocean.com/articles/dockerlogs_fluentd/1.jpg [Грязная структура регистрации, показывающая отношения между многими программами]

After Fluentd

image: https: //assets.digitalocean.com/articles/dockerlogs_fluentd/2.png [Fluentd собирает журналы приложений и доступа из многих источников и направляет их на множество результатов анализа, архивирования и метрик]

Ключевая особенность

Fluentd обладает четырьмя ключевыми характеристиками, которые делают его пригодным для создания чистых и надежных каротажных трубопроводов:

  • * Unified Logging with JSON: * Fluentd старается структурировать данные в максимально возможной степени в формате JSON. Это позволяет Fluentd унифицировать все аспекты обработки данных журналов: сбор, фильтрацию, буферизацию и вывод журналов по нескольким источникам и местам назначения. Обработка данных в нисходящем направлении намного проще с JSON, так как он имеет достаточную структуру, чтобы быть доступным без применения жестких схем

  • * Pluggable Architecture: * Fluentd имеет гибкую систему плагинов, которая позволяет сообществу расширять свои функциональные возможности. 300+ подключаемых сообществом плагинов соединяют десятки источников данных с десятками выходов данных, манипулируя данными по мере необходимости. Используя плагины, вы можете лучше использовать свои логи сразу

  • * Минимальные требуемые ресурсы: * Сборщик данных должен быть легковесным, чтобы пользователь мог комфортно запускать его на занятой машине. Fluentd написан на комбинации C и Ruby и требует минимальных системных ресурсов. Экземпляр vanilla работает на 30-40 МБ памяти и может обрабатывать 13 000 событий в секунду / ядро

  • * Встроенная надежность: * потеря данных никогда не должна происходить. Fluentd поддерживает буферизацию на основе памяти и файлов для предотвращения потери данных между узлами. Fluentd также поддерживает надежное аварийное переключение и может быть настроен на высокую доступность

Цели: Сбор централизованных журналов Docker-контейнеров с помощью Fluentd

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

В этом руководстве мы покажем вам, как установить Fluentd и использовать его для сбора журналов из контейнеров Docker, сохраняя их снаружи, чтобы можно было сохранять данные после остановки контейнеров. Мы будем передавать данные в другой контейнер с Elasticsearch на том же сервере Ubuntu 14.04.

Как указано в Kubernetes репозиторий GitHub, эта архитектура использует способность Fluentd отслеживать и анализировать JSON-per -линейные файлы журнала, создаваемые демоном Docker для каждого контейнера. Для минимальной настройки, пожалуйста, смотрите this recipe.

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

Предпосылки

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

Шаг 1 - Установка Fluentd

Наиболее распространенный способ развертывания Fluentd - через пакет + td-agent +. Treasure Data, первоначальный автор Fluentd, упаковывает Fluentd с собственной средой исполнения Ruby, так что пользователю не нужно настраивать собственный Ruby для запуска Fluentd.

В настоящее время + td-agent поддерживает следующие платформы:

  • Ubuntu: ясный, точный и надежный

  • Debian: Wheezy и Squeeze

  • RHEL / Centos: 5, 6 и 7

  • Mac OSX: 10,9 и выше

В этом руководстве предполагается, что вы используете DigitalOcean Droplet под управлением Ubuntu 14.04 LTS (Trusty).

Установите + td-agent с помощью следующей команды:

curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

Запустите + td-agent:

sudo /etc/init.d/td-agent start

Проверьте журналы, чтобы убедиться, что он был успешно установлен:

tail /var/log/td-agent/td-agent.log

Вы должны увидеть вывод, похожий на следующий:

   port 24230
 </source>
</ROOT>
2015-02-22 18:27:45 -0500 [info]: adding source type="forward"
2015-02-22 18:27:45 -0500 [info]: adding source type="http"
2015-02-22 18:27:45 -0500 [info]: adding source type="debug_agent"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="td.*.*" type="tdlog"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="debug.**" type="stdout"
2015-02-22 18:27:45 -0500 [info]: listening fluent socket on 0.0.0.0:24224
2015-02-22 18:27:45 -0500 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

_ _ * Примечание: * С другой стороны, Fluentd доступен в виде Ruby gem и может быть установлен с помощью + gem install fluentd +. Если у вас нет привилегий sudo, установите Ruby (см. Https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-debian-7-wheezy [Установка Ruby] здесь) и запустите:

gem install fluentd --no-rdoc --no-ri

_ _

Шаг 2 - Установка Docker

Теперь мы установим Docker. Этот учебник был протестирован с Docker v1.5.0.

Добавьте ключ для хранилища Docker, чтобы мы могли получить обновленный пакет Docker:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

Добавьте репозиторий к своим источникам:

sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"

Обновите вашу систему:

sudo apt-get update

Установите Docker:

sudo apt-get install lxc-docker

Убедитесь, что Docker был установлен, проверив версию:

docker --version

Вы должны увидеть результат, подобный следующему:

Docker version 1.5.0, build a8a31ef

Шаг 3 - Добавление пользователя в группу Docker

Docker запускается от имени * root *, поэтому для выдачи команд + docker + добавьте своего пользователя sudo в группу * docker *. Замените ++ на пользователя по вашему выбору.

sudo gpasswd -a  docker

Затем перезапустите Docker.

sudo service docker restart

Наконец, если вы в настоящее время вошли в систему как пользователь sudo, вы должны выйти и снова войти в систему.

Шаг 4 - Создание свободного изображения

В этом разделе мы создадим образ Docker для контейнера Fluentd Docker. Если вы хотите узнать больше о Docker в целом, прочитайте th вводное учебное пособие.

Создайте новый каталог для ваших ресурсов Fluentd Docker и перейдите в него:

mkdir ~/fluentd-docker && cd ~/fluentd-docker

Создайте следующий + Dockerfile +:

sudo nano Dockerfile

Добавьте следующее содержимое в ваш файл точно. Этот файл сообщает Docker обновить контейнер Docker и установить Ruby, Fluentd и Elasticsearch:

FROM ruby:2.2.0
MAINTAINER [email protected]
RUN apt-get update
RUN gem install fluentd -v "~>0.12.3"
RUN mkdir /etc/fluent
RUN apt-get install -y libcurl4-gnutls-dev make
RUN /usr/local/bin/gem install fluent-plugin-elasticsearch
ADD fluent.conf /etc/fluent/
ENTRYPOINT ["/usr/local/bundle/bin/fluentd", "-c", "/etc/fluent/fluent.conf"]

Вам также необходимо создать файл + fluent.conf + в том же каталоге.

sudo nano fluent.conf

Файл + fluent.conf + должен выглядеть следующим образом. Вы можете скопировать этот файл точно:

<source>
 type tail
 read_from_head true
 path /var/lib/docker/containers/*/*-json.log
 pos_file /var/log/fluentd-docker.pos
 time_format %Y-%m-%dT%H:%M:%S
 tag docker.*
 format json
</source>
# Using filter to add container IDs to each event
<filter docker.var.lib.docker.containers.*.*.log>
 type record_transformer
 <record>
   container_id ${tag_parts[5]}
 </record>
</filter>

<match docker.var.lib.docker.containers.*.*.log>
 type elasticsearch
 logstash_format true
 host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature
 port 9200
 flush_interval 5s
</match>

Цель этого файла - сообщить Fluentd, где найти журналы для других контейнеров Docker.

Затем создайте свой образ Docker с именем + fluentd-es +:

docker build -t fluentd-es .

Это займет несколько минут. Убедитесь, что вы успешно создали изображения:

docker images

Вы должны увидеть результат примерно так:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
fluentd-es          latest              89ba1fb47b23        2 minutes ago       814.1 MB
ruby                2.2.0               51473a2975de        6 weeks ago         774.9 MB

Шаг 5 - Запуск контейнера Elasticsearch

Теперь вернитесь в свой домашний каталог или предпочитаемый каталог для вашего контейнера Elasticsearch:

cd ~

Загрузите и запустите контейнер Elasticsearch. Для этого уже есть автоматизированная сборка:

docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch

Дождитесь загрузки изображения контейнера и запустите.

Затем убедитесь, что контейнер Elasticsearch работает правильно, проверив процессы Docker:

docker ps

Вы должны увидеть результат примерно так:

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES
c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   4 minutes ago      Up 4 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es

Шаг 6 - Запуск контейнера Fluentd-to-Elasticsearch

Теперь мы запустим контейнер, который запускает Fluentd, собирает журналы и отправляет их в Elastcisearch.

docker run -d --link es:es -v /var/lib/docker/containers:/var/lib/docker/containers fluentd-es

В приведенной выше команде часть + - link es: es + связывает контейнер Elasticsearch с контейнером Fluentd. Часть + -v / var / lib / docker / Containers: / var / lib / docker / container + необходима для подключения каталога журналов контейнера хоста в контейнер Fluentd, чтобы Fluentd мог создавать файлы журналов по мере создания контейнеров. ,

Наконец, проверьте, что контейнер работает, проверив наши активные процессы Docker:

docker ps

На этот раз вы должны увидеть как контейнер Elasticsearch, так и новый контейнер + fluentd-es +:

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES
f0d2cac81ac8        fluentd-es:latest               "/usr/local/bundle/b   2 seconds ago    Up 2 seconds                                                        stupefied_brattain
c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   6 minutes ago      Up 6 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es

Шаг 7 - Подтверждение того, что Elasticsearch получает события

Наконец, давайте подтвердим, что Elasticsearch получает события:

curl -XGET 'http://localhost:9200/_all/_search?q=*'

Вывод должен содержать события, которые выглядят так:

{"took":66,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
{"took":59,"timed_out":false,"_shards":{"tod","_id":"AUwLaKjcnpi39wqZnTXQ","_score":1.0,"_source":{"log":"2015-03-12 00:35:44 +0000 [info]: following tail of /var/lib/docker/containers/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9-json.log\n","stream":"stdout","container_id":"6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9","@timestamp":"2015-03-12T00:35:44+00:00"}}]}}

В зависимости от настроек может быть зарегистрировано несколько событий. Отдельное событие должно начинаться с `+ {" take ': + `и заканчиваться отметкой времени.

Как показывает этот вывод, Elasticsearch получает данные. (Ваш идентификатор контейнера будет отличаться от указанного выше!)

Шаг 8 - перевод журналов событий на следующий уровень

Теперь, когда Elasticsearch сохраняет ваши контейнерные события, что вам делать дальше? Есть много полезных вещей, которые можно сделать с Elasticsearch. Если вы ищете идеи, вы можете проверить:

Заключение

Сбор журналов из контейнеров Docker - это всего лишь один из способов использования Fluentd. В этом разделе мы представим два других распространенных варианта использования Fluentd.

Вариант использования 1: поиск в журнале в режиме реального времени и архивирование журнала

Многие пользователи приходят на Fluentd, чтобы создать конвейер журналирования, который выполняет как поиск в реальном времени, так и долгосрочное хранение. Архитектура выглядит так:

image: https: //assets.digitalocean.com/articles/dockerlogs_fluentd/3.png [Передача журналов из нескольких бэкэндов в Elasticsearch, MongoDB и Hadoop]

Эта архитектура использует преимущества способности Fluentd копировать потоки данных и выводить их в несколько систем хранения. В вышеупомянутой настройке Elasticsearch используется для поиска в реальном времени, а MongoDB и / или Hadoop используются для пакетной аналитики и долговременного хранения.

Вариант использования 2: централизованная регистрация приложений

Веб-приложения создают много журналов, и они часто произвольно форматируются и хранятся в локальной файловой системе. Это плохо по двум причинам:

  • Журналы трудно анализировать программно (требуя большого количества регулярных выражений) и, следовательно, они не очень доступны для тех, кто хочет понять поведение пользователя с помощью статистического анализа (A / B-тестирование, обнаружение мошенничества и т. Д.)

  • Журналы не доступны в режиме реального времени, потому что текстовые журналы загружаются в системы хранения. Кроме того, если диск сервера был поврежден между загрузками, журналы будут потеряны или повреждены

Fluentd решает эти проблемы путем:

  • Предоставление библиотек логгеров для различных языков программирования с единым API: каждый регистратор посылает трижды (метка времени, метка, событие в формате JSON) во Fluentd. В настоящее время существуют библиотеки логгеров для Ruby, Node.js, Go, Python, Perl, PHP, Java и C ++.

  • Разрешение приложению «запускать и забывать»: регистратор может асинхронно вести журнал в Fluentd, который, в свою очередь, буферизует журналы перед загрузкой в ​​бэкэнд-системы

Ресурсы:

Related