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

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

סקירה כללית

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

מידע נוסף על VM במודל Spot ב-GKE זמין במאמר VM במודל Spot.

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

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

מגבלות

  • VM במודל Spot לא תומכות במאגרי צמתים של Windows Server.

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

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

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

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

אתם יכולים להקצות VM במודל Spot על ידי יצירת אשכול שמשתמש ב-VM במודל Spot עבור מאגר הצמתים שמוגדר כברירת מחדל. אפשר גם ליצור מאגר צמתים שמשתמש ב-VM במודל Spot.

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

יצירת אשכול עם VM במודל Spot

אתם יכולים ליצור אשכול חדש באמצעות VM במודל Spot, בעזרת Google Cloud CLI או המסוף Google Cloud .

המסוף

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

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

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

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

  3. בקטע Provisioning model (מודל הקצאת משאבים), בוחרים באפשרות Spot VMs (VM במודל Spot).

  4. אופציונלי: כדי להגדיר את תקופת החסד לסיום תקין של Pods שפועלים בצמתים במאגר הצמתים הזה, בוחרים ערך בתפריט הנפתח Shutdown grace period (תקופת חסד לסיום תקין) ואם רלוונטי, מזינים ערך בשדה Critical pods shutdown grace period (seconds) (תקופת חסד לסיום תקין של Pods קריטיים (שניות)). אם מגדירים ערכים, הם נשמרים בתצורת מערכת הצמתים, ואפשר לעדכן אותם בהמשך לפי הצורך. מידע נוסף זמין במאמר סיום והשבתה מסודרת של מכונות וירטואליות מסוג Spot.

  5. מגדירים את האשכול לפי הצורך ולוחצים על Create.

gcloud

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

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

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

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

יצירת מאגר צמתים עם VM במודל Spot

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

המסוף

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

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

    מעבר אל Google Kubernetes Engine

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

  3. לוחצים על הכרטיסייה Nodes (צמתים).

  4. לוחצים על יצירת מאגר צמתים בניהול המשתמש.

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

  6. בקטע Provisioning model (מודל הקצאת משאבים), בוחרים באפשרות Spot VMs (VM במודל Spot).

  7. אופציונלי: כדי להגדיר את תקופת החסד לסיום תקין של Pods שפועלים בצמתים במאגר הצמתים הזה, בוחרים ערך בתפריט הנפתח Shutdown grace period (תקופת חסד לסיום תקין) ואם רלוונטי, מזינים ערך בשדה Critical pods shutdown grace period (seconds) (תקופת חסד לסיום תקין של Pods קריטיים (שניות)). אם מגדירים ערכים, הם נשמרים בתצורת מערכת הצמתים, ואפשר לעדכן אותם בהמשך לפי הצורך. מידע נוסף זמין במאמר סיום והשבתה מסודרת של מכונות וירטואליות מסוג Spot.

  8. מגדירים את מאגר הצמתים לפי הצורך ולוחצים על Create node pool.

gcloud

יוצרים מאגר צמתים חדש באמצעות VM במודל 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. מידע נוסף זמין במאמר סיום תקין של VM במודל Spot ב-GKE. אפשר גם לעדכן את הפרמטרים האלה אחרי שיוצרים את מאגר הצמתים, אבל כדי לבצע את השינויים, GKE צריך ליצור מחדש את הצמתים.

תזמון עומסי עבודה ב-VM במודל Spot

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

בדוגמה הבאה, יוצרים אשכול עם שני מאגרי צמתים, שאחד מהם משתמש ב-VM במודל 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. יצירת מאגר צמתים באמצעות VM במודל 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 רק בצמתים שמשתמשים ב-VM במודל 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 רק בצמתים שמשתמשים ב-VM במודל Spot.

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

מומלץ ליצור אשכולות עם מאגר צמתים אחד לפחות בלי VM במודל Spot, שבו תוכלו למקם עומסי עבודה של המערכת כמו DNS. אתם יכולים להשתמש בכתמי צומת ובטולרנטיות המתאימה כדי להורות ל-GKE להימנע מהצבת עומסי עבודה מסוימים ב-VM במודל 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 שרוצים להקצות ל-VM במודל Spot, משנים את ה-Deployments (פריסות) ומוסיפים את הקוד הבא למפרט ה-Pod:

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

    ‫GKE מתזמן רק Pods עם ה-toleration הזה למכונות ה-VM במודל Spot עם ה-node taint שנוסף.

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