Централизация логов Docker с помощью Fluentd и ElasticSearch в Ubuntu 14.04

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

Ключевые возможности

Fluentd имеет четыре основные характеристики:

  • Логирование в JSON:  Fluentd пытается структурировать данные в JSON. Это позволяет Fluentd объединить все аспекты обработки логов: сбор, фильтрацию, буферизацию и вывод логов из нескольких источников. JSON упрощает последующую обработку данных, так как они имеют достаточно удобную структуру.
  • Сменная архитектура: Fluentd имеет гибкую систему плагинов, которая позволяет расширить функциональные возможности программы. С помощью плагинов вы можете использовать логи более производительно.
  • Минимум ресурсов: коллектор данных должен быть легковесным, чтобы пользователь мог запустить его на загруженной машине. Коллектор Fluentd написан на C в комбинации с Ruby и требует минимум системных ресурсов.
  • Встроенная защита данных: Fluentd не допустит потери данных. Программа поддерживает буферизацию для предотвращения потери данных между узлами. Также Fluentd можно настроить для обеспечения высокой доступности.

Цели

При развёртывании Docker-контейнеров в производство возникает потребность сохраняться логи контейнеров в более надёжном месте.

Данное руководство поможет установить Fluentd, собрать логи контейнеров Docker и сохранить их вне контейнеров (это позволит сохранить данные в случае сбоя контейнера). Данные будут переданы в другой контейнер на том же сервере Ubuntu 14.04, в котором будет запущена СУБД Elasticsearch.

Требования

  • Сервер Ubuntu 14.04.
  • Доступ к команде sudo.

1: Установка Fluentd

Обычно для развёртывания Fluentd используется пакет td-agent. Компания Treasure Data, автор Fluentd, упаковывает Fluentd с Ruby, так что пользователям не нужно устанавливать Ruby самостоятельно.

Чтобы установить 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 доступна в качестве gem-а Ruby. Если у вас нет прав sudo, пожалуйста, установите Ruby и запустите команду:

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

2: Установка Docker

Теперь нужно установить Docker (в руководстве используется Docker v1.5.0).

Добавьте ключ репозитория 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. Вместо 8host укажите своё имя пользователя:

sudo gpasswd -a 8host docker

Перезапустите Docker:

sudo service docker restart

Теперь нужно обновить настройки пользователя. Для этого обновите сессию.

4: Образ Fluentd

Теперь нужно создать образ Docker для контейнера Fluentd.

Примечание: Более подробную информацию о Docker можно найти в этой серии руководств.

Создайте новый каталог для Fluentd и откройте его:

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

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

sudo nano Dockerfile

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

FROM ruby:2.2.0
MAINTAINER kiyoto@treausuredata.com
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

Этот файл должен содержать такой код:

<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:

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 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 и Elastcisearch

Теперь нужно запустить контейнер 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/containers монтирует логи контейнера Elasticsearch в контейнер

Чтобы убедиться, что контейнеры запущены, введите:

docker ps

В выводе вы увидите контейнеры Elasticsearch и fluentd-es:

CONTAINER ID   IMAGE                     COMMAND           CREATED       STATUS       PORTS            ES
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"}}]}}

Как видите, Elasticsearch получает и сохраняет данные.

Больше о Elasticsearch:

Tags: , , ,

Добавить комментарий