בדף הזה מוסבר איך להריץ עומסי עבודה עמידים בכשלים, עומסי עבודה בלי שמירת מצב או עומסי עבודה באצווה בעלויות נמוכות יותר באמצעות 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.
מגבלות
- התכונה של כיבוי צומת חלק ב-kubelet מופעלת רק באשכולות שמריצים את GKE בגרסה 1.20 ואילך. בגרסאות GKE שקודמות לגרסה 1.20, אפשר להשתמש בKubernetes on GCP Node Termination Event Handler כדי להפסיק את ה-Pods בצורה מסודרת כשמכונות וירטואליות מסוג Spot נדחקות.
- מכונות וירטואליות מסוג Spot לא תומכות במאגרי צמתים של Windows Server.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-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, מבצעים את השלבים הבאים:
נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
בתפריט הניווט, בקטע Node pools (מאגרי צמתים), לוחצים על השם של מאגר הצמתים שרוצים להגדיר ואז על Nodes (צמתים).
מסמנים את תיבת הסימון Enable Spot VMs (הפעלת מכונות וירטואליות מסוג Spot).
מגדירים את האשכול לפי הצורך, ואז לוחצים על יצירה.
יצירת מאגר צמתים עם מכונות וירטואליות זמניות במודל 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, מבצעים את השלבים הבאים:
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.
לוחצים על הוספת מאגר צמתים.
בתפריט הניווט, לוחצים על צמתים.
מסמנים את תיבת הסימון 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 \ --num-nodes=1 \ --spotמחליפים את
POOL_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 \ --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 עם ההכתמה הנוספת של הצומת.
המאמרים הבאים
- איך מריצים אפליקציית GKE במכונות וירטואליות מסוג Spot עם צמתים לפי דרישה כגיבוי
- מידע נוסף על מכונות וירטואליות מסוג Spot ב-GKE
- מדריך לפריסת עומס עבודה באצווה באמצעות מכונות וירטואליות מסוג Spot ב-GKE