במאמר הזה מוסבר איך להשתמש בהקצאת עלויות ב-Google Kubernetes Engine (GKE) כדי לקבל תובנות חשובות לגבי ההוצאות, שיעזרו לכם לקבל החלטות לגבי הקצאת משאבים ואופטימיזציה של עלויות. במאמר הזה נסביר מה ההבדל בין הקצאת עלויות ב-GKE לבין מדידת השימוש באשכולות, מהן המגבלות של הקצאת עלויות ב-GKE, איך מפעילים הקצאת עלויות ב-GKE באשכולות חדשים וקיימים ואיך מסננים את נתוני החיוב ב-Cloud שמיוצאים ל-BigQuery ומריצים עליהם שאילתות.
המסמך הזה מיועד למפעילים, לאדריכלי ענן, למפתחים ולאדמינים של נתונים שצריכים לנהל את העלויות כשהם יוצרים ומגדירים אשכולות ופורסים עומסי עבודה ב-GKE. למידע נוסף על תפקידים נפוצים, קראו את המאמר תפקידים ומשימות נפוצים של משתמשי GKE.
לפני שאתם קוראים את המאמר הזה, כדאי שתכירו את השיטות המומלצות להרצת אפליקציות Kubernetes ב-GKE עם אופטימיזציה של עלויות.
הגדלה פוטנציאלית של נפח הנתונים
הפעלת הקצאת העלויות ב-GKE יכולה להגדיל את עלויות האחסון והשאילתות ב-BigQuery. העלייה המדויקת תלויה במספר השילובים השונים של תוויות ומרחבי שמות שבהם אתם משתמשים ב-Pod ובאשכולות.
הפעלת הקצאת העלויות ב-GKE לא משנה את העלות הכוללת של השימוש ב-GKE. סכום הפריטים של העלויות בייצוא זהה, והשאילתות והדוחות הקיימים שיצרתם על סמך ייצוא החיוב מחזירים את אותם ערכים.
הקצאת עלויות ב-GKE ומדידת השימוש באשכולות
הקצאת העלויות ב-GKE שונה ממדידת השימוש באשכול בדרכים הבאות:
- הקצאת העלויות ב-GKE היא חלופה למדידת השימוש באשכולות כדי לקבל מידע על האשכולות.
- הקצאת העלויות ב-GKE מחשבת את עלויות האשכולות בחשבון לחיוב ב-Cloud, במקום לצבור את הנתונים בתבנית של Data Studio.
- הקצאת עלויות ב-GKE מאפשרת לכם לראות את נתוני העלויות של אשכול במסוף Google Cloud Cloud Billing ובייצוא המפורט של החיוב ב-Cloud.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את Google Kubernetes Engine API. הפעלת 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 תומכת בסוגי המק"טים הבאים של משאבים:
- מק"טים של מעבדי vCPU במכונות וירטואליות של Compute Engine
- מק"טים של זיכרון RAM במכונות וירטואליות של Compute Engine
- מק"טים של זיכרון RAM מורחב בהתאמה אישית למכונות וירטואליות ב-Compute Engine
- מזהי מק"ט של GPU במכונות וירטואליות ב-Compute Engine
- מק"טים של קיבולת דיסק קבוע ב-Compute Engine
- מק"טים של מכונות 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. - יכול להיות שלא יתבצע מעקב אחרי 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 לא תומכת בקונטיינרים מקוריים מסוג sidecar, שהם קונטיינרים מסוג init עם הגדרת
restartPolicy: Always. הקצאות משאבים שמתבקשות על ידי קונטיינרים משניים (sidecar) לא משויכות למרחב השמות של ה-Pod, אלא מדווחות במרחב השמותkube:unallocated.
צפייה בעלויות של אשכולות 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 |
[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.
העלויות של Persistent Disks נמדדות כש-Pods תובעים את ה-PersistentVolumeClaims שמגבה את ה-Persistent Disk. עלויות ה-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, יוצרים שאילתה ומריצים אותה על נתוני החיוב שיוצאו (תצוגה מקדימה).
אתם יכולים להשתמש בשאילתות לדוגמה הבאות עם השיטות האלה כדי לסנן את נתוני החיוב שיוצאו, כך שיוצג מידע ספציפי ל-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.
המאמרים הבאים
- איך מבינים את השימוש במשאבי האשכול
- איך צופים במדדי אופטימיזציה שקשורים לעלויות
- מידע נוסף על מידרוג אוטומטי של אשכול.
- איך יוצרים ומנהלים תוויות של אשכולות ומאגרי צמתים
- איך מתאימים את עומסי העבודה בקנה מידה נרחב