בחירת הגודל המתאים לעומסי העבודה ב-GKE בהיקף גדול

במדריך הזה נסביר איך להתאים את גודל עומסי העבודה (workload) ב-Google Kubernetes Engine‏ (GKE) באמצעות המלצות של VPA ומדדי שימוש.

למה חשוב להתאים את גודל המשאבים

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

בטבלה הבאה מוסברות ההשלכות של הקצאת משאבים נמוכה מדי והקצאת משאבים גבוהה מדי של CPU וזיכרון:

משאב סטטוס של ניהול תצורה סיכון הסבר
CPU אובר עלות הגדלת העלות של עומסי העבודה על ידי הזמנת משאבים מיותרים.
מתחת ביצועים יכול לגרום לעומסי עבודה לפעול לאט או להפסיק להגיב.
לא מוגדר אמינות יכול להיות שה-CPU יוגבל ל-0, מה שיגרום לעומסי העבודה לא להגיב.
זיכרון אובר עלות הגדלת העלות של עומסי העבודה על ידי הזמנת משאבים מיותרים.
מתחת אמינות יכול לגרום לסיום של אפליקציות עם שגיאה של חוסר בזיכרון (OOM).
לא מוגדר אמינות kubelet יכול להפסיק את ה-Pods שלכם בכל שלב ולסמן אותם כ'נכשלו'.

מטרות

במדריך הזה תלמדו איך:

  • פורסים אפליקציה לדוגמה.
  • ייצוא מדדי המלצות ל-GKE מ-Monitoring ל-BigQuery.
  • אפשר להשתמש ב-BigQuery וב-Data Studio כדי לראות המלצות לגבי קונטיינרים של GKE בפרויקטים שונים.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

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

הגדרת הפרויקט

ב-Cloud Shell מותקן מראש התוכנה שדרושה לכם כדי לבצע את ההדרכה הזו, כולל Docker,‏ kubectl,‏ gcloud CLI ו-Terraform. אם אתם לא משתמשים ב-Cloud Shell, אתם צריכים להתקין את gcloud CLI.

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את ממשקי ה-API של Resource Manager,‏ Google Kubernetes Engine,‏ Cloud Monitoring,‏ BigQuery,‏ Cloud Run ו-Cloud Build:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של שימוש בשירות' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable cloudresourcemanager.googleapis.com container.googleapis.com monitoring.googleapis.com bigquery.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com artifactregistry.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את ממשקי ה-API של Resource Manager,‏ Google Kubernetes Engine,‏ Cloud Monitoring,‏ BigQuery,‏ Cloud Run ו-Cloud Build:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של שימוש בשירות' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable cloudresourcemanager.googleapis.com container.googleapis.com monitoring.googleapis.com bigquery.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com artifactregistry.googleapis.com
  14. נותנים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/serviceusage.serviceUsageAdmin, roles/container.clusterAdmin, roles/iam.serviceAccountAdmin, roles/iam.securityAdmin, roles/container.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

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

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.

מגדירים את הסביבה

כדי להגדיר את הסביבה, מבצעים את השלבים הבאים

  1. הגדרת משתני סביבה:

    export PROJECT_ID=PROJECT_ID
    export REGION=us-central1
    export ZONE=us-central1-f
    export IMAGE=$REGION-docker.pkg.dev/$PROJECT_ID/main/vpa-recs-image:latest
    

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

  2. מגדירים את משתני הסביבה שמוגדרים כברירת מחדל:

    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    gcloud config set compute/zone $ZONE
    
  3. משכפלים את מאגר הקוד.

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. עוברים לספריית העבודה.

    cd kubernetes-engine-samples/cost-optimization/gke-vpa-recommendations
    

(אופציונלי) הגדרת אפליקציה לדוגמה

זהו קטע אופציונלי שבו אפשר לפרוס אפליקציה לדוגמה. כדי להשתמש באשכול קיים, צריך לוודא שCloud Monitoring מוגדר באשכול.

כדי לדמות סביבה ריאליסטית, תשתמשו בסקריפט הגדרה כדי לפרוס את Online Boutique.

בשלבים הבאים מוסבר איך להתקין את האפליקציה לדוגמה ולשנות את הגדרות ברירת המחדל. לדוגמה, ההוראות מגדירות את Horizontal Pod Autoscaler (HPA) עבור חלק מעומסי העבודה, ומשנות את בקשות המשאבים והמגבלות.

  1. מריצים את סקריפט ההגדרה:

    ./scripts/setup.sh
    

    סקריפט ההגדרה מבצע את הפעולות הבאות:

    • יוצרת אשכול GKE.
    • פריסת אפליקציית הדוגמה Online Boutique.
    • עדכון בקשות למשאבי זיכרון ומעבד (CPU) של Pod.
    • הגדרת משאב HorizontalPodAutoscaler עבור adserviceעומסי העבודה כדי לדמות סביבה מציאותית.

    יכול להיות שיחלפו עד 10 דקות עד שסקריפט ההגדרה יושלם.

  2. מוודאים שהאפליקציה לדוגמה מוכנה:

    kubectl get deployment
    

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

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    adservice               2/2     2            2           4m54s
    cartservice             1/1     1            1           4m55s
    checkoutservice         1/1     1            1           4m56s
    currencyservice         1/1     1            1           4m55s
    emailservice            1/1     1            1           4m56s
    frontend                1/1     1            1           4m55s
    loadgenerator           1/1     1            1           4m55s
    paymentservice          1/1     1            1           4m55s
    productcatalogservice   1/1     1            1           4m55s
    recommendationservice   1/1     1            1           4m56s
    redis-cart              1/1     1            1           4m54s
    shippingservice         1/1     1            1           4m54s
    

יצירת מאגר

יוצרים את המאגר לאחסון התמונה של כלי הייצוא של המדדים.

  1. יוצרים מאגר Docker חדש:

    gcloud artifacts repositories create main --repository-format=docker \
        --location=$REGION \
        --description="docker repository"
    
  2. הגדרת אימות למאגרי Docker:

    gcloud auth configure-docker $REGION-docker.pkg.dev
    
  3. מפעילים את הפקודה הבאה כדי לפרוס את האימג':

    gcloud builds submit metrics-exporter --region=$REGION --tag $IMAGE
    

פריסת האפליקציה

בקטע הבא, משתמשים ב-Terraform כדי לבצע את המשימות הבאות:

  • יוצרים חשבון שירות ומקצים לו את ההרשאות שנדרשות לניהול משאבים ולביצוע פעולות במשאבים Google Cloud .
  • מעניקים לחשבון השירות את התפקידים: בעל הרשאת צפייה בנתוני המעקב, עריכת נתונים ב-BigQuery, בעלות על נתונים ב-BigQuery, משתמש ב-BigQuery לצורך הפעלת משימות ומשתמש ב-Cloud Run לצורך הפעלת שירותים.
  • פריסת עבודה (job) ב-Cloud Run ששולפת קובץ אימג' של Docker מ-Artifact Registry ומריצה אותו עם ההגדרה שצוינה.
  • יצירת משימה ב-Cloud Scheduler שמפעילה את שירות Cloud Run מדי יום.
  • יוצרים מערך נתונים, טבלה ותצוגה ב-BigQuery כדי לאחסן את נתוני המדדים וההמלצות.

הגדרת Terraform

  1. מגדירים משתני סביבה של תצורה:

    export TF_VAR_BIGQUERY_DATASET=gke_metrics_dataset
    export TF_VAR_BIGQUERY_TABLE=gke_metrics
    export TF_VAR_RECOMMENDATION_WINDOW_SECONDS=1209600
    export TF_VAR_RECOMMENDATION_DISTANCE=86400
    export TF_VAR_LATEST_WINDOW_SECONDS=600
    export TF_VAR_METRIC_WINDOW=259200
    export TF_VAR_METRIC_DISTANCE=600
    

    הפקודה הזו כוללת את הפריטים הבאים:

    • TF_VAR_BIGQUERY_DATASET ו-TF_VAR_BIGQUERY_TABLE: מחזיקים את נתוני המדדים של GKE.
    • TF_VAR_RECOMMENDATION_WINDOW_SECONDS: מסגרת הזמן להמלצות VPA. ברירת המחדל היא 1,209,600 שניות, או 14 ימים.
    • TF_VAR_RECOMMENDATION_DISTANCE: המרווח שבו מוחזרות נקודות נתונים של המלצות VPA. ברירת המחדל היא 86,400 שניות, או כל יום.
    • TF_VAR_LATEST_WINDOW_SECONDS: מסגרת הזמן לקבלת הערכים העדכניים ביותר של משאבים מבוקשים ומשאבי מגבלה. ברירת המחדל היא 600 שניות, או 10 דקות.
    • METRIC_WINDOW: מגדיר את מסגרת הזמן למדדי השימוש והניצול של GKE. ברירת המחדל היא 259,200 שניות, או 3 ימים.
    • METRIC_DISTANCE: המרווח שבו מוחזרות נקודות הנתונים. ברירת המחדל היא 600 שניות, או כל 10 דקות.

    אפשר לשנות את הערכים האלה בהתאם לצרכים של עומסי העבודה. לדוגמה, אם יש לכם עומסי עבודה של אצווה שמופעלים פעם בחודש, צריך לעדכן את TF_VAR_RECOMMENDATION_WINDOW_SECONDS ואת METRIC_WINDOW ל-2592000 שניות (30 ימים).

פריסת התצורה של Terraform

  1. מאתחלים, מאמתים ומחילים את ההגדרות:

    terraform -chdir=terraform init
    terraform -chdir=terraform validate
    terraform -chdir=terraform apply -var project_id=$PROJECT_ID -var region=$REGION -var image=$IMAGE
    

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

    אחרי שהפקודה apply מסתיימת בהצלחה, המשאבים נוצרים ומנוהלים על ידי Terraform.

  2. מריצים את המשימה ב-Cloud Scheduler באופן ידני:

    gcloud scheduler jobs run recommendation-schedule --location ${REGION}
    

אימות הפריסה

  1. לוחצים על הכרטיסייה יומנים בדף הפרטים של workload-recommendations.

  2. מוודאים שיומני המדדים מעובדים במסוף Cloud Run:

    כניסה ל-Cloud Run

    ביומנים מוצגים מדדים שנכתבים ב-BigQuery. הפלט אמור להיראות כך:

    INFO - Building Row
    INFO - Successfully wrote 12 rows to BigQuery table [PROJECT_ID].gke_metric_dataset.gke_metrics.
    INFO - Run Completed
    

    אם הפלט לא תואם, מחכים חמש דקות ומריצים את הפקודה gcloud scheduler jobs run recommendation-schedule --location $REGION.

הצגת ההמלצה לגבי מאגר התגים ב-BigQuery

  1. נכנסים לדף BigQuery במסוף Google Cloud :

    כניסה ל-BigQuery

  2. מוודאים שהנתונים מוצגים בטבלה gke_metrics ובתצוגה container_recommendations. בהתאם למספר עומסי העבודה, יכול להיות שיחלפו כמה דקות עד שכל המדדים ייכתבו ב-BigQuery.

  3. בעורך השאילתות, בוחרים את כל השורות בתצוגה container_recommendations:

    SELECT * FROM `PROJECT_ID.gke_metrics_dataset.container_recommendations`
    

    התוכנית הזו מחלצת את המדדים הבאים מ-Cloud Monitoring:

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

    • שימוש במעבד (CPU) ובזיכרון וניצול שלהם: כמות המעבד (CPU) והזיכרון שבהם נעשה שימוש בעומס העבודה, וגם אחוז המעבד (CPU) והזיכרון שמנוצלים.

    • Requested and limits (בקשה ומגבלות): כמות המעבד והזיכרון שהוקצו לעומס העבודה, וגם הכמות המקסימלית של המעבד והזיכרון שמותרת לעומס העבודה.

    • המלצות לגבי עומס עבודה על המעבד (CPU) והזיכרון: המלצות לגבי כמות המעבד (CPU) והזיכרון שצריך להקצות לעומס העבודה כדי להבטיח שהוא יפעל בצורה חלקה, על סמך המלצות של VPA לגבי פריסות ועל סמך שימוש בפועל ושיעורי ניצול משאבים ללא פריסה.

המחשה ויזואלית של ההמלצות ב-Data Studio

‫Data Studio היא פלטפורמת בינה עסקית (BI) חינמית בשירות עצמי, שמאפשרת לכם ליצור ולצרוך תרשימים וטבלאות של הנתונים, מרכזי בקרה ודוחות. בעזרת Data Studio תוכלו להתחבר לנתונים, ליצור תצוגות חזותיות ולשתף את התובנות שלכם עם אחרים.

אפשר להשתמש ב-Data Studio כדי להציג את הנתונים בתצוגה חזותית בתצוגה של BigQuery container_recommendations:

  1. פותחים את Workload Rightsizing dashboard template
  2. לוחצים על שימוש בנתונים שלי.
  3. בוחרים את הפרויקט הרצוי.
  4. בקטע Dataset (מערך נתונים), בוחרים באפשרות gke_metric_dataset.
  5. בקטע Table (טבלה), בוחרים באפשרות container_recommendations.
  6. לוחצים על הוספה.
  7. לוחצים על הוספה לדוח.

פרטי התבנית של Data Studio

בדף הפרטים של תבנית Data Studio מופיע המידע הבא:

  • סקירה כללית של התאמת גודל עומס העבודה ב-GKE: סקירה כללית של האשכולות, כולל:
    • מספר עומסי העבודה מסוג Best Effort ו-Burstable שעלולים לגרום לבעיות באמינות ובביצועים.
    • חיסכון פוטנציאלי במשאבי המעבד (CPU) והזיכרון. ערכים חיוביים מציינים הקצאת יתר, וערכים שליליים מציינים הקצאת חסר.
  • המלצות לגבי עומס עבודה: מספק המלצות לגבי בקשות ומגבלות של CPU וזיכרון של עומס עבודה.
  • GKE Workloads at Risk: מציג עומסי עבודה שנמצאים בסיכון הגבוה ביותר לחוות בעיות של מהימנות וביצועים.
  • History - Workload Rightsizing - How are we doing?: הדוח מספק תצוגה היסטורית של מידת ההצלחה של הטמעה של התאמת גודל עומס העבודה וצמצום מספר עומסי העבודה מסוג Best Effort.

המלצה לגבי בקשת מעבד (CPU) ומגבלת מאגר

אם ערכי המגבלה והבקשה של המעבד עבור עומסי העבודה שווים, איכות השירות נחשבת למובטחת, וההמלצה לגבי המעבד מוגדרת למקסימום בתוך תקופת החלון של 14 ימים. אחרת, נעשה שימוש באחוזון ה-95 של ההמלצה לגבי בקשת מעבד (CPU) תוך 14 ימים.

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

המלצה לגבי מאגר הזיכרון המבוקש והמגבלה

ההמלצות לזיכרון מבוססות על ההמלצה המקסימלית של VPA לאובייקטים של פריסות בלבד, ועל השימוש המקסימלי בזיכרון עם יעד ניצול של 80% כדי להבטיח את מהימנות עומסי העבודה. אפשר לעדכן את ערכי היעד של הניצול בשאילתה של התצוגה container_recommendation.

מומלץ להשתמש באותו נפח זיכרון לבקשות ולמגבלות, כי זיכרון הוא משאב שלא ניתן לדחוס. כשנגמר הזיכרון, צריך להשבית את ה-Pod. כדי למנוע את השבתת ה-Pods ולמנוע חוסר יציבות בסביבה, צריך להגדיר את הזיכרון הנדרש למגבלת הזיכרון.

מתן עדיפות להמלצות

לכל שורה מוקצה ערך עדיפות כדי להציג עומסי עבודה שדורשים טיפול מיידי על סמך ההמלצות. יחידות המידה של המעבד והזיכרון שונות. כדי לנרמל את היחידות, נעשה שימוש ביחס בין מעבד (CPU) מוגדר מראש לזיכרון במחיר לפי דרישה של סוג מכונה E2 כקירוב להמרה של יחידות זיכרון ליחידות מעבד.

העדיפות מחושבת לפי הנוסחה הבאה:

priority = (CPU requested - CPU recommendation) + ((memory requested -
memory recommendation) / (vCPUs on-demand pricing /memory on-demand pricing ))

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

הצגת המלצות ל-VPA למספר פרויקטים

כדי לראות המלצות לגבי קונטיינרים של VPA בכמה פרויקטים, משתמשים בפרויקט חדש כפרויקט להגדרת היקף.

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

הסרת המשאבים

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

מחיקת הפרויקט

הדרך הקלה ביותר להימנע מחיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

כדי למחוק Google Cloud פרויקט:

gcloud projects delete PROJECT_ID

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