Централизация логов Docker с помощью Fluentd и ElasticSearch в Ubuntu 14.04
Ubuntu | Комментировать запись
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:
- Взаимодействие с данными ElasticSearch при помощи операций CRUD
- Открытый поиск по логам и визуализация при помощи Elasticsearch, Fluentd и Kibana