הערה: כאשר אפליקציה מפוזרת על פני עשרה פודים ב-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
ההתקנה מתבצעת בארבעה שלבים:
- פריסת קלאסטר Elasticsearch (3+ צמתים) עם מדיניות ILM.
- התקנת Filebeat DaemonSet עם autodiscover לאיסוף לוגים של קונטיינרים. הגדר RBAC לגישה ל-Kubernetes API והשתמש בתבנית sidecar עבור מדדי אפליקציה.
- הגדרת צינורות Logstash להעשרה וניתוח (אם יש צורך בטרנספורמציה נוספת).
- יצירת לוחות מחוונים והתראות ב-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 שבועות |
התמחור נקבע באופן אישי בהתאם למורכבות הארכיטקטונית. צור קשר להערכה חינמית של הפרויקט שלך. המהנדסים המוסמכים שלנו מבטיחים הפחתה בעלויות אחסון הלוגים.







