קבלת תובנות מרכזיות לגבי ההוצאות על הקצאת משאבים ועלויות אשכולות ב-GKE

במאמר הזה מוסבר איך לקבל תובנות חשובות לגבי ההוצאות כדי לקבל החלטות מושכלות לגבי הקצאת משאבים ואופטימיזציה של עלויות באמצעות שיוך עלויות ב-Google Kubernetes Engine ‏ (GKE). במאמר הזה נסביר מה ההבדל בין הקצאת עלויות ב-GKE לבין מדידת השימוש באשכולות, מהן המגבלות של הקצאת עלויות ב-GKE, איך מפעילים הקצאת עלויות ב-GKE באשכולות חדשים וקיימים ואיך מסננים את נתוני החיוב ב-Cloud שמיוצאים ל-BigQuery ומריצים עליהם שאילתות.

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

לפני שקוראים את המסמך הזה, כדאי לעיין בשיטות מומלצות להרצה של אפליקציות Kubernetes שעברו אופטימיזציה לעלויות ב-GKE

הגדלה פוטנציאלית של נפח הנתונים

הפעלת הקצאת עלויות ב-GKE יכולה להגדיל את עלויות האחסון והשאילתות ב-BigQuery. הגידול המדויק תלוי במספר השילובים הייחודיים של תוויות ומרחבי שמות שבהם אתם משתמשים ב-Pods ובאשכולות.

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

הקצאת עלויות ומדידת שימוש באשכולות GKE

הקצאת עלויות ב-GKE שונה ממכסת שימוש באשכולות בדרכים הבאות:

  • הקצאת עלויות ב-GKE היא חלופה למדידת השימוש באשכולות, ומאפשרת לקבל מידע על האשכולות.
  • הקצאת עלויות ב-GKE מחשבת את עלויות האשכולות בחשבון לחיוב ב-Cloud, במקום לצבור את הנתונים בתבנית של Data Studio.
  • הקצאת עלויות ב-GKE מאפשרת לכם לראות את נתוני העלויות של אשכולות במסוף Google Cloud Cloud Billing ובייצוא המפורט של נתוני החיוב ב-Cloud.

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

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

מגבלות

  • אפשר לראות את נתוני הקצאת העלויות ב-GKE רק בנתונים המפורטים של עלויות השימוש בחיוב ב-Cloud שמיוצאים ל-BigQuery. נתוני ההקצאה של GKE לא זמינים בנתונים הסטנדרטיים של עלויות השימוש שמיוצאים ל-BigQuery.
  • אם תפעילו את הקצאת העלויות ב-GKE, בנתוני החיוב שמייצאים יופיעו פריטים נוספים למשאבי GKE החל מאותו תאריך. ייצוא נתוני החיוב לא ממלא חוסרים (backfill) בנתונים.
  • אם משביתים את הקצאת העלויות ב-GKE, בנתוני החיוב שמייצאים לא מופיעים יותר פריטים נוספים, אבל לא משנים או מסירים פריטים קודמים שנוצרו בזמן שהתכונה הייתה מופעלת.
  • נתוני הקצאת העלויות ב-GKE מבוססים על בקשות למשאבים, ולא על משאבים שנצרכו. מידע נוסף על ההבדלים בין בקשות למשאבים, מגבלות על משאבים וצריכת משאבים זמין במאמר שיטות מומלצות ל-Kubernetes: בקשות למשאבים ומגבלות על משאבים.
  • הקצאת עלויות ב-GKE תומכת בסוגי המק"טים הבאים של משאבים:
    • מזהי מק"טים של מכונות וירטואליות ב-Compute Engine עם מעבדי vCPU
    • מכונות וירטואליות של Compute Engine: מק"טים של זיכרון RAM
    • מק"טים של זיכרון RAM מורחב בהתאמה אישית למכונות וירטואליות ב-Compute Engine
    • מק"טים של GPU במכונות וירטואליות של Compute Engine
    • מק"טים של קיבולת PD ב-Compute Engine
    • מזהי מלאי (SKU) של מכונות Cloud TPU
  • אם ל-Pod יש יותר מ-50 תוויות של Kubernetes, אף אחת מהתוויות האלה לא תהיה זמינה בקטע Cloud Billing במסוף Google Cloud או בייצוא המפורט של נתוני החיוב ב-Cloud.
  • אחרי שמפעילים את הקצאת העלויות ב-GKE, יכולים לחלוף עד שלושה ימים עד שהנתונים יופיעו בחיוב ב-Cloud.
  • הקצאת העלויות ב-GKE כוללת נתונים מ-Persistent Disks, עם החריגים הבאים:
    • יש תמיכה רק במשאבי PersistentVolume שהוקצו באופן דינמי דרך PersistentVolumeClaims או Generic Ephemeral Volumes.
    • הפונקציה תומכת רק במשאבי PersistentVolume שהוקצו על ידי מנהל התקן CSI של דיסק אחסון מתמיד ב-Compute Engine או על ידי תוסף האחסון kubernetes.io/gce-pd שהוצא משימוש, עם מצב גישה ReadWriteOnce או ReadWriteOncePod.
    • יכול להיות שלא נעקוב אחרי דיסקים קשיחים קבועים עם זמן פעולה רציפה של פחות מ-30 דקות. כוננים קשיחים קבועים עם זמן פעולה רציף של 30 דקות לפחות תמיד נכללים במעקב.
  • הגרסה של Cloud TPU צריכה להיות Cloud TPU v4 ואילך.
  • הקצאת עלויות ב-GKE לא פועלת עם מכונות וירטואליות מסוג A4 או A4X, או עם יחידות GPU שמצורפות למכונות האלה.
  • אין תמיכה בהקצאת עלויות ב-GKE כשמשתמשים בפתרונות חיצוניים לניהול צמתים שעוקפים את מאגרי הצמתים ב-GKE.
  • כשמשתמשים בהנחות תמורת התחייבות לשימוש (CUD) עם שיתוף הנחות מופעל, יכול להיות שהעלויות של המקרים שמכוסים על ידי CUD לא יפורטו באופן מלא על ידי הקצאת עלויות ב-GKE, וישויכו למרחב שמות כמו goog-k8s-unsupported-sku.

צפייה בעלויות של אשכול GKE

כשמפעילים את הקצאת העלויות ב-GKE, שם האשכול ומרחב השמות של עומסי העבודה ב-GKE מופיעים בשדה labels בייצוא של נתוני החיוב ל-BigQuery:

מפתח של תווית משאב (labels.key) ערך תווית המשאב (labels.value)
תיאור תוויות Kubernetes הן בפורמט הבא: k8s-label/${k8s-label-key}, כאשר ${k8s-label-key} הוא המפתח של תווית Kubernetes של ה-Pod. לתווית החיוב k8s-label/${k8s-label-key} יש את אותו ערך כמו לתווית ה-Pod התואמת ב-Kubernetes. אם מפתח של תווית Kubernetes מתנגש עם מפתח של תווית מכונה וירטואלית, ערך התווית של Kubernetes מבטל את ערך התווית של המכונה הווירטואלית. תוויות משאבים של אשכולות ומאגרי צמתים מוחלות על משאבים לפי סדר העדיפות הבא, מהגבוה לנמוך:
  • משאב ספציפי, כמו מופע או אחסון
  • מאגר צמתים
  • אשכול
שם האשכול goog-k8s-cluster-name [cluster-name]
מרחב שמות k8s-namespace [מרחב שמות]
סוג עומס העבודה k8s-workload-type [workload-type]
(e.g. apps/v1-Deployment,apps/v1-StatefulSet,apps/v1-DaemonSet,apps/v1-ReplicaSet,batch/v1-Job,batch/v1-CronJob,core/v1-Pod)
שם עומס העבודה k8s-workload-name [workload-name]

מידע נוסף מופיע במאמר בנושא סכימה של נתוני עלות מפורטים של שימוש.

בנוסף, מרחבי השמות הבאים משמשים למעקב אחר תקורה ומשאבים לא מוקצים:

  • kube:system-overhead: הערך הזה מייצג את משאבי הצמתים שלא זמינים ל-Pods. המערכת שומרת את המשאבים האלה להרצת מסגרת Kubernetes (כולל, בין היתר, kubelet,‏ kube-proxy,‏ containerd). זהו ההבדל בין הקיבולת של הצומת לבין המשאבים שניתן להקצות.
  • kube:unallocated: משאבים שלא נדרשים על ידי עומסי עבודה ולא נדרשים לתקורה של המערכת.

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

  • goog-k8s-unknown: לא הייתה אפשרות לעבד את המק"ט בחיוב ב-Cloud. המצב הזה יכול לקרות כשמפעילים מכונה חדשה של Compute Engine. יכול להיות שתראו ערכים של goog-k8s-unknown במהלך הפעלה וכיבוי של צומת, למשל כש-GKE משנה את גודל האשכול באופן אוטומטי.
  • goog-k8s-unsupported-sku: המק"ט הזה לא נתמך בהקצאת עלויות ב-GKE. התג הזה זהה לתג <blank>/NULL. אין ערובה לכך שמק"ט תמיד יסומן בערך הזה.
  • <blank>/NULL: הקצאת העלויות ב-GKE לא עוקבת אחרי המשאב הזה. הבעיה הזו יכולה לקרות אם הקצאת העלויות ב-GKE לא מופעלת, או אם המשאב לא שייך לאשכול שמנוהל על ידי GKE.

העלויות של דיסקים לאחסון מתמיד מתועדות כשה-PersistentVolumeClaims שמגבים את הדיסקים האלה נתבעים על ידי Pods. העלויות של Persistent Disk כוללות את כל המטא-נתונים, כמו תוויות ומרחבי שמות של Pod, של ה-Pod שמבצע את התביעה, עד שהם נמחקים.PersistentVolumeClaims במקרה של PersistentVolumeClaims שנמחקים אבל נשמרים PersistentVolumes בהתאם למדיניות השחזור, העלויות של הדיסקים הקשיחים נרשמות כעלויות לא מוקצות.

תוויות שמוחלות ישירות על PersistentVolumeClaims לא מופיעות בקטע Cloud Billing במסוף Google Cloud או בייצוא המפורט של החיוב ב-Cloud.

במקרה של RAM מורחב, אותו חלק מהעלות הכוללת מוקצה לעומס עבודה עבור מק"טים של RAM רגיל ו-RAM מורחב, על סמך המשאב המבוקש.

הפעלה של הקצאת עלויות ב-GKE

אפשר להפעיל את הקצאת העלויות ב-GKE באשכול חדש או באשכול קיים באמצעות gcloud CLI או מסוף Google Cloud .

gcloud

כדי לעדכן אשכול באמצעות הדגל --enable-cost-allocation:

gcloud container clusters update CLUSTER_NAME \
    --enable-cost-allocation

מחליפים את CLUSTER_NAME בשם האשכול.

אפשר גם להשתמש בדגל --enable-cost-allocation כשיוצרים אשכול חדש באמצעות הפקודה gcloud container clusters create.

המסוף

כדי להפעיל את הקצאת העלויות ב-GKE באשכול קיים:

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud . מעבר אל Google Kubernetes Engine
  2. לוחצים על השם של האשכול שרוצים לשנות.
  3. בדף Clusters (אשכולות), בקטע Features (תכונות), לוחצים על לצד Cost Allocation (הקצאת עלויות).
  4. בתיבת הדו-שיח Edit Cost Allocation, מסמנים את תיבת הסימון Enable Cost Allocation.
  5. לוחצים על שמירת השינויים.

אימות שהקצאת העלויות ב-GKE מופעלת

gcloud

תארו את האשכול:

gcloud container clusters describe CLUSTER_NAME

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

...
costManagementConfig:
  enabled: true
...

בפלט הזה, costManagementConfig מציין שהקצאת העלויות ב-GKE מופעלת.

המסוף

כדי לבדוק אם הקצאת העלויות ב-GKE מופעלת באשכול קיים:

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud . מעבר אל Google Kubernetes Engine
  2. לוחצים על השם של האשכול שרוצים לשנות.
  3. בדף Clusters, בקטע Features, ליד Cost Allocation, יופיע אם הקצאת העלויות ב-GKE מופעלת.

הצגה וסינון של נתוני החיוב המיוצאים

אפשר להשתמש בתוויות Kubernetes שמתוארות במסמך הזה כדי לסנן את העלויות בדף הדוחות של החיוב ב-Cloud במסוף Google Cloud .

אפשר לסנן ולקבץ את העלויות של GKE במערך הנתונים ב-BigQuery באחת מהשיטות הבאות:

אפשר להשתמש בדוגמאות הבאות לשאילתות עם השיטות האלה כדי לסנן את נתוני החיוב שיוצאו ולמצוא מידע שספציפי ל-GKE:

  • איך מקבלים את העלויות אחרי זיכויים לפי מרחב שמות:

    SELECT
      labels.value as namespace,
      SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS cost_after_credits,
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
    LEFT JOIN UNNEST(labels) as labels
      ON labels.key = "k8s-namespace"
    GROUP BY namespace
    ;
    
  • קבלת עלויות של אשכול לפני זיכויים:

    SELECT
      SUM(cost) AS cost_before_credits,
      labels.value AS cluster_name
    FROM  `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
    LEFT JOIN UNNEST(labels) as labels
      ON labels.key = "goog-k8s-cluster-name"
    GROUP BY labels.value
    ;
    
  • קבלת העלויות הכוללות שקשורות ל-GKE לפי מק"ט:

    SELECT
      project.id AS project_id,
      labels.value AS cluster_name,
      sku.id AS sku_id,
      sku.description AS sku_description,
      SUM(cost) AS cost
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
    JOIN UNNEST(labels) AS labels
      ON labels.key = "goog-k8s-cluster-name"
    GROUP BY
      cluster_name, project_id, sku_description, sku_id
    ;
    
  • הצגת עלויות לפי שם עומס העבודה לפני זיכויים:

    SELECT
      labels.value as workload_name,
      SUM(cost) AS cost
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_YYYYYY-YYYYYY-YYYYYY`
    LEFT JOIN UNNEST(labels) as labels
      ON labels.key = "k8s-workload-name"
    WHERE labels.value IS NOT NULL
    GROUP BY workload_name
    ORDER BY cost DESC
    ;
    

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם בדף הזה, צריך להשבית את הקצאת העלויות ב-GKE לאשכול:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-cost-allocation

אפשר גם למחוק את האשכול שיצרתם.

אפשר גם להשתמש בכלי gcloud של שורת הפקודה כדי להציג ולנהל את התוויות. מידע נוסף זמין במאמרי העזרה בנושא gcloud resource-manager tags.

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