בדף הזה מוסבר איך להריץ עומסי עבודה (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 לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- כדאי לבדוק את הזמינות של VM במודל Spot לפני הקצאת משאבים, כדי להקטין את הסיכויים להיתקל בשגיאות שקשורות לזמינות משאבים.
הקצאת מכונות וירטואליות במודל 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:
נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
בתפריט הניווט, בקטע Node pools (מאגרי צמתים), לוחצים על השם של מאגר הצמתים שרוצים להגדיר.
בקטע Provisioning model (מודל הקצאת משאבים), בוחרים באפשרות Spot VMs (VM במודל Spot).
אופציונלי: כדי להגדיר את תקופת החסד לסיום תקין של Pods שפועלים בצמתים במאגר הצמתים הזה, בוחרים ערך בתפריט הנפתח Shutdown grace period (תקופת חסד לסיום תקין) ואם רלוונטי, מזינים ערך בשדה Critical pods shutdown grace period (seconds) (תקופת חסד לסיום תקין של Pods קריטיים (שניות)). אם מגדירים ערכים, הם נשמרים בתצורת מערכת הצמתים, ואפשר לעדכן אותם בהמשך לפי הצורך. מידע נוסף זמין במאמר סיום והשבתה מסודרת של מכונות וירטואליות מסוג Spot.
מגדירים את האשכול לפי הצורך ולוחצים על 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, מבצעים את השלבים הבאים:
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.
לוחצים על הכרטיסייה Nodes (צמתים).
לוחצים על יצירת מאגר צמתים בניהול המשתמש.
בתפריט הניווט, לוחצים על צמתים.
בקטע Provisioning model (מודל הקצאת משאבים), בוחרים באפשרות Spot VMs (VM במודל Spot).
אופציונלי: כדי להגדיר את תקופת החסד לסיום תקין של Pods שפועלים בצמתים במאגר הצמתים הזה, בוחרים ערך בתפריט הנפתח Shutdown grace period (תקופת חסד לסיום תקין) ואם רלוונטי, מזינים ערך בשדה Critical pods shutdown grace period (seconds) (תקופת חסד לסיום תקין של Pods קריטיים (שניות)). אם מגדירים ערכים, הם נשמרים בתצורת מערכת הצמתים, ואפשר לעדכן אותם בהמשך לפי הצורך. מידע נוסף זמין במאמר סיום והשבתה מסודרת של מכונות וירטואליות מסוג Spot.
מגדירים את מאגר הצמתים לפי הצורך ולוחצים על 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.
יוצרים אשכול חדש עם מאגר צמתים ברירת המחדל באמצעות מכונות וירטואליות רגילות:
gcloud container clusters create CLUSTER_NAMEמחליפים את
CLUSTER_NAMEבשם של האשכול החדש.קבלת פרטי הכניסה לאשכול:
gcloud container clusters get-credentials CLUSTER_NAMEיצירת מאגר צמתים באמצעות VM במודל 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 רק בצמתים שמשתמשים ב-VM במודל 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 רק בצמתים שמשתמשים ב-VM במודל Spot.
שימוש ב-taints וב-tolerations במכונות וירטואליות במחיר Spot
מומלץ ליצור אשכולות עם מאגר צמתים אחד לפחות בלי VM במודל Spot, שבו תוכלו למקם עומסי עבודה של המערכת כמו DNS. אתם יכולים להשתמש בכתמי צומת ובטולרנטיות המתאימה כדי להורות ל-GKE להימנע מהצבת עומסי עבודה מסוימים ב-VM במודל 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 שרוצים להקצות ל-VM במודל Spot, משנים את ה-Deployments (פריסות) ומוסיפים את הקוד הבא למפרט ה-Pod:
tolerations: - key: cloud.google.com/gke-spot operator: Equal value: "true" effect: NoScheduleGKE מתזמן רק Pods עם ה-toleration הזה למכונות ה-VM במודל Spot עם ה-node taint שנוסף.
המאמרים הבאים
- איך מריצים אפליקציית GKE ב-VM במודל Spot עם צמתים על פי דרישה כגיבוי
- מידע נוסף על VM במודל Spot ב-GKE
- מדריך לפריסת עומס עבודה באצווה באמצעות VM במודל Spot ב-GKE