במאמר הזה מוסבר איך לקבל תובנות חשובות לגבי ההוצאות כדי לקבל החלטות מושכלות לגבי הקצאת משאבים ואופטימיזציה של עלויות באמצעות שיוך עלויות ב-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.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-Google Cloud CLI למשימה הזו, מתקינים ואז מאתחלים את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- חשוב לוודא שביצעתם את השלבים לייצוא נתונים מפורטים של עלויות השימוש ל-BigQuery. אם הארגון שלכם כבר מייצא נתונים, אתם צריכים לקבל גישה לשאילתות בטבלאות.
- מוודאים שיש לכם אשכול Standard קיים. כדי ליצור אשכול Standard, אפשר לעיין במאמר בנושא יצירת אשכול אזורי.
מגבלות
- אפשר לראות את נתוני הקצאת העלויות ב-GKE רק בייצוא נתוני עלויות השימוש המפורטים של חיוב ב-Cloud ל-BigQuery. נתוני ההקצאה של GKE לא זמינים בנתוני עלות השימוש הסטנדרטיים שמיוצאים ל-BigQuery.
- אם תפעילו את הקצאת העלויות ב-GKE, בנתוני החיוב שמייצאים יופיעו פריטים נוספים למשאבי GKE החל מאותו תאריך. ייצוא נתוני החיוב לא ממלא חוסרים (backfill) בנתונים.
- אם משביתים את הקצאת העלויות ב-GKE, בנתונים שמייצאים לא מופיעים פריטים נוספים, אבל הפריטים הקודמים שנוצרו כשהתכונה הייתה מופעלת לא משתנים או נמחקים.
- נתוני הקצאת העלויות ב-GKE מבוססים על בקשות למשאבים, ולא על משאבים שנצרכו. מידע נוסף על ההבדלים בין בקשות למשאבים, מגבלות על משאבים וצריכת משאבים זמין במאמר שיטות מומלצות ל-Kubernetes: בקשות למשאבים ומגבלות על משאבים.
- הקצאת עלויות ב-GKE תומכת בסוגי המק"טים הבאים של משאבים:
- מזהי מק"טים של מכונות וירטואליות ב-Compute Engine עם מעבדי vCPU
- מק"טים של זיכרון RAM במכונות וירטואליות של Compute Engine
- מק"טים של זיכרון RAM מורחב בהתאמה אישית למכונות וירטואליות ב-Compute Engine
- מזהי מק"ט של GPU במכונות וירטואליות ב-Compute Engine
- מק"טים של קיבולת PD ב-Compute Engine
- מזהי מק"ט של מכונות Cloud TPU
- אם ל-Pod יש יותר מ-50 תוויות של Kubernetes, אף אחת מהתוויות האלה לא תהיה זמינה בקטע Cloud Billing במסוף Google Cloud או בייצוא המפורט של החיוב ב-Cloud.
- אחרי שמפעילים את הקצאת העלויות ב-GKE, יכולים לחלוף עד שלושה ימים עד שהנתונים יופיעו בחיוב ב-Cloud.
- הקצאת העלויות ב-GKE כוללת נתונים מ-Persistent Disks, חוץ מהמקרים הבאים:
- תמיכה רק במשאבי
PersistentVolumeשמוקצים באופן דינמי דרךPersistentVolumeClaimsאו נפחים זמניים גנריים. - הפונקציה תומכת רק במשאבי
PersistentVolumeשהוקצו על ידי מנהל התקן CSI של דיסק אחסון מתמיד ב-Compute Engine או על ידי תוסף האחסוןkubernetes.io/gce-pdשהוצא משימוש, עם מצב גישהReadWriteOnceאוReadWriteOncePod. - יכול להיות שלא יתבצע מעקב אחרי Persistent Disk עם זמן פעולה תקינה של פחות מ-30 דקות. תמיד מתבצע מעקב אחרי Persistent Disk עם זמן פעולה תקינה של 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} הוא המפתח של התווית של ה-Pod ב-Kubernetes. לתווית לחיוב k8s-label/${k8s-label-key} יש את אותו ערך כמו לתווית ה-Pod התואמת ב-Kubernetes. |
אם מפתח של תווית Kubernetes מתנגש עם מפתח של תווית מכונה וירטואלית, ערך התווית של Kubernetes מבטל את ערך התווית של המכונה הווירטואלית.
תוויות המשאבים של האשכול ומאגר הצמתים מוחלות על המשאבים לפי סדר העדיפויות הבא, מהגבוה לנמוך:
|
| שם האשכול | goog-k8s-cluster-name |
[שם האשכול] |
| מרחב שמות | k8s-namespace |
[namespace] |
| סוג עומס העבודה | k8s-workload-type |
[workload-type] (לדוגמה: 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 בהתאם למדיניות ההחזרה, העלויות של Persistent Disks נחשבות כעלויות שלא הוקצו.
תוויות שמוחלות ישירות על PersistentVolumeClaims לא מופיעות בקטע Cloud Billing במסוף Google Cloud או בייצוא המפורט של החיוב ב-Cloud.
ב-Extended RAM, אותו חלק מהעלות הכוללת מוקצה לעומס עבודה גם למק"טים של Regular RAM וגם למק"טים של Extended RAM, על סמך הקצאת המשאבים המבוקשת.
הפעלת הקצאת עלויות ב-GKE
אפשר להפעיל את הקצאת העלויות ב-GKE באשכול חדש או באשכול קיים באמצעות ה-CLI של gcloud או מסוף 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 באשכול קיים:
- נכנסים לדף Google Kubernetes Engine במסוף Google Cloud . מעבר אל Google Kubernetes Engine
- לוחצים על השם של האשכול שרוצים לשנות.
- בדף Clusters, בקטע Features, לוחצים על edit לצד Cost Allocation.
- בתיבת הדו-שיח Edit Cost Allocation, מסמנים את תיבת הסימון Enable Cost Allocation.
- לוחצים על שמירת השינויים.
אימות שהקצאת העלויות ב-GKE מופעלת
gcloud
תיאור האשכול:
gcloud container clusters describe CLUSTER_NAME
הפלט אמור להיראות כך:
...
costManagementConfig:
enabled: true
...
בפלט הזה, costManagementConfig מציין שהקצאת העלויות ב-GKE מופעלת.
המסוף
כדי לבדוק אם הקצאת העלויות ב-GKE מופעלת באשכול קיים:
- נכנסים לדף Google Kubernetes Engine במסוף Google Cloud . מעבר אל Google Kubernetes Engine
- לוחצים על השם של האשכול שרוצים לשנות.
- בדף Clusters, בקטע Features, ליד Cost Allocation, יופיע אם הקצאת העלויות ב-GKE מופעלת.
צפייה בייצוא של נתוני החיוב וסינון שלהם
אפשר להשתמש בתוויות Kubernetes שמתוארות במסמך הזה כדי לסנן את העלויות בדף דוחות החיוב ב-Cloud במסוף Google Cloud .
אפשר לסנן ולקבץ את העלויות של GKE במערך הנתונים ב-BigQuery באחת מהשיטות הבאות:
- ב-BigQuery, מריצים שאילתה.
- בחיוב ב-Cloud, יוצרים שאילתה ומריצים אותה על נתוני החיוב שיוצאו (גרסת Preview).
אפשר להשתמש בדוגמאות הבאות לשאילתות עם השיטות האלה כדי לסנן את נתוני החיוב שיוצאו ולמצוא מידע שספציפי ל-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.
המאמרים הבאים
- איך מבינים את השימוש במשאבי האשכול
- איך צופים במדדי אופטימיזציה שקשורים לעלויות
- מידע נוסף על שינוי גודל אוטומטי של אשכולות
- איך יוצרים ומנהלים תוויות של אשכולות ומאגרי צמתים
- איך מתאימים את עומסי העבודה בקנה מידה נרחב