כיצד להגדיר התראות והודעות באמצעות Alertmanager באשף ה־DOKS

הקדמה

התראות והודעות הם חלק קריטי בזרימת העבודה שלך בפרויקט. כאשר אתה עובד עם אשף Kubernetes, לעיתים תצטרך לקבל התראה מיידית על בעיה קריטית בקשר.

Alertmanager הוא חלק מ־kube-prom-stack מותקן בקשר שלך ב־ערימת Prometheus. זה מאפשר לך לקבל התראות ממקורות שונים כמו Prometheus. כללים נוצרים בצד של Prometheus, שבתור יכולים להפעיל התראות. זהו אחריותו של Alertmanager לתפוס את ההתראות האלה, לקבץ אותן (איגוד), להחיל תחזוקות נוספות ולהמסר אותן לנמענים המוגדרים. הודעות התראה יכולות להיות מעוצבות נוסף לכלול פרטים נוספים אם נדרש. ניתן להשתמש ב־Slack, Gmail, וכו 'כדי לשלוח התראות בזמן אמת.

בסעיף זה, תלמד כיצד לבדוק את ההתראות הקיימות, ליצור חדשות, ולהגדיר את Alertmanager כך שישלח התראות באמצעות Slack באמצעות אותו קובץ מניפסט המשמש להגדרת Prometheus.

תוכן עניינים

דרישות מראש

כדי להשלים את המדריך הזה, יש לך צורך ב:

  • ערך מעקב Prometheus מותקן באשכול שלך כפי שנסבר ב-אשכול Prometheus.
  • ערך מעקב Loki מותקן באשכול שלך כפי שנסבר ב-אשכול Loki.
  • יישום הדוגמה Emojivoto פורסם באשכול. נא לעקוב אחרי השלבים מהמאגר הראשי. תצטרך ליצור התראות עבור יישום זה.
  • זכויות מנהל על מערכת Slack. מאוחר יותר, תצטרך ליצור אפליקציה עם webhook נכנס שישמש לשליחת התראות מ-Alertmanager.

שלב 1 – בדיקת התראות כלולות

kube-prom-stack כבר יש מעל מאה כללים שפעילים. כדי לגשת ללוח המחוונים של Prometheus, נא לבצע תחילה פורוארד של פורט למחשב המקומי שלך.

kubectl --namespace monitoring port-forward svc/kube-prom-stack-kube-prome-prometheus 9091:9090

פתח דפדפן אינטרנט ב-localhost:9091 וגש לפריט התפריט התראות. עליך לראות מספר התראות מוגדרות מראש וזה צריך להיראות כמו בתמונה הבאה:

לחץ על אחת מההתראות כדי להרחיב אותה. תוכל לראות מידע על הביטוי שהיא שואלת, התוויות שהוגדרו והערות שחשובות מנקודת מבנה. Prometheus תומך בתבניות בהערות ובתוויות של התראות. למידע נוסף, ראה את ה-תיעוד הרשמי.

שלב 2 – יצירת התראה חדשה

כדי ליצור התראה חדשה, עליך להוסיף הגדרה חדשה בקטע additionalPrometheusRule של קובץ הערכות Helm kube-prom-stack. תיצור התראה לדוגמה שתופעל אם למרחב השמות emojivoto אין מספר צפוי של התקנים. המספר הצפוי של ה-pods עבור היישום emojivoto הוא 4.

ראשית, פתח את קובץ הערכות ה-Helm 04-setup-observability/assets/manifests/prom-stack-values.yaml המסופק במאגר Starter Kit, באמצעות עורך טקסט לבחירתך (רצוי עם תמיכת ב-YAML lint). לאחר מכן, בטל את ההערה בקטע additionalPrometheusRules.

additionalPrometheusRulesMap:
  rule-name:
    groups:
    - name: emojivoto-instance-down
      rules:
        - alert: EmojivotoInstanceDown
          expr: sum(kube_pod_owner{namespace="emojivoto"}) by (namespace) < 4
          for: 1m
          labels:
            severity: 'critical'
          annotations:
            description: ' The Number of pods from the namespace {{ $labels.namespace }} is lower than the expected 4. '
            summary: 'Pod {{ $labels.pod }} down'

לבסוף, החל הגדרות באמצעות helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

כדי לוודא שההתראה נוצרה בהצלחה, נווט לקונסולת Prometheus, לחץ על פריט התפריט התראות וזהה את ההתראה EmojivotioInstanceDown. היא צריכה להופיע בתחתית הרשימה.

שלב 3 – הגדרת Alertmanager לשליחת הודעות ל-Slack

כדי להשלים סעיף זה, יש לך צורך בהרשאות מנהליות על מערכת Slack. זה יאפשר לך ליצור את ה- incoming webhook שתצטרך בשלבים הבאים. עליך גם ליצור ערוץ בו תרצה לקבל התראות מ- Alertmanager.
תגדיר את Alertmanager לסרוק את כל ההתראות שהתקבלו ולהדפיס את התקצירים והתיאורים שלהם בשורות חדשות.

  1. פתח דפדפן אינטרנט ונווט אל https://api.slack.com/apps. לחץ על הכפתור Create New App.
  2. בחלון Create an app, בחר באפשרות From scratch. לאחר מכן, תן לאפליקציה שלך שם ובחר את מערכת העבודה המתאימה.
  3. בדף Basic Information, לחץ על האפשרות Incoming Webhooks, הפעל אותה, ולחץ על הכפתור Add New Webhook to Workspace בתחתית העמוד.
  4. בעמוד הבא, השתמש ברשימת הנפתחת Search for a channel… כדי לבחור את הערוץ הרצוי שבו תרצה לשלוח התראות. כשהכול מוכן, לחץ על הכפתור Allow.
  5. העתק את ערך כתובת ה- Webhook URL שמוצג על העמוד. תצטרך אותו בסעיף הבא.

בשלב הבא, תספר ל- Alertmanager איך לשלוח התראות ל-Slack. פתח את הקובץ 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml המסופק במאגר ה-Starter Kit בעזרת עורך טקסט לבחירתך. הסר את ההערות מסביב לבלוק alertmanager.config. וודא כי אתה מעדכן את הערכים של slack_api_url ו-channel על ידי החלפת הפלטפורמות <> בהתאמה.

alertmanager:
  enabled: true
  config:
    global:
      resolve_timeout: 5m
      slack_api_url: "<YOUR_SLACK_APP_INCOMING_WEBHOOK_URL_HERE>"
    route:
      receiver: "slack-notifications"
      repeat_interval: 12h
      routes:
        - receiver: "slack-notifications"
          # התאמים:
          #   - alertname="EmojivotoInstanceDown"
          # המשך: שקר
    receivers:
      - name: "slack-notifications"
        slack_configs:
          - channel: "#<YOUR_SLACK_CHANNEL_NAME_HERE>"
            send_resolved: true
            title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
            text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

בתצורה הנ"ל,

  • slack_api_url: כתובת URL ל- webhook של Slack שנוצר בשלב 4
  • receivers.[].slack_configs: מגדיר את ערוץ ה-Slack המשמש לשליחת התראות, כותרת ההתראה וההודעה המובנית. ניתן גם לעצב את ההודעה לפי דרישותיך.
  • title ו־text: מגלה את התראות ההתראה ומדפיס את הסיכום והתיאור באמצעות מערכת התבניות של Prometheus.
  • send_resolved: בוליאני המציין אם Alertmanager צריך לשלוח התראה כאשר התראה לא מפעילה עוד.

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

לבסוף, שדרג את kube-prometheus-stack, באמצעות helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

בנקודה זו, אתה אמור לקבל התראות מ-Slack עבור כל התראות ההתראה.

באשכול הבא, אתה הולך לבדוק אם התראת EmojivotoInstanceDown שנוספה לאחר מכן עובדת ושולחת התראה ל-Slack על ידי הקטנת מספר השיבצים עבור פריסת /emoji של מרחב השמות emojivoto.

מהצורך שלך, הרץ את הפקודה הבאה בטרמינל כדי להביא את מספר השיבצים עבור פריסת /emoji ל־0:

kubectl scale --replicas=0 deployment/emoji -n emojivoto

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

A message notification will be sent to Slack to the channel you configured earlier if everything goes well. You should see the “The Number of pods from the namespace emojivoto is lower than the expected 4.” alert in the Slack message as configured in the annotations.description config of the additionalPrometheusRulesMap block.

כרגע, כל ההתראות הפעילות יישלחו לערוץ ה-Slack. זה עשוי לגרום לעייפות התראה. כדי לעיין בהתראה שנשלחת, ניתן להגביל את Alertmanager כך שישלח התראות רק עבור התראות התואמות לתבנית מסוימת. נעשה זאת באמצעות הפרמטר matcher.

פתחו את הקובץ 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml המסופק במאגר ה-Starter Kit באמצעות עורך טקסט לבחירתכם. הסרו את ההערות מהקטע של alertmanager.config. וודאו שהפרמטרים matcher וְ- continue מוסרים מההערות:

config:
  global:
    resolve_timeout: 5m
    slack_api_url: "<YOUR_SLACK_APP_INCOMING_WEBHOOK_URL_HERE>"
  route:
    receiver: "slack-notifications"
    repeat_interval: 12h
    routes:
      - receiver: "slack-notifications"
        matchers:
          - alertname="EmojivotoInstanceDown"
        continue: false
  receivers:
    - name: "slack-notifications"
      slack_configs:
        - channel: "#<YOUR_SLACK_CHANNEL_NAME_HERE>"
          send_resolved: true
          title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
          text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

סוף סוף, שדרגו את ה-prome-stack של kube-prometheus-stack באמצעות helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

עכשיו תקבלו התראות רק מההתראה שתואמת לשם ההתראה EmojivotoInstanceDown. מאחר וה- continue מוגדר ל- false, Alertmanager ישלח התראות רק מההתראה הזו ויפסיק לשלוח לאחרות.

לחיצה על שם ההתראה ב־Slack תפתח דפדפן אינטרנט לדף אינטרנט שאינו נגיש עם DNS הפנימי של קונטיינרים של Alertmanager. זה צפוי. כמה קישורים שימושיים לך לבדיקה: למידע נוסף, תוכל לבדוק שירות ה־DNS של הקונטיינר, פרמטרי התצורה לשליחת התראות, וכמה דוגמאות להתראות.

שלב 4 – איתור באג בהתראה

כאשר ההתראה מופעלת ושולחת התראה ב־Slack חשוב שתוכל לאתר את הבעיה בקלות ולמצוא את הסיבה העיקרית במהירות. כדי לעשות זאת, תוכל להשתמש ב־Grafana שכבר הותקן במדריכי ה־ערימת Prometheus וה־ערימת Loki.

צור הפניה ל־Grafana על פורט 3000:

kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80

פתח דפדפן אינטרנט ב־localhost:3000 והתחבר באמצעות הפרטים המוגדרים כברירת מחדל admin/prom-operator.

נווטו לחלק האזהרות. מסנן המצב, לחצו על אפשרות ההתראה. זהו ההתראת emojivoto-instance-down המוגדרת בחלק "יצירת התראה חדשה" והרחיבו אותה. תראו את הבא:

לחצו על לחצן "ראה גרף". בדף הבא, תוכלו לראות את המונה של מספר ה-pods בשטח השמות emojivoto כנראה כמדד. שימו לב כי Grafana מסנן תוצאות באמצעות טווח זמן של השעון האחרון כברירת מחדל. תאם את זה למרווח הזמן כאשר ההתראה מופעלת. תוכל להתאים את טווח הזמן באמצעות אפשרות ממתין למן לתוצאה יותר דקה או באמצעות טווח מהיר כגון 30 דקות אחרונות.

מהלשונית "חקירה", בחרו במקור נתוני Loki. בכלי חיפוש הלוגים הזינו את הבא: {namespace="emojivoto"} ולחצו על לחצן הרץ שאילתה בצד ימין למעלה של העמוד. תראו את הבא:

וודאו שאתם מכווינים את מרווח הזמן בהתאם.

מהעמוד הזה, תוכלו לסנן את תוצאות הלוג נוספות. לדוגמה, כדי לסנן את הלוגים עבור המיכל web-svc של שטח השמות emojivoto, תוכלו להזין את השאילתה הבאה: {namespace="emojivoto", container="web-svc"}

מידע נוסף על שימוש ב־LogQL ניתן למצוא בשלב 3 – שימוש ב־LogQL.

ניתן גם להשתמש ב אירועי Kubernetes שיוצאו שהותקנו מראש ולסנן את האירועים הקשורים לכמויות השם emojivoto.

הזן את השאילתה הבאה בדפדפן הלוגים: {app="event-exporter"} |= "emojivoto". זה יחזיר את אירועי ה-Kubernetes הקשורים לכמויות השם emojivoto.

מסקנה

במדריך זה, למדת כיצד לבדוק התראות קיימות, ליצור חדשות, ולהגדיר את AlertManager כך שישלח התראות ל-Slack.

למידע נוסף

השלב הבא הוא להגדיר גיבוי ושחזור באמצעות Velero או TrilioVault באשכול DOKS שלך.

Source:
https://www.digitalocean.com/community/developer-center/how-to-set-up-alerts-and-notification-using-alertmanager-in-doks-cluster