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

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

סקירה כללית

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

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

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

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

מגבלות

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

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

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

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

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

gcloud

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

gcloud container clusters create CLUSTER_NAME \
    --spot

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

המסוף

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

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

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

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

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

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

יצירת מאגר צמתים עם מכונות וירטואליות זמניות במודל Spot

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

gcloud

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

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

מחליפים את POOL_NAME בשם של מאגר הצמתים החדש.

המסוף

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

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

    מעבר אל Google Kubernetes Engine

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

  3. לוחצים על הוספת מאגר צמתים.

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

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

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

תזמון עומסי עבודה במכונות וירטואליות במודל 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 \
        --num-nodes=1 \
        --spot
    

    מחליפים את POOL_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 \
        --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 עם ההכתמה הנוספת של הצומת.

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