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

Статья из Fluentd

Вступление

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

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

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

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

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

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

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

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

Предпосылки

Для завершения этого урока вам понадобится следующее:

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

Наиболее распространенный способ установки http://www.fluentd.org [Fluentd] - через пакет + td-agent +. https://www.treasuredata.com [Treasure Data], первоначальный автор Fluentd, упаковывает Fluentd в автономную среду выполнения Ruby, поэтому вам не нужно настраивать среду Ruby для запуска Fluentd. Они также предоставляют скрипт для получения последнего пакета + td-agent, который настраивает репозиторий и устанавливает пакет для вас.

Войдите на свой сервер как пользователь без полномочий root:

ssh sammy@

Затем установите + td-agent с помощью скрипта, предоставленного Treasure Data. Сначала скачайте скрипт:

\curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh -o install-td-agent.sh

Если вы хотите проверить скрипт, откройте его в текстовом редакторе:

nano install-td-agent.sh

Когда вы освоитесь с содержимым скрипта, запустите скрипт для установки + td-agent:

sh install-td-agent.sh

После завершения установки запустите + td-agent:

sudo systemctl start td-agent

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

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

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

Output    port 8888
 </source>
 <source>
   @type debug_agent
   bind 127.0.0.1
   port 24230
 </source>
</ROOT>
2016-12-02 19:45:31 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2016-12-02 19:45:31 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

Затем установите плагин Elasticsearch для Fluentd с помощью команды + td-agent-gem +:

sudo td-agent-gem install fluent-plugin-elasticsearch

Fluentd теперь работает с настройками по умолчанию. Далее мы настроим Fluentd, чтобы мы могли прослушивать события Docker и доставлять их в экземпляр Elasticsearch.

Шаг 2 - Настройка Fluentd

Fluentd должен знать, где собирать информацию и куда ее доставлять. Вы определяете эти правила в файле конфигурации Fluentd, расположенном в + / etc / td-agent / td-agent.conf +.

Откройте этот файл в вашем текстовом редакторе:

sudo nano /etc/td-agent/td-agent.conf

Удалите содержимое файла. В этом уроке вы напишите свои собственные правила с нуля.

Вы определяете источники информации в разделе + source +. Добавьте эту конфигурацию в файл:

/etc/td-agent/td-agent.conf

<source>
 @type
 port  24224
</source>

Это определяет источник как + forward +, который является протоколом Fluentd, который работает поверх TCP и будет использоваться Docker при отправке журналов во Fluentd.

Когда появятся записи журнала, они будут иметь несколько дополнительных связанных полей, включая + time,` + tag`, + messages,` + container_id` и некоторые другие. Вы используете информацию в поле + tag +, чтобы решить, куда Fluentd следует отправлять эти данные. Это называется data routing.

Чтобы настроить это, определите раздел + match +, который соответствует содержимому поля + tag +, и проложите его соответствующим образом. Добавьте эту конфигурацию в файл:

/etc/td-agent/td-agent.conf

<match >
 @type
 logstash_format true
 host 127.0.0.1
 port 9200
 flush_interval
</match>

Это правило гласит, что каждая запись с тегом с префиксом + docker. + Будет отправлена ​​в Elasticsearch, который работает на + 127.0.0.1 + на порту + 9200 +. + Flush_interval + сообщает Fluentd, как часто он должен записывать в Elasticsearch.

После сохранения нового файла конфигурации перезапустите службу + td-agent +, чтобы изменения вступили в силу:

sudo systemctl restart td-agent

Теперь, когда Fluentd настроен правильно для наших целей, давайте установим Elasticsearch для захвата наших логов из Fluentd.

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

Мы будем использовать Docker для запуска нашего экземпляра Elasticsearch, поскольку он быстрее, чем мы сами его настраиваем. Мы будем использовать Elasticsearch Docker image для создания нашего контейнера. Чтобы использовать это изображение, увеличьте значение + max_map_count + на вашем хосте Docker следующим образом:

sudo sysctl -w vm.max_map_count=262144

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

docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

Изображение загрузится и запустится контейнер Elasticsearch. Убедитесь, что контейнер работает правильно, проверив процессы Docker и ища контейнер:

docker ps

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

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                            NAMES
76e96943491f               "/docker-entrypoint.s"   About a minute ago   Up 51 seconds

Если контейнера нет в списке, запустите его снова без ключа + -d +, чтобы контейнер работал на переднем плане. Запустите команду + docker run -p 9200: 9200 -p 9300: 9300asticsearch + и найдите все конкретные сообщения об ошибках. Наиболее вероятные ошибки, с которыми вы столкнетесь, - это проблемы с нехваткой системной памяти или слишком низким значением + max_map_count + на вашем хосте Docker. Проверьте все шаги в этом руководстве, чтобы убедиться, что вы ничего не пропустили, и попробуйте снова.

Теперь, когда Elasticsearch запущен в контейнере, давайте сгенерируем некоторые журналы и загрузим их во Fluentd.

Шаг 4 - Создание журналов из Docker-контейнера

С помощью Docker вы можете обрабатывать журналы как поток данных через стандартные интерфейсы вывода (+ STDOUT +) и ошибки (+ STDERR +). Когда вы запускаете приложение Docker, просто дайте команду Docker очистить журналы, используя собственный драйвер ведения журнала Fluentd. Затем служба Fluentd получит журналы и отправит их в Elasticsearch.

Проверьте это, запустив команду Bash внутри контейнера Docker следующим образом:

docker run  ubuntu /bin/echo 'Hello world'

Это выведет сообщение + Hello world + на стандартный вывод, но оно также будет перехвачено драйвером Docker Fluentd и доставлено в службу Fluentd, настроенную вами ранее. Примерно через пять секунд записи будут сброшены в Elasticsearch. Вы настроили этот интервал в разделе + match + вашего файла конфигурации Fluentd.

Этого достаточно, чтобы передать журналы в Elasticsearch, но, возможно, вы захотите взглянуть на official документацию для получения более подробной информации о параметрах, которые вы можно использовать с Docker для управления драйвером Fluentd.

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

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

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

{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"logstash-2016.12.02","_type":"fluentd","_id":"AVQwUi-UHBhoWtOFQKVx","_score":1.0,"_source":{"container_id":"d16af3ad3f0d361a1764e9a63c6de92d8d083dcc502cd904155e217f0297e525","container_name":"","source":"stdout","log":"","@timestamp":"2016-12-02T14:59:26-06:00"}}]}}

В зависимости от настроек может быть зарегистрировано несколько событий. Отдельное событие должно начинаться с `+ {" take ': + `и заканчиваться отметкой времени. Он также будет содержать некоторую дополнительную информацию, связанную с контейнером источника. Как показывает этот вывод, Elasticsearch получает данные из нашего контейнера Docker.

Заключение

Сбор журналов из контейнеров Docker - это всего лишь один из способов использования Fluentd. Многие пользователи приходят на Fluentd, чтобы создать конвейер журналирования, который выполняет как поиск в реальном времени, так и долгосрочное хранение. Эта архитектура использует преимущества способности Fluentd копировать потоки данных и выводить их в несколько систем хранения. Например, вы можете использовать Elasticsearch для поиска в реальном времени, но использовать MongoDB или Hadoop для пакетной аналитики и долговременного хранения.

Веб-приложения создают много журналов, и они часто произвольно форматируются и хранятся в локальной файловой системе. Это может представлять проблемы по двум причинам. Во-первых, журналы трудно анализировать программно, что требует много regular выражений, и поэтому они не очень доступны для тех, кто Вы хотите понять поведение пользователя посредством статистического анализа, просмотра результатов A / B-тестирования или обнаружения мошенничества.

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

Fluentd решает обе эти проблемы, предоставляя библиотеки логгеров для различных языков программирования с единым API. Каждый регистратор отправляет запись, содержащую метку времени, тег и событие в формате JSON, во Fluentd, подобно той, которую вы видели в этом руководстве. Есть logger library для Ruby, Node.js, Go, Python, Perl, PHP, Java и C ++. Это позволяет приложениям «запускать и забывать»; регистратор отправляет данные в Fluentd асинхронно, что, в свою очередь, буферизует журналы перед отправкой их в бэкэнд-системы.

Есть много других полезных вещей, которые вы можете сделать с Fluentd и Elasticsearch. Вы можете найти следующие ссылки интересными:

Related