רישום מרכזי עם ELK Stack: הגדרה מוכנה לייצור

כאשר אפליקציה מפוזרת על פני עשרות פודים ושגיאה צצה ברגע הגרוע ביותר, חיפוש ידני בלוגים הוא בזבוז זמן. אנו מקימים רישום מרכזי עם ELK Stack במתכונת turnkey: מארכיטקטורת קלאסטר ועד ללוחות מחוונים נוחים ב-Kibana. הצוות שלנו מטפל בכל המחזור ומבטיח פעילות יציבה של המערכת עם תמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הערה: כאשר אפליקציה מפוזרת על פני עשרה פודים ב-Kubernetes ומשהו נכשל בשעות לא שגרתיות, סריקה רציפה של kubectl logs אינה אופציה. ריכוז לוגים מבוסס על ELK Stack (Elasticsearch + Logstash + Kibana) הוא כבר זמן רב הסטנדרט לניפוי באגים וניטור. עלויות אחסון טיפוסיות ללוגים לא מובנים בדיסקי ענן יכולות להגיע עד 30% מתקציב התשתית — ארכיטקטורה נכונה חותכת עלויות אלה בחצי.

לדוגמה, כאשר -Xms16g -Xmx16g קורס עם שגיאת 500 והלוגים אינם זמינים, יש צורך לשחזר את הפוד במצב דיבוג ולחכות שהשגיאה תחזור. עם ELK, אתה רואה את מחסנית השגיאות המלאה של 5 הדקות האחרונות. אנחנו צוות של מהנדסי DevOps עם שנים של ניסיון בסביבות עומס גבוה — נפרוס מערכת איסוף לוגים מוכנה לייצור שמוצאת בעיות תוך שניות. בקשו ביקורת על הגדרת הלוגים הנוכחית שלכם — נזהה צווארי בקבוק ונציע אופטימיזציות.

טעויות נפוצות בהקמת ELK לבד

התרחיש הנפוץ ביותר: Elasticsearch נפרס ללא הגבלת גודל heap, ואחרי כמה שבועות מתרחש OOM. כברירת מחדל, ES לוקח חצי מה-RAM, אבל אם ה-JVM heap עולה על 30–32 GB, מתחילות השהיות GC ארוכות. התצורה הנכונה: /var/log/containers/*.log עבור צומת ייעודי עם 32 GB RAM — לא יותר. הבעיה השנייה היא אסטרטגיית אינדקסים. אינדקס יחיד לכל הנתונים מעל שישה חודשים הוא אסון ביצועים. ILM (Index Lifecycle Management) עם שלבי hot → warm → cold → delete והגדרות rollover/retention הוא חיוני. שלישית, Logstash כנקודת קליטה יחידה בסביבות עומס גבוה. Logstash הוא תהליך JVM כבד. עבור איסוף מאלפי מארחים, הציבו Filebeat על כל צומת → Kafka → Logstash → Elasticsearch. Kafka מאגר את קפיצות העומס ומבטיח מסירה.

בעיה סיבה פתרון
OOM ב-Elasticsearch גודל heap שגוי הגבל -Xms ו--Xmx ל-32 GB
חיפוש איטי אינדקסים רבים ללא ILM הגדר rollover ו-retention
אובדן לוגים בזמן קפיצות עומס Logstash לא יכול להתמודד עם העומס הוסף Kafka כמאגר

כיצד אנו מגדירים את ELK Stack עבור Kubernetes

ההתקנה מתבצעת בארבעה שלבים:

  1. פריסת קלאסטר Elasticsearch (3+ צמתים) עם מדיניות ILM.
  2. התקנת Filebeat DaemonSet עם autodiscover לאיסוף לוגים של קונטיינרים. הגדר RBAC לגישה ל-Kubernetes API והשתמש בתבנית sidecar עבור מדדי אפליקציה.
  3. הגדרת צינורות Logstash להעשרה וניתוח (אם יש צורך בטרנספורמציה נוספת).
  4. יצירת לוחות מחוונים והתראות ב-Kibana באמצעות ElastAlert2.

בסביבות K8s, אנו משתמשים בסכמה הסטנדרטית: Filebeat DaemonSet קורא # 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 ושולח נתונים ישירות ל-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, וקרים על 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. דוגמה: 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 processors: - 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"] . עבור התראות, אנו משתמשים ב-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, חינמי לחלוטין ואינו דורש רישיונות. הוא זול פי 2–3 מ-Elasticsearch עם פונקציונליות דומה. אם הפרויקט שלך אינו משתמש בתכונות 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.
  • לבנות לוחות מחוונים עבור סטטוסי HTTP, זמן השהיה, שיעורי שגיאות.
  • לקבל הודעות ב-Slack/Telegram כאשר חריגים ספים.
  • לחסוך באחסון נתונים באמצעות ILM ואחסון קר. החיסכון יכול להגיע ל-$1.4k–1.9k לחודש עבור פרויקטים גדולים.

מה כלול בעבודה

שלב תיאור
ביקורת הערכת התשתית הנוכחית והדרישות
עיצוב פיתוח ארכיטקטורה (קלאסטר ES, צינור, ILM)
פריסה תצורה באמצעות Infrastructure as Code (Terraform/Ansible)
אינטגרציה חיבור Kubernetes (Filebeat DaemonSet, autodiscover)
התראות ולוחות מחוונים הגדרת ElastAlert2 והדמיות Kibana
תיעוד הוראות תפעול והדרכת צוות (2–3 שעות)
תמיכה חודש אחד לאחר ההשקה
דוגמה להגדרת התראה עבור Slack הגדרת ElastAlert2 לניטור שגיאות: קובץ `config.yaml` מכיל כללים וערוצי הודעות. פרטים נוספים נמצאים בתיעוד ElastAlert2.

ציר זמן

היקף תוכן משך
קטן (1–10 שירותים) Elasticsearch צומת יחיד, Filebeat, Kibana 1–2 שבועות
בינוני (10–50 שירותים) קלאסטר ES 3 צמתים, צינור Logstash, ILM 3–4 שבועות
גדול (50+ שירותים, K8s) ES hot-warm, מאגר Kafka, ILM, Kibana RBAC 6–10 שבועות

התמחור נקבע באופן אישי בהתאם למורכבות הארכיטקטונית. צור קשר להערכה חינמית של הפרויקט שלך. המהנדסים המוסמכים שלנו מבטיחים הפחתה בעלויות אחסון הלוגים.