Как разворачивал и настраивал стек ELK (Elasticsearch, Logstash, Kibana)

«Как разворачивал и настраивал стек ELK (Elasticsearch, Logstash, Kibana)» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я разворачивал стек ELK как в Docker-окружении для разработки, так и на выделенных виртуальных машинах для продакшена. Основной фокус — на отказоустойчивости и производительности Elasticsearch.

Архитектура и развертывание:

  1. Elasticsearch: Разворачивал кластер минимум из 3 мастер-нод (для отказоустойчивости кворума) и нескольких data-нод. Настройки включали определение ролей нод, настройку шардирования и репликации.
# docker-compose.yml фрагмент для ES ноды
elasticsearch-data:
  image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
  environment:
    - node.name=es-data-01
    - cluster.name=prod-logging
    - node.roles=data,ingest
    - discovery.seed_hosts=es-master-01,es-master-02
    - cluster.initial_master_nodes=es-master-01,es-master-02
    - bootstrap.memory_lock=true
    - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
  ulimits:
    memlock:
      soft: -1
      hard: -1
  1. Logstash: Конфигурировал пайплайны для приема логов из файлов, syslog или Kafka, их парсинга (с использованием фильтров grok, date, mutate) и отправки в Elasticsearch.
# logstash.conf (фрагмент)
input {
  beats {
    port => 5044
  }
}
filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
  }
  date {
    match => [ "timestamp", "ISO8601" ]
  }
}
output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}
  1. Kibana: Настраивал для подключения к Elasticsearch, создавал дашборды для мониторинга приложений и инфраструктуры, настраивал пространства (spaces) и ролевую модель доступа (RBAC).

Продакшен-доработки:

  • Мониторинг стека: Устанавливал Metricbeat для сбора метрик с самих компонентов ELK.
  • Управление жизненным циклом индексов (ILM): Создавал политики для автоматической ротации (hot/warm/cold) и удаления старых логов.
  • Безопасность: Включал аутентификацию и TLS с помощью X-Pack (встроен в версиях 8.x).
  • Резервное копирование: Настраивал snapshot-репозиторий в S3 для регулярных бэкапов индексов.

Основные сложности, с которыми сталкивался, — это тонкая настройка JVM-параметров для Elasticsearch под доступную память, оптимизация запросов в Kibana для работы с большими объемами данных и парсинг нестандартных форматов логов в Logstash.