פתרון בעיות במדדים של המערכת

בדף הזה מוסבר איך לפתור בעיות שקשורות למדדי מערכת באשכולות Google Kubernetes Engine ‏ (GKE).

מדדים מהאשכול לא מופיעים ב-Cloud Monitoring

מוודאים שהפעלתם את Monitoring API ואת Logging API בפרויקט. כדאי גם לוודא שאפשר לראות את הפרויקט בסקירה הכללית של Cloud Monitoring במסוףGoogle Cloud .

אם הבעיה נמשכת, כדאי לבדוק את הסיבות האפשריות הבאות:

  • האם הפעלתם מעקב באשכול?

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

    gcloud container clusters describe CLUSTER_NAME
    

    הפלט של הפקודה הזו צריך לכלול את SYSTEM_COMPONENTS ברשימה של enableComponents במקטע monitoringConfig, בדומה לדוגמה הבאה:

    monitoringConfig:
      componentConfig:
        enableComponents:
        - SYSTEM_COMPONENTS
    

    אם המעקב לא מופעל, מריצים את הפקודה הבאה כדי להפעיל אותו:

    gcloud container clusters update CLUSTER_NAME --monitoring=SYSTEM
    
  • כמה זמן עבר מאז שהאשכול נוצר או מאז שהפעלתם את המעקב?

    יכול להיות שיעברו עד שעה לפני שמדדים של אשכול חדש יתחילו להופיע ב-Cloud Monitoring.

  • האם heapster או gke-metrics-agent (OpenTelemetry Collector) פועלים באשכול במרחב השמות kube-system?

    יכול להיות שה-Pod הזה לא מצליח לתזמן עומסי עבודה כי יש מחסור במשאבים באשכול. כדי לבדוק אם Heapster או OpenTelemetry פועלים, מריצים את הפקודה kubectl get pods --namespace=kube-system ובודקים אם יש Pods עם heapster או gke-metrics-agent בשם.

  • האם רמת הבקרה של האשכול יכולה לתקשר עם הצמתים?

    התקשורת הזו חיונית ל-Cloud Monitoring. כדי לבדוק אם מישור הבקרה מתקשר עם הצמתים, מריצים את הפקודה הבאה:

    kubectl logs POD_NAME
    

    אם הפקודה הזו מחזירה שגיאה, יכול להיות שמנהרות ה-SSH גורמים לבעיה. כדי לראות את השלבים לפתרון הבעיה, אפשר לעיין במאמר בנושא פתרון בעיות ב-SSH.

זיהוי ותיקון בעיות הרשאות בכתיבת מדדים

‫GKE משתמש בחשבונות שירות של IAM שמצורפים לצמתים כדי להריץ משימות מערכת כמו רישום ביומן ומעקב. לפחות, חשבונות השירות של הצמתים צריכים לקבל את התפקיד Kubernetes Engine Default Node Service Account ‏(roles/container.defaultNodeServiceAccount) בפרויקט. כברירת מחדל, GKE משתמש בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, שנוצר באופן אוטומטי בפרויקט, כחשבון השירות של הצומת.

אם בארגון שלכם נאכף iam.automaticIamGrantsForDefaultServiceAccounts אילוץ מדיניות הארגון, יכול להיות שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine בפרויקט שלכם לא יוקצו באופן אוטומטי ההרשאות הנדרשות ל-GKE.

  • כדי לזהות את הבעיה, בודקים אם יש שגיאות 401 בעומס העבודה של ניטור המערכת באשכול:

    [[ $(kubectl logs -l k8s-app=gke-metrics-agent -n kube-system -c gke-metrics-agent | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"
    

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

כדי להעניק את התפקיד roles/container.defaultNodeServiceAccount לחשבון השירות שמוגדר כברירת המחדל של Compute Engine, מבצעים את השלבים הבאים:

המסוף

  1. נכנסים לדף Welcome:

    מעבר לדף Welcome

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

    כניסה לדף IAM

  4. לוחצים על Grant access.
  5. בשדה New principals, מציינים את הערך הבא:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    מחליפים את PROJECT_NUMBER במספר הפרויקט שהעתקתם.
  6. בתפריט Select a role (בחירת תפקיד), בוחרים בתפקיד Kubernetes Engine Default Node Service Account (חשבון השירות שמשמש כברירת מחדל לצומת ב-Kubernetes Engine).
  7. לוחצים על Save.

gcloud

  1. איך מוצאים את Google Cloud מספר הפרויקט:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    מחליפים את PROJECT_ID במזהה הפרויקט.

    הפלט אמור להיראות כך:

    12345678901
    
  2. מקצים לחשבון השירות של Compute Engine שמוגדר כברירת מחדל את התפקיד roles/container.defaultNodeServiceAccount:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    מחליפים את PROJECT_NUMBER במספר הפרויקט מהשלב הקודם.

מוודאים שיש מספיק זיכרון לסוכן המדדים

אם ניסיתם את השלבים הקודמים לפתרון בעיות והמדדים עדיין לא מופיעים, יכול להיות שאין מספיק זיכרון לסוכן המדדים.

ברוב המקרים, הקצאת ברירת המחדל של משאבים לסוכן המדדים של GKE מספיקה. עם זאת, אם ה-DaemonSet קורס שוב ושוב, אפשר לבדוק את סיבת הסיום באמצעות ההוראות הבאות:

  1. אחזור השמות של ה-Pods של סוכן המדדים של GKE:

    kubectl get pods -n kube-system -l component=gke-metrics-agent
    
  2. מוצאים את ה-Pod עם הסטטוס CrashLoopBackOff.

    הפלט אמור להיראות כך:

    NAME                    READY STATUS           RESTARTS AGE
    gke-metrics-agent-5857x 0/1   CrashLoopBackOff 6        12m
    
  3. תאר את ה-Pod עם הסטטוס CrashLoopBackOff:

    kubectl describe pod POD_NAME -n kube-system
    

    מחליפים את POD_NAME בשם של ה-Pod מהשלב הקודם.

    אם סיבת הסיום של ה-Pod היא OOMKilled, לסוכן נדרש זיכרון נוסף.

    הפלט אמור להיראות כך:

      containerStatuses:
      ...
      lastState:
        terminated:
          ...
          exitCode: 1
          finishedAt: "2021-11-22T23:36:32Z"
          reason: OOMKilled
          startedAt: "2021-11-22T23:35:54Z"
    
  4. מוסיפים תווית צומת לצומת עם סוכן המדדים שנכשל. אפשר להשתמש בתווית צומת קבועה או זמנית. מומלץ לנסות להוסיף עוד 20MB. אם הסוכן ממשיך לקרוס, אפשר להריץ את הפקודה הזו שוב, ולהחליף את התווית של הצומת בתווית שמבקשת כמות גדולה יותר של זיכרון נוסף.

    כדי לעדכן מאגר צמתים עם תווית קבועה, מריצים את הפקודה הבאה:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --node-labels=ADDITIONAL_MEMORY_NODE_LABEL \
        --location=COMPUTE_LOCATION
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODEPOOL_NAME: השם של מאגר הצמתים.
    • CLUSTER_NAME: השם של האשכול הקיים.
    • ADDITIONAL_MEMORY_NODE_LABEL: אחת מהתוויות הנוספות של צומת הזיכרון. אפשר להשתמש באחד מהערכים הבאים:
      • כדי להוסיף 10MB: cloud.google.com/gke-metrics-agent-scaling-level=10
      • כדי להוסיף 20MB: cloud.google.com/gke-metrics-agent-scaling-level=20
      • כדי להוסיף 50MB: cloud.google.com/gke-metrics-agent-scaling-level=50
      • כדי להוסיף 100MB: cloud.google.com/gke-metrics-agent-scaling-level=100
      • כדי להוסיף 200MB: cloud.google.com/gke-metrics-agent-scaling-level=200
      • כדי להוסיף 500MB: cloud.google.com/gke-metrics-agent-scaling-level=500
    • COMPUTE_LOCATION: המיקום של Compute Engine של האשכול.

    אפשרות אחרת היא להוסיף תווית זמנית לצומת שלא תישמר אחרי שדרוג באמצעות הפקודה הבאה:

    kubectl label node/NODE_NAME \
    ADDITIONAL_MEMORY_NODE_LABEL --overwrite
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODE_NAME: שם הצומת של סוכן המדדים המושפע.
    • ADDITIONAL_MEMORY_NODE_LABEL: אחת מהתוויות הנוספות של צומת הזיכרון. אפשר להשתמש באחד מהערכים מהדוגמה הקודמת.

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