בדף הזה מוסבר איך להריץ עומסי עבודה (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 לפני הקצאת משאבים, כדי להקטין את הסיכויים להיתקל בשגיאות שקשורות לזמינות משאבים.
הקצאת מכונות וירטואליות במודל 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, מבצעים את השלבים הבאים:
נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
בתפריט הניווט, בקטע Node pools (מאגרי צמתים), לוחצים על השם של מאגר הצמתים שרוצים להגדיר ואז על Nodes (צמתים).
מסמנים את תיבת הסימון Enable Spot VMs (הפעלת מכונות וירטואליות מסוג Spot).
מגדירים את האשכול לפי הצורך, ואז לוחצים על יצירה.
יצירת מאגר צמתים עם מכונות וירטואליות מסוג 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, מבצעים את השלבים הבאים:
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.
לוחצים על הכרטיסייה Nodes.
לוחצים על Create user-managed node pool (יצירת מאגר צמתים בניהול המשתמש).
בתפריט הניווט, לוחצים על צמתים.
מסמנים את תיבת הסימון Enable Spot VMs (הפעלת מכונות וירטואליות מסוג Spot).
מגדירים את מאגר הצמתים לפי הצורך, ואז לוחצים על יצירה.
תזמון עומסי עבודה במכונות וירטואליות במודל 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.
יוצרים אשכול חדש עם מאגר צמתים שמוגדר כברירת מחדל באמצעות מכונות וירטואליות רגילות:
gcloud container clusters create CLUSTER_NAMEמחליפים את
CLUSTER_NAMEבשם של האשכול החדש.קבלת פרטי הכניסה לאשכול:
gcloud container clusters get-credentials CLUSTER_NAMEיצירת מאגר צמתים באמצעות מכונות וירטואליות זמניות מסוג Spot:
gcloud container node-pools create POOL_NAME \ --cluster=CLUSTER_NAME \ --num-nodes=1 \ --spotמחליפים את מה שכתוב בשדות הבאים:
-
POOL_NAME: השם של מאגר הצמתים החדש. -
CLUSTER_NAME: השם של האשכול.
-
שומרים את קובץ המניפסט הבא כקובץ בשם
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.מחילים את המניפסט על האשכול:
kubectl apply -f pi-app.yamlמתארים את ה-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.
כדי ליצור מאגר צמתים עם צמתים שמשתמשים במכונות וירטואליות זמניות מסוג Spot וכוללים כתמי צמתים, משתמשים בדגל
--node-taintsכשיוצרים את מאגר הצמתים:gcloud container node-pools create POOL_NAME \ --cluster=CLUSTER_NAME \ --node-taints=cloud.google.com/gke-spot="true":NoSchedule \ --spotכדי להוסיף את הסבילות המתאימה ל-Pods שרוצים לתזמן למכונות וירטואליות מסוג Spot, משנים את הפריסות ומוסיפים את הקוד הבא למפרט ה-Pod:
tolerations: - key: cloud.google.com/gke-spot operator: Equal value: "true" effect: NoScheduleGKE מתזמן רק את ה-Pods עם הסבילות הזו למכונות וירטואליות מסוג Spot עם ה-Taint של הצומת שנוסף.
המאמרים הבאים
- איך מריצים אפליקציית GKE במכונות וירטואליות מסוג Spot עם צמתים לפי דרישה כגיבוי
- מידע נוסף על מכונות וירטואליות מסוג Spot ב-GKE
- מדריך לפריסת עומס עבודה באצווה באמצעות מכונות וירטואליות מסוג Spot ב-GKE