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

בדף הזה מוסבר איך לפתור בעיות שקשורות למדדי המערכת באשכולות של 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. בשדה Project number, לוחצים על Copy to clipboard.
  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.
  7. לוחצים על Save.

gcloud

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

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

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

    12345678901
    
  2. מקצים את התפקיד roles/container.defaultNodeServiceAccount לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine:
    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. משיגים את השמות של הפודים של סוכן המדדים של 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: אחת מהתוויות הנוספות של צומת הזיכרון. משתמשים באחד מהערכים מהדוגמה הקודמת.

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