Стек ELK разворачивается с помощью роли ansible, на docker узле с помощью docker-compose. Подробнее о конфигурации стека и роли можно посмотреть здесь. Для контроля индексов на кластере Elasticsearch необходимо установить Curator. Это приложение, которое по расписанию делает запрос к Elasticsearch для удаления устаревших индексов.
В кластер Elasticsearch собирается полный технологический журнал двух баз с примерно сотней пользователей. Среднее количество событий в час в течение рабочего дня составляет примерно 2.7 миллиона. Такое большое количество событий, которое может собраться за несколько дней, не нужно на этом кластере. Нужно оставлять события за последние 2 дня, чтобы при возникновении проблем можно было отыскать их источник.
Роль создана на базе docker-elk https://github.com/deviantony/docker-elk, у них же в репозитории есть расширение для запуска Curator. Но сделано будет не по рекомендации разработчиков, запуск в качестве дополнения, а путем добавления в основной файл docker-compose.yml.
Структура каталога docker-elk/tree/master/extensions/curator следующая:
.
├── config
│ ├── curator.yml
│ └── delete_log_files_curator.yml
├── curator-compose.yml
├── Dockerfile
├── entrypoint.sh
└── README.md
Содержимое файла curator-compose.yml:
version: '2'
services:
curator:
build:
context: extensions/curator/
environment:
ELASTICSEARCH_HOST: elasticsearch
CRON: 0 0 * * *
CONFIG_FILE: /usr/share/curator/config/curator.yml
COMMAND: /usr/share/curator/config/delete_log_files_curator.yml
UNIT_COUNT: 2
networks:
- elk
depends_on:
- elasticsearch
Необходимо взять описание сервиса и добавить в файл шаблона docker-compose.yml.j2 роли ansible и, заодно, в files/docker-elk/docker-compose.yml чтобы ansible-viz нарисовал блок-схему нового стека. Файл docker-compose.yml.j2 должен принять следующий вид:
version: '2'
services:
elasticsearch:
build:
context: elasticsearch/
args:
ELK_VERSION: {{ elk.version }}
volumes:
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
ports:
- "{{ elk.elasticsearch.ports.rest }}:9200"
- "{{ elk.elasticsearch.ports.nc }}:9300"
environment:
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
logstash:
build:
context: logstash/
args:
ELK_VERSION: {{ elk.version }}
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro
ports:
- "{{ elk.logstash.ports.mon }}:9600"
- "{{ elk.logstash.ports.beats }}:5000"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
depends_on:
- elasticsearch
kibana:
build:
context: kibana/
args:
ELK_VERSION: {{ elk.version }}
volumes:
- ./kibana/config/:/usr/share/kibana/config:ro
ports:
- "{{ elk.kibana.port }}:5601"
networks:
- elk
depends_on:
- elasticsearch
curator:
build:
context: extensions/curator/
environment:
ELASTICSEARCH_HOST: elasticsearch
CRON: 0 0 * * *
CONFIG_FILE: /usr/share/curator/config/curator.yml
COMMAND: /usr/share/curator/config/delete_log_files_curator.yml
UNIT_COUNT: 2
networks:
- elk
depends_on:
- elasticsearch
networks:
elk:
driver: bridge
Теперь необходимо изменить структуру каталогов. В каталог files/docker-elk роли необходимо поместить каталог extensions из репозитория. Сохранить оригинальную структуру очень важно, чтобы сохранялась возможность актуализировать стек из репозитория разработчика.
Перед запуском необходимо разобраться с конфигурационными файлами Curator. Они находятся в docker-elk/extensions/curator/config. Они содержат настройки по умолчанию для стека, их вполне можно использовать. Также по умолчанию удаляются индексы старше, чем 2 дня. Имя индексов, которые необходимо чистить можно указать после развертывания, с помощью других ролей ansible или же вручную. Эти фильтры настраиваются в файле delete_log_files_curator.yml.
Теперь необходимо применить отредактированную роль к тому хосту, где она была развернута. Отсутствующие или изменившиеся файлы стека перезапишутся, стек перезапустится и Curator начнет работать.