בדף הזה נסביר איך להגדיר ב-Google Kubernetes Engine (GKE) את האופן שבו יתוזמנו הפודים: ביחד, בנפרד או במיקומים ספציפיים.
הפרדה של עומסי עבודה מאפשרת להשתמש בכתמים (taints) וסובלנות (tolerations) כדי להנחות את GKE להפריד בין פודים (Pods) בצמתים שונים, למקם פודים בצמתים שעומדים בקריטריונים ספציפיים או לתזמן עומסי עבודה ספציפיים יחד. מה שצריך לעשות כדי להגדיר הפרדה בין עומסי עבודה תלוי בהגדרות של אשכול GKE. בטבלה הבאה מפורטים ההבדלים:
| הגדרת הפרדה של עומסי עבודה | |
|---|---|
|
מוסיפים טולרנטיות לצמד מפתח:ערך ספציפי למפרט של ה-Pod, ובוחרים את צמד המפתח:ערך הזה באמצעות nodeSelector. GKE יוצר צמתים, מחיל את ההכתמה המתאימה של הצומת ומתזמן את ה-Pod בצומת. הוראות מפורטות מופיעות בקטע הפרדה בין עומסי עבודה באשכולות Autopilot שבדף הזה. |
| רגיל ללא הקצאת צמתים אוטומטית |
הוראות מפורטות זמינות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים. |
במדריך הזה נעשה שימוש בתרחיש לדוגמה שבו יש לכם שני עומסי עבודה, משימת אצווה ושרת אינטרנט, שאתם רוצים להפריד ביניהם.
מתי כדאי להשתמש בהפרדה של עומסי עבודה ב-GKE
הפרדה של עומסי עבודה שימושית כשמדובר בעומסי עבודה שמבצעים תפקידים שונים ולא צריכים לפעול באותן מכונות בסיסיות. דוגמאות לתרחישים:
- יש לכם עומס עבודה של מתאם אצווה שיוצר משימות שאתם רוצים להפריד ביניהן.
- אתם מפעילים שרת גיימינג עם עומס עבודה של שידוך שחקנים שאתם רוצים להפריד מ-Pods של סשנים.
- אתם רוצים להפריד בין חלקים שונים במערך שלכם, למשל להפריד בין שרת לבין מסד נתונים.
- אתם רוצים להפריד בין חלק מעומסי העבודה מסיבות שקשורות לתאימות או למדיניות.
תמחור
באשכולות Autopilot, החיוב מתבצע על המשאבים שה-Pods מבקשים בזמן שהם פועלים. פרטים נוספים זמינים במאמר תמחור של Autopilot. לפודים שמשתמשים בהפרדה של עומסי עבודה יש דרישות מינימום גבוהות יותר למשאבים מאשר לפודים רגילים.
ב-Standard clusters, החיוב מבוסס על הגדרת החומרה וגודל כל צומת, בלי קשר לשאלה אם הפעלתם Pods בצמתים. פרטים נוספים זמינים במאמר בנושא תמחור רגיל.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
מוודאים שיש לכם אשכול GKE. כדי ללמוד איך ליצור אשכול, אפשר להשתמש באחד מהמקורות הבאים:
הפרדה בין עומסי עבודה באשכולות Autopilot
כדי להפריד בין עומסי עבודה, מוסיפים סבילות ובורר צמתים לכל מפרט של עומס עבודה שמגדיר את הצומת שבו עומס העבודה צריך לפעול. השיטה הזו פועלת גם באשכולות רגילים שבהם מופעלת הקצאת משאבים אוטומטית של צמתים.
שומרים את קובץ המניפסט הבא בשם
web-server.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: web-server spec: replicas: 6 selector: matchLabels: pod: nginx-pod template: metadata: labels: pod: nginx-pod spec: tolerations: - key: group operator: Equal value: "servers" effect: NoSchedule nodeSelector: group: "servers" containers: - name: web-server image: nginxהמניפסט הזה כולל את השדות הבאים:
-
spec.tolerations: מערכת GKE יכולה למקם את ה-Pods בצמתים עםgroup=servers:NoScheduletaint. GKE לא יכול להקצות Pods שלא כוללים את הטולרנטיות הזו בצמתים האלה. -
spec.nodeSelector: מערכת GKE צריכה למקם את ה-Pods בצמתים עם התוויתgroup: servers.
GKE מוסיף את התוויות וההגבלות המתאימות לצמתים ש-GKE מקצה באופן אוטומטי להפעלת ה-Pods האלה.
-
שומרים את קובץ המניפסט הבא בשם
batch-job.yaml:apiVersion: batch/v1 kind: Job metadata: name: batch-job spec: completions: 5 backoffLimit: 3 ttlSecondsAfterFinished: 120 template: metadata: labels: pod: pi-pod spec: restartPolicy: Never tolerations: - key: group operator: Equal value: "jobs" effect: NoSchedule nodeSelector: group: "jobs" containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]המניפסט הזה כולל את השדות הבאים:
-
spec.tolerations: מערכת GKE יכולה למקם את ה-Pods בצמתים עםgroup=jobs:NoScheduletaint. GKE לא יכול להקצות Pods שלא כוללים את הטולרנטיות הזו בצמתים האלה. -
spec.nodeSelector: מערכת GKE צריכה למקם את ה-Pods בצמתים עם התוויתgroup: jobs.
GKE מוסיף את התוויות וההגבלות המתאימות לצמתים ש-GKE מקצה באופן אוטומטי להפעלת ה-Pods האלה.
-
פורסים את עומסי העבודה:
kubectl apply -f batch-job.yaml web-server.yaml
כשפורסים את עומסי העבודה, GKE מבצע את הפעולות הבאות לכל עומס עבודה:
- GKE מחפש צמתים קיימים עם כתם צומת ותווית צומת תואמים שצוינו במניפסט. אם הצמתים קיימים ויש בהם משאבים זמינים, GKE מתזמן את עומס העבודה בצומת.
- אם GKE לא מוצא צומת קיים שעומד בדרישות לתזמון עומס העבודה, הוא יוצר צומת חדש ומחיל את ההכתמה והתווית המתאימות של הצומת על סמך המניפסט. GKE ממקם את ה-Pod בצומת החדש.
הנוכחות של האפקט NoSchedule בדחיית הצומת מבטיחה שעומסי עבודה ללא טולרנטיות לא ימוקמו בצומת.
אימות ההפרדה של עומסי העבודה
מציגים את רשימת ה-Pods כדי למצוא את שמות הצמתים:
kubectl get pods --output=wide
הפלט אמור להיראות כך:
NAME READY ... NODE
batch-job-28j9h 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-78rcn 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-gg4x2 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-qgsxh 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
batch-job-v4ksf 0/1 ... gk3-sandbox-autopilot-nap-1hzelof0-ed737889-2m59
web-server-6bb8cd79b5-dw4ds 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
web-server-6bb8cd79b5-g5ld6 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-jcdx5 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-9f447e18-275z
web-server-6bb8cd79b5-pxdzw 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-s66rw 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-ccd22fd9-qtfq
web-server-6bb8cd79b5-zq8hh 1/1 ... gk3-sandbox-autopilot-nap-1eurxgsq-f2f3c272-n6xm
הפלט הזה מראה שה-Pods batch-job וה-Pods web-server תמיד פועלים בצמתים שונים.
מגבלות של הפרדת עומסי עבודה באמצעות taints ו-tolerations
אי אפשר להשתמש בקידומות המפתחות הבאות להפרדת עומסי עבודה:
- מפתחות ספציפיים ל-GKE ול-Kubernetes
- *cloud.google.com/
- *kubelet.kubernetes.io/
- *node.kubernetes.io/
כדאי להשתמש במפתחות ייחודיים משלכם כדי להפריד בין עומסי העבודה.
הפרדה של עומסי עבודה באשכולות Standard ללא הקצאה אוטומטית של צמתים
כדי להפריד בין עומסי עבודה באשכולות Standard בלי הקצאת צמתים אוטומטית (NAP), צריך ליצור ידנית מאגרי צמתים עם דחיות הצמתים ותוויות הצמתים המתאימים כדי להתאים לעומסי העבודה. הוראות מפורטות זמינות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים. השתמשו בגישה הזו רק אם יש לכם דרישות ספציפיות שמחייבות ניהול ידני של מאגרי הצמתים.
יצירת אשכול עם כתמי צומת
כשיוצרים אשכול ב-GKE, אפשר להקצות לאשכול כתמי צבע של צמתים. הפעולה הזו מקצה את הכתמים לכל הצמתים שנוצרו באמצעות האשכול.
אם יוצרים מאגר צמתים, המאגר לא מקבל בירושה את הכתמים מהאשכול. אם רוצים להוסיף כתמי צבע למאגר הצמתים, צריך להשתמש בדגל --node-taints כשיוצרים את מאגר הצמתים.
אם יוצרים אשכול Standard עם כתמי צמתים (node taints) עם ההשפעה NoSchedule או ההשפעה NoExecute, מערכת GKE לא יכולה לתזמן רכיבים מנוהלים מסוימים של GKE, כמו kube-dns או metrics-server, במאגר הצמתים שמוגדר כברירת מחדל ש-GKE יוצרת כשיוצרים את האשכול. מערכת GKE לא יכולה לתזמן את הרכיבים האלה כי אין להם את ההגדרות המתאימות ל-taints של הצומת.
צריך להוסיף מאגר צמתים חדש שעומד באחד מהתנאים הבאים:
- אין כתמים
- השפעה של
PreferNoSchedule - ההכתמה
components.gke.io/gke-managed-components=true:NoSchedule
אם אחד מהתנאים האלה מתקיים, מערכת GKE יכולה לתזמן רכיבים מנוהלים של GKE במאגר הצמתים החדש.
הוראות מפורטות מופיעות במאמר בנושא בידוד עומסי עבודה בצמתים ייעודיים.
gcloud
יוצרים אשכול עם כתמי צומת:
gcloud container clusters create CLUSTER_NAME \
--node-taints KEY=VALUE:EFFECT
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
EFFECT: אחת מההשפעות הבאות:PreferNoSchedule,NoScheduleאוNoExecute. -
KEY=VALUE: צמד מפתח/ערך שמשויך ל-EFFECT.
המסוף
יוצרים אשכול עם כתמי צומת:
נכנסים לדף Create a Kubernetes cluster במסוף Cloud de Confiance .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, בקטע Node Pools (מאגרי צמתים), מרחיבים את מאגר הצמתים שרוצים לשנות ולוחצים על Metadata (מטא-נתונים).
בקטע Node taints (הכתמות של הצומת), לוחצים על add Add Taint (הוספת הכתמה).
ברשימה הנפתחת אפקט, בוחרים את האפקט הרצוי.
מזינים את צמד המפתח/ערך הרצוי בשדות מפתח וערך.
לוחצים על יצירה.
API
כשמשתמשים ב-API כדי ליצור אשכול, צריך לכלול את השדה nodeTaints בקטע nodeConfig:
POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters
{
'cluster': {
'name': 'example-cluster',
'nodeConfig': {
'nodeTaints': [
{
'key': 'special',
'Value': 'gpu',
'effect': 'PreferNoSchedule'
}
]
...
}
...
}
}
הסרת כל ה-taint ממאגר צמתים
כדי להסיר את כל ההכתמות ממאגר צמתים, מריצים את הפקודה הבאה:
gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
POOL_NAME: השם של מאגר הצמתים שרוצים לשנות. -
CLUSTER_NAME: שם האשכול של מאגר הצמתים.