Налаштування централізованого логування через ELK Stack — під ключ

Коли застосунок розкиданий по десятках подів, а помилка спливає в найнезручніший момент, розбиратися в логах вручну — втрачений час. Ми налаштовуємо централізоване логування на базі ELK Stack під ключ: від архітектури кластера до зручних дашбордів у Kibana. Наша команда бере на себе весь цикл робіт і забезпечує стабільну роботу системи з подальшою підтримкою.
Часті запитання

Налаштування централізованого логування через ELK Stack — під ключ

Зауважимо: коли додаток розкидано по десяти подах в Kubernetes і щось падає в неробочий час, послідовний перебір kubectl logs — не варіант. Централізоване логування на основі ELK Stack (Elasticsearch + Logstash + Kibana) давно стало стандартом для налагодження та моніторингу. Типова вартість зберігання неструктурованих логів на хмарних дисках може сягати 30% бюджету на інфраструктуру — правильна архітектура знижує ці витрати вдвічі.

Наприклад, коли payments-api падає з помилкою 500, а логів немає — доводиться відновлювати под з debug-режимом і чекати повторення. З ELK ви бачите повний стек помилок за останні 5 хвилин. Ми — команда DevOps-інженерів з багаторічним досвідом у high-load — розгорнемо production-готову систему збору логів, яка знайде проблему за секунди. Замовте аудит поточної системи логування — ми знайдемо вузькі місця та запропонуємо оптимізацію.

Типові помилки при самостійному налаштуванні ELK

Найчастіший сценарій: Elasticsearch піднімають без обмеження heap size і через пару тижнів отримують OOM. За замовчуванням ES бере половину RAM, але якщо JVM heap перевищує 30–32 GB, починаються тривалі GC паузи. Правильна конфігурація: -Xms16g -Xmx16g для dedicated ноди з 32 GB пам'яті — не більше. Друга проблема — індексна стратегія. Один індекс на всі дані за півроку — катастрофа продуктивності. Потрібен ILM (Index Lifecycle Management) з етапами hot → warm → cold → delete та налаштуванням rollover і retention. Третя — Logstash як єдина точка прийому в high-load середовищах. Logstash — важкий JVM-процес. Для агрегації з тисяч хостів ставлять Filebeat на кожному вузлі → Kafka → Logstash → Elasticsearch. Kafka буферизує піки навантаження та гарантує доставку.

Проблема Причина Рішення
OOM в Elasticsearch Невірний heap size Обмежити -Xms та -Xmx до 32 GB
Повільний пошук Багато індексів без ILM Налаштувати rollover та retention
Втрата логів при піках Logstash не справляється Додати Kafka як буфер

Як ми налаштовуємо ELK Stack для Kubernetes?

Налаштування проходить у чотири кроки:

  1. Розгортання Elasticsearch кластера (3+ ноди) з ILM політикою.
  2. Встановлення Filebeat DaemonSet з autodiscover для збору логів контейнерів. Налаштовуємо RBAC для доступу до API Kubernetes та використовуємо sidecar pattern для збору метрик з додатків.
  3. Налаштування Logstash pipeline для збагачення та парсингу (якщо потрібна додаткова трансформація).
  4. Створення Kibana дашбордів та алертів через ElastAlert2.

У K8s середовищі використовуємо стандартну схему: Filebeat DaemonSet читає /var/log/containers/*.log та відправляє дані безпосередньо в Elasticsearch або через Logstash. Нижче — конфігурація, яку ми застосовуємо в продакшені.

---
# filebeat-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: logging
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    spec:
      serviceAccountName: filebeat
      containers:
        - name: filebeat
          image: docker.elastic.co/beats/filebeat:8.12.0
          args: ["-c", "/etc/filebeat.yml", "-e"]
          env:
            - name: ELASTICSEARCH_HOST
              value: "elasticsearch-master.logging.svc.cluster.local"
            - name: ELASTICSEARCH_PORT
              value: "9200"
          volumeMounts:
            - name: config
              mountPath: /etc/filebeat.yml
              readOnly: true
              subPath: filebeat.yml
            - name: varlog
              mountPath: /var/log
              readOnly: true
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
      volumes:
        - name: varlog
          hostPath:
            path: /var/log

filebeat.yml з autodiscover для Kubernetes:

---
filebeat.autodiscover:
  providers:
    - type: kubernetes
      node: ${NODE_NAME}
      hints.enabled: true
      hints.default_config:
        type: container
        paths:
          - /var/log/containers/*-${data.kubernetes.container.id}.log
      templates:
        - condition:
            equals:
              kubernetes.labels.app: "payments-api"
          config:
            - type: container
              paths:
                - /var/log/containers/*-${data.kubernetes.container.id}.log
              processors:
                - decode_json_fields:
                    fields: ["message"]
                    target: ""
                    overwrite_keys: true
                - add_kubernetes_metadata:
                    host: ${NODE_NAME}
                    matchers:
                      - logs_path:
                          logs_path: "/var/log/containers/"
output.elasticsearch:
  hosts: ["${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}"]
  index: "k8s-logs-%{[kubernetes.namespace]}-%{+yyyy.MM.dd}"
  ssl.enabled: true
  ssl.certificate_authorities: ["/etc/ssl/certs/ca.crt"]

Чому ILM політика критична для вартості зберігання?

ILM керує життєвим циклом індексів: гарячі дані на швидких NVMe, холодні — на HDD або S3. Приклад політики:

PUT _ilm/policy/k8s-logs-policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_age": "1d",
            "max_size": "50gb"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          },
          "shrink": {
            "number_of_shards": 1
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

У гарячій фазі зберігаємо дані 1–7 днів, у теплій — до 30, у холодній — до 90. Після 90 днів — видаляємо. Якщо потрібен довший архів, використовуємо Searchable Snapshots в S3. ILM може скоротити витрати на зберігання до 50%.

Kibana: пошук та алерти

У Kibana Discover шукаємо логи за допомогою KQL. Приклад: kubernetes.namespace: "production" AND level: "error" AND NOT kubernetes.pod.name: "batch-*". Для алертів використовуємо ElastAlert2 — він гнучкіший за вбудований Kibana Alerting і не потребує X-Pack ліцензії:

---
# elastalert2 rule name: "Payment service errors"
type: frequency
index: k8s-logs-production-*
num_events: 5
timeframe:
  minutes: 5
filter:
  - term:
      kubernetes.labels.app: "payments-api"
  - term:
      level: "error"
alert:
  - "slack"
slack_webhook_url: "https://hooks.slack.com/services/..."
alert_text: "Payment service: {num_matches} errors in last 5 minutes"
---

Чому варто розглянути OpenSearch замість Elasticsearch?

OpenSearch — форк ES 7.10, повністю безкоштовний і не потребує ліцензій. Він дешевший за Elasticsearch у 2–3 рази при аналогічній функціональності. Якщо ваш проект не використовує X-Pack фічі, міграція на OpenSearch знижує витрати на ліцензування на 30–50%. Ми виконали більше 50 подібних проектів і допоможемо вибрати оптимальний варіант.

Характеристика Elasticsearch OpenSearch
Ліцензія Elastic License (платна) Apache 2.0 (безкоштовно)
API Власний Повна сумісність з ES 7.10
Дод. функції (алерти, ML) X-Pack (платно) Вбудовані (безкоштовно)
Економія на ліцензії 0 до 50%

Результати впровадження

Після налаштування ELK Stack під ключ ви зможете:

  • Знаходити помилки за секунди за trace ID.
  • Будувати дашборди за статусами HTTP, latency, error rate.
  • Отримувати сповіщення в Slack/Telegram при перевищенні порогів.
  • Економити на зберіганні даних за рахунок ILM та cold storage. Економія може сягати 150 000 гривень на місяць для великих проектів.

Що входить у роботу

Етап Опис
Аудит Оцінка поточної інфраструктури та вимог
Проектування Розробка архітектури (ES кластер, pipeline, ILM)
Розгортання Налаштування через Infrastructure as Code (Terraform/Ansible)
Інтеграція Підключення Kubernetes (Filebeat DaemonSet, autodiscover)
Алерти та дашборди Конфігурація ElastAlert2 та Kibana візуалізацій
Документація Інструкції з експлуатації та навчання команди (2–3 години)
Підтримка Місяць після запуску
Приклад налаштування алерту для Slack Конфігурація ElastAlert2 для моніторингу помилок: файл `config.yaml` містить правила та канали сповіщень. Докладніше — в документації ElastAlert2.

Строки

Масштаб Зміст Строк
Малий (1–10 сервісів) Elasticsearch single-node, Filebeat, Kibana 1–2 тижні
Середній (10–50 сервісів) ES cluster 3 ноди, Logstash pipeline, ILM 3–4 тижні
Великий (50+ сервісів, K8s) ES hot-warm, Kafka буфер, ILM, Kibana RBAC 6–10 тижнів

Вартість розраховується індивідуально та залежить від складності архітектури. Зв'яжіться з нами для оцінки вашого проекту. Наші сертифіковані інженери гарантують зниження витрат на зберігання логів.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139