Pull to refresh

ELK на Docker

Reading time4 min
Views94K
Многие я думаю читали о применении Elasticsearch, Logstash и Kibana для сбора и анализа логов, но часто статьи начинаются с длинного мануала как поднять сервисы ELK и заставить работать их совместно.
Здесь я хочу рассказать о быстром старте с помощью Docker.

Напишу заранее, что статья ориентирована на тех кто уже знаком с Docker и имеет желание поднять стек ELK для ознакомления или будущего использования в продуктиве. А для тех кто не знает нужен ли им ELK, рекомендую причитать статью Kibana-мать или Зачем вам вообще нужны логи?.

Итак, в идеале задача сводится к тому, чтобы найти контейнер с ELK на hub.docker.com и запустить его. Предлагаю так и сделать с некоторыми доработками. В примере рассмотрим отправку логов nginx в elasticSearch.

Аббревиатура сервисов ELK предусматривает следующие задачи:
1) Обработку поступающих данных и доставку их в Elasticsearch — за это отвечает сервис Logstash
2) Поисковый движок и интерфейс доступа к данным — за это отвечают сам Elasticsearch и Kibana

Но по хорошему Logstash не должен отвечать за доставку данных. Доставку данных делегируем четвертому сервису — Filebeat.

Общая схема работы выглядит следующим образом:

image

В сети может находится различное количество сервисов, с которых необходимо собирать данные и сервис Filebeat является провайдером логов для сервиса Logstash.

Другими словами я веду к тому, что нам необходимо заиметь еще один контейнер с сервисом Filebeat.

Приступим к делу. Я настоятельно рекомендую вам пользоваться сервисом Docker Compose — описывать параметры в одном файле формата YAML, гораздо удобнее чем каждый раз выполнять команды с параметрами. А на этапе отладки запустить и остановить придется не 1 раз.

1. Создадим папку с проектом, например myElk и создадим там файл следующего имени docker-compose.yml, который мы будем дополнять.

2. Ищем и находим контейнер с filebeat. Я рекомендую взять вот этот olinicola/filebeat или выполнить docker pull olinicola/filebeat
Настройка контейнера с filebeat заключается в подготовке конфигурационного файла в формате YAML для сервиса filebeat.
У нас он будет выглядеть следующим образом:

prospectors:
        -
            paths:
                - "/etc/logs/nginx/access.log"
            document_type: nginx-access
        -
            paths:
                - "/var/log/nginx/error.log"
            document_type: nginx-error
output:
    logstash:
        hosts: ["elk:5044"]
        tls:
          certificate_authorities:
            - /etc/pki/tls/certs/logstash-beats.crt
        timeout: 15
    file:
        path: "/tmp/filebeat"


Если коротко, то берем логи nginx с определенного места сервера и отправляем их на ELK сервер, который готов принимать от нас сообщения на порт 5044.
В данном конфигурационном файле «elk» — имя прилинкованного контейнера — подробнее ниже.
Я также дополнительно указал выгрузку в файл, для более удобной отладке на этапе запуска.

На данном этапе вы уже можете дополнить docker-compose.yml следующим кодом:

version: '2'
services:
    filebeat:
        build: .
        image: [ваш imageId образа filebeat]
        volumes:
            - /path/to/myElk/log/nginx:/etc/logs/nginx # логи nginx
            - /path/to/myElk/filebeat:/etc/filebeat
            - /path/to/myElk/filebeat/tmp:/tmp/filebeat


Вы уже можете запустить поднять контейнер командой docker-compose up. И посмотреть как при изменении файла access.log данные будут отправляться в файл "/tmp/filebeat", только на данном этапе еще нет контейнера elk, поэтому output logstash лучше закомментировать.

3. Ок, нас появился первый контейнер с filebeat. Теперь нам нужен второй контейнер с ELK. Идем на hub.docker.com и находим sebp/elk или выполняем команду docker pull sebp/elk.

Настройка контейнера ELK.
Единственное, что нужно настроить здесь это logstash, причем тут 2 варианта: а) оставить все как есть и это будет работать, так как logstash в данном контейнере уже настроен на получение логов nginx сервера.
Однако после того как вы запуститесь вам захочется пойти по пути б)-то есть настроить логи так как нужно именно вам. Потому что от того как будут переданы логи в elasticsearch вам будет более или менее удобно анализировать данные, приходящие с nginx.
Итак поясню файлы конфигурации logstash. Файлы логов, которые нас интересуют следующие:
Входные параметры:
02-beats-input.conf — можно не трогать

input {
	  beats {
	    port => 5044
	    ssl => true
	    ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
	    ssl_key => "/etc/pki/tls/private/logstash-beats.key"
	  }
	}



Здесь мы видим, что сервис готов принимать данные по порту 5044.
Выходные параметры:
30-output.conf — можно не трогать

output {
	  elasticsearch {
	    hosts => ["localhost"]
	    sniffing => true
	    manage_template => false
	    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
	    document_type => "%{[@metadata][type]}"
	  }
	  stdout { codec => rubydebug }
	}


Самое интересное — преобразование данных. По умолчанию файл 11-nginx.conf выглядит так

filter {
	  if [type] == "nginx-access" {
	    grok {
	      match => { "message" => "%{NGINXACCESS}" }
	    }
	  }
	}


Но возможно после того как вы наиграетесь с шаблоном NGINXACCESS вы захотите обработать ваши логи именно так как нужно вам.
Для этого вам нужно будет изменять секцию filter. Там может быть несколько параметров — очень хорошо описано здесь Собираем, парсим и отдаём логи с помощью Logstash.
От себя хочу добавить, что для отладки grok фильтров хорошо подходит следующий сервис: Grok Debugger

3. Компоновка 2х контейнеров.

Здесь я настоятельно рекумендую вам пользоваться сервисом Docker Compose — описывать параметры в одном файле формата YAML, гораздо удобнее чем каждый раз выполнять команды с параметрами. А на этапе отладки запустить и остановить придется не 1 раз.
Для этого вам необходимо создать папку с проектом, например myElk и создать там файл следующего имени docker-compose.yml и например следующего содержания:

version: '2'
services:
    filebeat:
        build: .
        image: [ваш imageId образа filebeat]
        volumes:
            - /path/to/myElk/log/nginx:/etc/logs/nginx # логи nginx
            - /path/to/myElk/filebeat:/etc/filebeat
            - /path/to/myElk/filebeat/tmp:/tmp/filebeat
            - /path/to/myElk/filebeat/certs:/etc/pki/tls/certs
        links:
            - "elk"
        depends_on:
            - "elk"
        #entrypoint: ./time-to-start.sh
    elk:
        image: [ваш imageId образа elk]
        ports:
            - "5601:5601" #kibana
            - "9200:9200" #elastic
            - "5044:5044" #logstash beats filebeat


Данный конфигурационный файл описывает два контейнера и их взаимосвязь, а т
Пробуйте запустить контейнер, если все ОК, то по адресу localhost:5601 вы увидите первую страницу Kibana, где вам нужно будет выбрать первый index, он будет сформирован вида filebeat-[дата], наберите filebeat и если данные начали поступать, то он будет сформирован автоматически.

Для тех кто запускает docker на mac — вам необходимо будет дополнительно пробросить порты через проброс портов VirtualBox, чтобы localhost:5601 был доступен на хостовой машине.
Tags:
Hubs:
Total votes 18: ↑17 and ↓1+16
Comments22

Articles