הפעלת עומסי עבודה (workloads) עמידים בכשלים בעלויות נמוכות יותר באמצעות מכונות Spot

בדף הזה מוסבר איך להריץ עומסי עבודה (workload) באצווה, עומסי עבודה חסרי מצב או עומסי עבודה עמידים בכשלים בעלויות נמוכות יותר באמצעות מכונות Spot באשכולות ובמאגרי הצמתים של Google Kubernetes Engine‏ (GKE).

סקירה כללית

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

מידע נוסף על מכונות וירטואליות זמניות ב-GKE זמין במאמר מכונות וירטואליות זמניות.

מכונות Spot VM מחליפות את הצורך בשימוש ב-preemptible VMs כדי להריץ עומסי עבודה חסרי מצב, באצווה או עמידים בפני תקלות. בניגוד למכונות וירטואליות שניתן לקטוע את הפעולה שלהן, שתוקף השימוש בהן פג אחרי 24 שעות, למכונות וירטואליות מסוג Spot אין תוקף שימוש. מכונות וירטואליות מסוג Spot מופסקות כש-Compute Engine צריך את המשאבים כדי להריץ מכונות וירטואליות רגילות.

מכונות וירטואליות מסוג Spot נתמכות גם באשכולות GKE Autopilot באמצעות Spot Pods. בעזרת Spot Pods, ‏ Autopilot מתזמן ומנהל באופן אוטומטי עומסי עבודה במכונות וירטואליות מסוג Spot.

מגבלות

  • מכונות וירטואליות זמניות לא תומכות במאגרי צמתים של Windows Server.

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

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

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

הקצאת מכונות וירטואליות במודל Spot ב-GKE

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

משתמשים ב-CLI של gcloud כדי להגדיר את הפרמטרים של כיבוי הדרגתי של מכונות וירטואליות מסוג Spot. מידע נוסף על האפשרות להגדיר את הפרמטרים של כיבוי חלק, תכונה שזמינה בגרסת Preview, זמין במאמר סיום וכיבוי חלק של מכונות וירטואליות מסוג Spot.

יצירת אשכול עם מכונות וירטואליות מסוג Spot

אפשר ליצור אשכול חדש באמצעות מכונות וירטואליות מסוג Spot באמצעות Google Cloud CLI או Google Cloud המסוף.

gcloud

ליצור אשכול חדש שמשתמש במכונות וירטואליות (VM) זמניות במאגר הצמתים שמוגדר כברירת מחדל במקום במכונות וירטואליות רגילות:

gcloud container clusters create CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

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

אופציונלי: אם רוצים להגדיר את הפרמטרים של כיבוי תקין (תצוגה מקדימה) עבור מאגר הצמתים שמוגדר כברירת מחדל, מחליפים את SYSTEM_CONFIG_PATH בנתיב לקובץ שמכיל את ההגדרה של kubelet. מידע נוסף זמין במאמר בנושא סיום תקין של מכונות וירטואליות מסוג Spot ב-GKE. אפשר גם לעדכן את הפרמטרים האלה אחרי שיוצרים את מאגר הצמתים, אבל כדי שהשינויים יחולו, GKE צריך ליצור מחדש את הצמתים.

המסוף

כדי ליצור אשכול חדש עם מאגר צמתים באמצעות מכונות וירטואליות מסוג Spot, מבצעים את השלבים הבאים:

  1. נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .

    מעבר אל יצירת אשכול Kubernetes

  2. בתפריט הניווט, בקטע Node pools (מאגרי צמתים), לוחצים על השם של מאגר הצמתים שרוצים להגדיר ואז על Nodes (צמתים).

  3. מסמנים את תיבת הסימון Enable Spot VMs (הפעלת מכונות וירטואליות מסוג Spot).

  4. מגדירים את האשכול לפי הצורך, ואז לוחצים על יצירה.

יצירת מאגר צמתים עם מכונות וירטואליות מסוג Spot

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

gcloud

יוצרים מאגר צמתים חדש באמצעות מכונות וירטואליות מסוג Spot:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

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

  • POOL_NAME: השם של מאגר הצמתים החדש.
  • CLUSTER_NAME: השם של האשכול.

אופציונלי: אם רוצים להגדיר את הפרמטרים של כיבוי תקין (תצוגה מקדימה), מחליפים את SYSTEM_CONFIG_PATH בנתיב לקובץ שמכיל את ההגדרה של kubelet. מידע נוסף זמין במאמר סיום תקין של מכונות וירטואליות מסוג Spot ב-GKE. אפשר גם לעדכן את הפרמטרים האלה אחרי שיוצרים את מאגר הצמתים, אבל כדי שהשינויים יחולו, GKE צריך ליצור מחדש את הצמתים.

המסוף

כדי ליצור מאגר צמתים חדש באמצעות מכונות וירטואליות מסוג Spot, מבצעים את השלבים הבאים:

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .

    מעבר אל Google Kubernetes Engine

  2. ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.

  3. לוחצים על הכרטיסייה Nodes.

  4. לוחצים על Create user-managed node pool (יצירת מאגר צמתים בניהול המשתמש).

  5. בתפריט הניווט, לוחצים על צמתים.

  6. מסמנים את תיבת הסימון Enable Spot VMs (הפעלת מכונות וירטואליות מסוג Spot).

  7. מגדירים את מאגר הצמתים לפי הצורך, ואז לוחצים על יצירה.

תזמון עומסי עבודה במכונות וירטואליות במודל Spot

‫GKE מוסיף את cloud.google.com/gke-spot=true ואת cloud.google.com/gke-provisioning=spot (לצמתים שמריצים GKE בגרסה ‎1.25.5-gke.2500 ואילך) תוויות לצמתים שמשתמשים במכונות וירטואליות מסוג Spot. אפשר לסנן לפי התווית הזו במפרט ה-Pod באמצעות השדה nodeSelector במפרט ה-Pod או באמצעות node affinity.

בדוגמה הבאה, יוצרים אשכול עם שני מאגרי צמתים, שאחד מהם משתמש במכונות וירטואליות מסוג Spot. לאחר מכן, פורסים אפליקציית nginx חסרת מצב (stateless) במכונות וירטואליות מסוג Spot, באמצעות nodeSelector כדי לקבוע איפה GKE יציב את ה-Pods.

  1. יוצרים אשכול חדש עם מאגר צמתים שמוגדר כברירת מחדל באמצעות מכונות וירטואליות רגילות:

    gcloud container clusters create CLUSTER_NAME
    

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

  2. קבלת פרטי הכניסה לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. יצירת מאגר צמתים באמצעות מכונות וירטואליות זמניות מסוג Spot:

    gcloud container node-pools create POOL_NAME \
       --cluster=CLUSTER_NAME \
        --num-nodes=1 \
        --spot
    

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

    • POOL_NAME: השם של מאגר הצמתים החדש.
    • CLUSTER_NAME: השם של האשכול.
  4. שומרים את קובץ המניפסט הבא כקובץ בשם pi-app.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        metadata:
          labels:
            app: pi
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          terminationGracePeriodSeconds: 25
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    

    במניפסט הזה, השדה nodeSelector מציין ל-GKE לתזמן Pods רק בצמתים שמשתמשים במכונות וירטואליות מסוג Spot.

  5. מחילים את המניפסט על האשכול:

    kubectl apply -f pi-app.yaml
    
  6. מתארים את ה-Pod:

    kubectl describe pod pi
    

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

    Name:         pi-kjbr9
    Namespace:    default
    Priority:     0
    Node:         gke-cluster-2-spot-pool-fb434072-44ct
    ...
    Labels:       app=pi
                  job-name=pi
    Status:       Succeeded
    ...
    Controlled By:  Job/pi
    Containers:
    ...
    Conditions:
      Type              Status
      Initialized       True 
      Ready             False 
      ContainersReady   False 
      PodScheduled      True 
    Volumes:
    ...
    Node-Selectors:              cloud.google.com/gke-spot=true
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  4m3s   default-scheduler  Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct
      Normal  Pulling    4m2s   kubelet            Pulling image "perl:5.34.0"
      Normal  Pulled     3m43s  kubelet            Successfully pulled image "perl:5.34.0" in 18.481761978s
      Normal  Created    3m43s  kubelet            Created container pi
      Normal  Started    3m43s  kubelet            Started container pi
    

    בשדה Node אפשר לראות ש-GKE מתזמן את ה-Pods רק בצמתים שמשתמשים במכונות וירטואליות מסוג Spot.

שימוש ב-taints וב-tolerations למכונות וירטואליות מסוג Spot

מומלץ ליצור אשכולות עם מאגר צמתים אחד לפחות ללא מכונות Spot, שבהם אפשר למקם עומסי עבודה של המערכת כמו DNS. אתם יכולים להשתמש בnode taints ובtolerations התואמים כדי להורות ל-GKE להימנע מהצבת עומסי עבודה מסוימים במכונות Spot.

  1. כדי ליצור מאגר צמתים עם צמתים שמשתמשים במכונות וירטואליות זמניות מסוג Spot וכוללים כתמי צמתים, משתמשים בדגל --node-taints כשיוצרים את מאגר הצמתים:

    gcloud container node-pools create POOL_NAME \
        --cluster=CLUSTER_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule \
        --spot
    
  2. כדי להוסיף את הסבילות המתאימה ל-Pods שרוצים לתזמן למכונות וירטואליות מסוג Spot, משנים את הפריסות ומוסיפים את הקוד הבא למפרט ה-Pod:

    tolerations:
    - key: cloud.google.com/gke-spot
      operator: Equal
      value: "true"
      effect: NoSchedule
    

    ‫GKE מתזמן רק את ה-Pods עם הסבילות הזו למכונות וירטואליות מסוג Spot עם ה-Taint של הצומת שנוסף.

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