תוכנית למידה: אפליקציות שניתנות להרחבה – מעקב באמצעות Prometheus

סדרת המדריכים הזו מיועדת לאדמינים ולמפעילים בתחום ה-IT שרוצים לפרוס, להריץ ולנהל סביבות אפליקציות מודרניות שפועלות ב-Google Kubernetes Engine‏ (GKE). בסדרת המדריכים הזו תלמדו איך להגדיר מעקב והתראות, לשנות את גודל עומסי העבודה ולבצע סימולציה של כשל, והכול באמצעות אפליקציית המיקרו-שירותים לדוגמה של Cymbal Bank:

  1. יצירת אשכול ופריסת אפליקציה לדוגמה
  2. מעקב באמצעות השירות המנוהל של Google Cloud ל-Prometheus (המדריך הזה)
  3. התאמה לעומסי עבודה
  4. סימולציה של כשל
  5. ניהול שינויים באופן מרכזי

סקירה כללית ומטרות

אפליקציית הדוגמה Cymbal Bank שבה נעשה שימוש בסדרת המדריכים הזו מורכבת ממספר מיקרו-שירותים שפועלים באשכול GKE. בעיות באחד מהשירותים האלה עלולות לגרום לחוויה לא טובה ללקוחות הבנק, למשל חוסר אפשרות לגשת לאפליקציה של הבנק. ככל שתקבלו מידע על בעיות בשירותים מוקדם יותר, כך תוכלו להתחיל לפתור את הבעיות מהר יותר.

במדריך הזה תלמדו איך לעקוב אחרי עומסי עבודה באשכול GKE באמצעות השירות המנוהל של Google Cloud ל-Prometheus ו-Cloud Monitoring. תלמדו איך לבצע את המשימות הבאות:

  • יוצרים webhook של Slack עבור Alertmanager.

  • מגדירים את Prometheus כדי לעקוב אחרי הסטטוס של אפליקציה לדוגמה שמבוססת על מיקרו-שירותים.

  • מדמים הפסקת חשמל ובודקים את ההתראות שנשלחות באמצעות ה-webhook של Slack.

עלויות

אם מפעילים את GKE ומפריסים את אפליקציית הדוגמה Cymbal Bank בסדרת הדרכות הזו, יחויבו עלויות לכל אשכול עבור GKE ב- Google Cloud , כמו שמופיע בדף התמחור, עד להשבתת GKE או למחיקת הפרויקט.

אתם גם אחראים לעלויות אחרות Google Cloud שנצברו בזמן הפעלת אפליקציית הדוגמה Cymbal Bank, כמו חיובים על מכונות וירטואליות ב-Compute Engine ועל Cloud Monitoring.

לפני שמתחילים

כדי ללמוד איך לנטר את עומסי העבודה, צריך להשלים את המדריך הראשון כדי ליצור אשכול GKE שמשתמש ב-Autopilot ולפרוס את אפליקציית הדוגמה Cymbal Bank שמבוססת על מיקרו-שירותים.

מומלץ להשלים את סדרת המדריכים הזו ליצירת אפליקציות שניתן להרחיב את השימוש בהן. במהלך ההתקדמות בסדרת ההדרכות, תרכשו מיומנויות חדשות ותשתמשו ב Google Cloud מוצרים ובשירותים נוספים.

כדי להציג דוגמה לאופן שבו אפשר להשתמש בשירות מנוהל של Google Cloud ל-Prometheus כדי ליצור הודעות לפלטפורמת תקשורת, במדריך הזה נשתמש ב-Slack. בפריסות ייצור משלכם, אתם יכולים להשתמש בכלי התקשורת המועדף של הארגון כדי לעבד ולשלוח הודעות כשיש בעיה באשכול GKE.

  • להצטרף למרחב עבודה ב-Slack, או על ידי הרשמה באמצעות כתובת האימייל או באמצעות הזמנה שנשלחה על ידי אדמין ב-Workspace.

יצירת אפליקציית Slack

חלק חשוב בהגדרת המעקב הוא לוודא שתקבלו התראה כשמתרחשים אירועים שדורשים פעולה, כמו הפסקות שירות. דוגמה נפוצה לכך היא שליחת התראות לכלי תקשורת כמו Slack, שבו אתם משתמשים במדריך הזה. ב-Slack יש תכונת וווב-הוקס (webhooks) שמאפשרת לאפליקציות חיצוניות, כמו פריסות הייצור שלכם, ליצור הודעות. אתם יכולים להשתמש בכלים אחרים לתקשורת בארגון כדי לעבד ולשלוח הודעות כשיש בעיה באשכול GKE.

אשכולות GKE שמשתמשים ב-Autopilot כוללים מופע של השירות המנוהל של Google Cloud ל-Prometheus. המופע הזה יכול ליצור התראות כשמשהו קורה לאפליקציות שלכם. אחר כך אפשר להשתמש ב-webhook של Slack כדי לשלוח הודעה לסביבת העבודה שלכם ב-Slack, וכך תקבלו התראות מיידיות כשיש בעיה.

כדי להגדיר התראות ב-Slack על סמך התראות שנוצרו על ידי Prometheus, צריך ליצור אפליקציית Slack, להפעיל את התכונה Incoming Webhooks באפליקציה ולהתקין את האפליקציה בסביבת עבודה של Slack.

  1. נכנסים ל-Slack באמצעות שם סביבת העבודה ופרטי הכניסה לחשבון Slack.

  2. יצירת אפליקציית Slack חדשה

    1. בתיבת הדו-שיח יצירת אפליקציה, לוחצים על מאפס.
    2. מציינים שם אפליקציה ובוחרים את סביבת העבודה שלכם ב-Slack.
    3. לחצו על Create App.
    4. בקטע הוספת תכונות ופונקציונליות, לוחצים על Incoming Webhooks (הודעות webhook נכנסות).
    5. לוחצים על המתג הפעלת וווב-הוקים לשיחות נכנסות.
    6. בקטע Webhook URLs for Your Workspace (כתובות URL של Webhook לסביבת העבודה), לוחצים על Add New Webhook to Workspace (הוספת Webhook חדש לסביבת העבודה).
    7. בדף ההרשאה שנפתח, בוחרים ערוץ לקבלת התראות.
    8. לוחצים על אישור.
    9. ‫Webhook לאפליקציית Slack מוצג בקטע Webhook URLs for Your Workspace. שומרים את כתובת ה-URL למועד מאוחר יותר.

הגדרת Alertmanager

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

כדי להגדיר את Alertmanager כך שישתמש ב-webhook של Slack, מבצעים את השלבים הבאים:

  1. משנים את הספריות למאגר Git שכולל את כל קובצי המניפסט לדוגמה של Cymbal Bank מהמדריך הקודם:

    cd ~/bank-of-anthos/
    

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

  2. מעדכנים את קובץ ה-YAML לדוגמה של Alertmanager עם כתובת ה-URL של ה-webhook של אפליקציית Slack:

    sed -i "s@SLACK_WEBHOOK_URL@SLACK_WEBHOOK_URL@g" "extras/prometheus/gmp/alertmanager.yaml"
    

    מחליפים את SLACK_WEBHOOK_URL בכתובת ה-URL של ה-webhook מהקטע הקודם.

  3. כדי להשתמש באופן דינמי בכתובת ה-webhook הייחודית שלכם ב-Slack בלי לבצע שינויים בקוד האפליקציה, אתם יכולים להשתמש ב-Kubernetes Secret. קוד האפליקציה קורא את הערך של הסוד הזה. באפליקציות מורכבות יותר, היכולת הזו מאפשרת לשנות או להחליף ערכים מסיבות שקשורות לאבטחה או לתאימות.

    יוצרים סוד של Kubernetes עבור Alertmanager באמצעות מניפסט לדוגמה של YAML שמכיל את ה-webhook URL של Slack:

    kubectl create secret generic alertmanager \
      -n gmp-public \
      --from-file=extras/prometheus/gmp/alertmanager.yaml
    
  4. ‫Prometheus יכול להשתמש בexporters כדי לקבל מדדים מאפליקציות בלי לבצע שינויים בקוד. הכלי Prometheus blackbox exporter מאפשר לכם לבדוק נקודות קצה כמו HTTP או HTTPS. הכלי הזה מתאים למקרים שבהם לא רוצים או לא יכולים לחשוף את הפעולות הפנימיות של האפליקציה ל-Prometheus. ה-Prometheus blackbox exporter יכול לפעול בלי לבצע שינויים בקוד אפליקציה כדי לחשוף מדדים ל-Prometheus.

    פורסים את כלי הייצוא של Prometheus blackbox באשכול:

    kubectl apply -f extras/prometheus/gmp/blackbox-exporter.yaml
    

הגדרת Prometheus

אחרי שמגדירים את Alertmanager כך שישתמש ב-webhook של Slack, צריך להגדיר ב-Prometheus מה לעקוב ב-Cymbal Bank, ואילו סוגי אירועים אתם רוצים ש-Alertmanager ישלח לכם לגביהם התראות באמצעות ה-webhook של Slack.

באפליקציית הדוגמה Cymbal Bank שבה משתמשים במדריכים האלה, יש מיקרו-שירותים שונים שפועלים באשכול GKE. בעיה אחת שכדאי לדעת עליה בהקדם האפשרי היא אם אחד מהשירותים של Cymbal Bank הפסיק להגיב לבקשות בצורה רגילה, מה שעשוי להצביע על כך שהלקוחות לא יכולים לגשת לאפליקציה. אתם יכולים להגדיר את Prometheus כך שיגיב לאירועים על סמך המדיניות של הארגון שלכם.

Probes

אתם יכולים להגדיר בדיקות של Prometheus למשאבים שאתם רוצים לעקוב אחריהם. הבדיקות האלה יכולות ליצור התראות על סמך התגובה שהן מקבלות. באפליקציית הדוגמה של Cymbal Bank, אפשר להשתמש בבדיקות HTTP שבודקות קודי תגובה ברמה 200 מהשירותים. תגובה ברמה HTTP 200 מציינת שהשירות פועל בצורה תקינה ויכול להגיב לבקשות. אם יש בעיה והבדיקה לא מקבלת את התגובה הצפויה, אפשר להגדיר כללים של Prometheus שמפיקים התראות ש-Alertmanager מעבד ומבצע פעולות נוספות.

  1. יוצרים כמה בדיקות Prometheus כדי לעקוב אחרי סטטוס ה-HTTP של המיקרו-שירותים השונים באפליקציית הדוגמה Cymbal Bank. דוגמה למניפסט:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: frontend-probe
      labels:
        app.kubernetes.io/name: frontend-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [frontend:80]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: userservice-probe
      labels:
        app.kubernetes.io/name: userservice-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [userservice:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: balancereader-probe
      labels:
        app.kubernetes.io/name: balancereader-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [balancereader:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: contacts-probe
      labels:
        app.kubernetes.io/name: contacts-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [contacts:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: ledgerwriter-probe
      labels:
        app.kubernetes.io/name: ledgerwriter-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [ledgerwriter:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: transactionhistory-probe
      labels:
        app.kubernetes.io/name: transactionhistory-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [transactionhistory:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    

    כפי שמוצג בקובץ המניפסט הזה, מומלץ שכל בדיקת חיות (liveness probe) של PodMonitoringPrometheus תנטר כל פריסה בנפרד.

  2. כדי ליצור את בקשות הבדיקה של Prometheus, מחילים את המניפסט על האשכול:

    kubectl apply -f extras/prometheus/gmp/probes.yaml
    

כללים

מערכת Prometheus צריכה לדעת מה אתם רוצים לעשות על סמך התגובה שמתקבלת מהבדיקות שיצרתם בשלבים הקודמים. אתם מגדירים את התגובה הזו באמצעות כללי Prometheus.

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

  1. ליצור כללים שמפיקים אירועים על סמך התגובה לבדיקות הפעילות. בדוגמה הבאה אפשר לראות קובץ manifest:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: Rules
    metadata:
      name: uptime-rule
    spec:
      groups:
      - name: Micro services uptime
        interval: 60s
        rules:
        - alert: BalancereaderUnavailable
          expr: probe_success{job="balancereader-probe"} == 0
          for: 1m
          annotations:
            summary: Balance Reader Service is unavailable
            description: Check Balance Reader pods and its logs
          labels:
            severity: 'critical'
        - alert: ContactsUnavailable
          expr: probe_success{job="contacts-probe"} == 0
          for: 1m
          annotations:
            summary: Contacts Service is unavailable
            description: Check Contacts pods and its logs
          labels:
            severity: 'warning'
        - alert: FrontendUnavailable
          expr: probe_success{job="frontend-probe"} == 0
          for: 1m
          annotations:
            summary: Frontend Service is unavailable
            description: Check Frontend pods and its logs
          labels:
            severity: 'critical'
        - alert: LedgerwriterUnavailable
          expr: probe_success{job="ledgerwriter-probe"} == 0
          for: 1m
          annotations:
            summary: Ledger Writer Service is unavailable
            description: Check Ledger Writer pods and its logs
          labels:
            severity: 'critical'
        - alert: TransactionhistoryUnavailable
          expr: probe_success{job="transactionhistory-probe"} == 0
          for: 1m
          annotations:
            summary: Transaction History Service is unavailable
            description: Check Transaction History pods and its logs
          labels:
            severity: 'critical'
        - alert: UserserviceUnavailable
          expr: probe_success{job="userservice-probe"} == 0
          for: 1m
          annotations:
            summary: User Service is unavailable
            description: Check User Service pods and its logs
          labels:
            severity: 'critical'
    

    קובץ המניפסט הזה מתאר PrometheusRule וכולל את השדות הבאים:

    • spec.groups.[*].name: השם של קבוצת הכללים.
    • spec.groups.[*].interval: התדירות שבה מתבצעת הערכה של הכללים בקבוצה.
    • spec.groups.[*].rules[*].alert: שם ההתראה.
    • spec.groups.[*].rules[*].expr: ביטוי PromQL להערכה.
    • spec.groups.[*].rules[*].for: משך הזמן שצריך להמתין להתראות לפני שהן נחשבות כהתראות שמופעלות.
    • spec.groups.[*].rules[*].annotations: רשימה של הערות להוספה לכל התראה. ההגדרה הזו תקפה רק לכללי התראה.
    • spec.groups.[*].rules[*].labels: התוויות שרוצים להוסיף או להחליף.
  2. כדי ליצור את הכללים, מחילים את המניפסט על האשכול:

    kubectl apply -f extras/prometheus/gmp/rules.yaml
    

סימולציה של הפסקת שירות

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

  1. כדי לדמות הפסקה של אחד מהמיקרו-שירותים, משנים את קנה המידה של contactsDeployment לאפס. אם אין מקרים של השירות, אפליקציית הדוגמה של Cymbal Bank לא יכולה לקרוא את הפרטים ליצירת קשר של הלקוחות:

    kubectl scale deployment contacts --replicas 0
    

    יכול להיות שיחלפו עד 5 דקות עד ש-GKE יקטין את קנה המידה של הפריסה.

  2. בודקים את הסטטוס של הפריסות באשכול ומוודאים שcontactsהפריסה מצטמצמת בצורה נכונה:

    kubectl get deployments
    

    בדוגמת הפלט הבאה, הפריסה contacts צומצמה בהצלחה ל-0 מופעים:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    balancereader        1/1     1            1           17m
    blackbox-exporter    1/1     1            1           5m7s
    contacts             0/0     0            0           17m
    frontend             1/1     1            1           17m
    ledgerwriter         1/1     1            1           17m
    loadgenerator        1/1     1            1           17m
    transactionhistory   1/1     1            1           17m
    userservice          1/1     1            1           17m
    
  3. אחרי שהפריסה contacts מצטמצמת לאפס, בדיקת ה-Prometheus מדווחת על קוד שגיאת HTTP. שגיאת ה-HTTP הזו יוצרת התראה עבור Alertmanager, ואז המערכת מעבדת אותה.

    בודקים אם בערוץ שלכם במרחב העבודה ב-Slack מופיעה הודעה על הפסקת שירות עם טקסט שדומה לדוגמה הבאה:

    [FIRING:1] ContactsUnavailable
    Severity: Warning :warning:
    Summary: Contacts Service is unavailable
    Namespace: default
    Check Contacts pods and it's logs
    
  4. במקרה של הפסקת שירות אמיתית, אחרי שתקבלו את ההתראה ב-Slack, תתחילו לפתור את הבעיה ולשחזר את השירותים. במדריך הזה, נדמה את התהליך הזה ונשחזר את הפריסה של contacts על ידי הקטנת מספר הרפליקות:

    kubectl scale deployment contacts --replicas 1
    

    יכול להיות שיחלפו עד 5 דקות עד שהפריסה תתרחב ועד שהבדיקה של Prometheus תקבל תגובת HTTP 200. כדי לבדוק את הסטטוס של הפריסות, משתמשים בפקודה kubectl get deployments.

    כשמתקבלת תגובה תקינה לבדיקה של Prometheus, ‏ Alertmanager מנקה את האירוע. בערוץ בסביבת העבודה שלכם ב-Slack אמורה להופיע הודעה על פתרון ההתראה, כמו בדוגמה הבאה:

    [RESOLVED] ContactsUnavailable
    Severity: Warning :warning:
    Summary: Contacts Service is unavailable
    Namespace: default
    Check Contacts pods and it's logs
    

הסרת המשאבים

מומלץ להשלים את סדרת המדריכים הזו של Cymbal Bank לפי הסדר. במהלך ההתקדמות בסדרת ההדרכות, תרכשו מיומנויות חדשות ותשתמשו ב Google Cloud מוצרים ובשירותים נוספים.

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

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים

במדריך הבא מוסבר איך להרחיב את הפריסות ב-GKE.