בדף הזה מוסבר איך להגדיר ב-Google Kubernetes Engine (GKE) את האופן שבו יתוזמנו הפודים: ביחד, בנפרד או במיקומים ספציפיים.
הפרדה של עומסי עבודה מאפשרת להשתמש בכתמים (taints) וסובלנויות (tolerations) כדי להנחות את GKE להפריד בין Pods בצמתים שונים, למקם Pods בצמתים שעומדים בקריטריונים ספציפיים או לתזמן עומסי עבודה ספציפיים יחד. מה שצריך לעשות כדי להגדיר הפרדה בין עומסי עבודה תלוי בהגדרות של אשכול GKE. בטבלה הבאה מפורטים ההבדלים:
| הגדרת הפרדה של עומסי עבודה | |
|---|---|
|
מוסיפים טולרנטיות לצמד מפתח:ערך ספציפי למפרט של ה-Pod, ובוחרים את צמד המפתח:ערך הזה באמצעות nodeSelector. GKE יוצר צמתים, מחיל את ההכתמה המתאימה של הצומת ומתזמן את ה-Pod בצומת. הוראות מפורטות מופיעות בקטע הפרדה בין עומסי עבודה באשכולות של Autopilot בדף הזה. |
| רגיל ללא הקצאת צמתים אוטומטית |
הוראות מפורטות זמינות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים. |
במדריך הזה נעשה שימוש בתרחיש לדוגמה שבו יש לכם שני עומסי עבודה, משימת אצווה ושרת אינטרנט, שאתם רוצים להפריד ביניהם.
מתי כדאי להשתמש בהפרדה של עומסי עבודה ב-GKE
הפרדה של עומסי עבודה שימושית כשעומסי העבודה מבצעים תפקידים שונים ולא צריכים לפעול באותן מכונות בסיסיות. דוגמאות לתרחישים:
- יש לכם עומס עבודה של מתאם אצווה שיוצר משימות שאתם רוצים להפריד ביניהן.
- אתם מריצים שרת גיימינג עם עומס עבודה של חיפוש יריבים למשחק שרוצים להפריד אותו מ-Pods של סשנים.
- אתם רוצים להפריד בין חלקים שונים במערך שלכם, למשל להפריד בין שרת לבין מסד נתונים.
- אתם רוצים להפריד בין חלק מעומסי העבודה מסיבות שקשורות לתאימות או למדיניות.
תמחור
בקטרי Autopilot, אתם מחויבים על המשאבים שה-Pods שלכם מבקשים בזמן שהם פועלים. פרטים נוספים זמינים במאמר תמחור של Autopilot. לפודים שמשתמשים בהפרדה של עומסי עבודה יש בקשות מינימום גבוהות יותר למשאבים מאשר לפודים רגילים.
ב-Standard clusters, החיוב מתבצע על סמך הגדרת החומרה והגודל של כל צומת, בלי קשר לשאלה אם הפעלתם Pods בצמתים. פרטים נוספים זמינים במאמר בנושא תמחור רגיל.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת 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 בצמתים עם ה-taintgroup=servers:NoSchedule. 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 בצמתים עם ה-taintgroup=jobs:NoSchedule. 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 בדחייה (taint) של הצומת מבטיחה שעומסי עבודה (workload) ללא טולרנטיות לא ימוקמו בצומת.
אימות ההפרדה של עומסי העבודה
מציגים את רשימת ה-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
הפלט הזה מראה ש-batch-job Pods ו-web-server Pods תמיד פועלים בצמתים שונים.
המגבלות של הפרדת עומסי עבודה באמצעות taints ו-tolerations
אי אפשר להשתמש בקידומות המקשים הבאות להפרדת עומסי עבודה:
- מפתחות ספציפיים ל-GKE ול-Kubernetes
- *cloud.google.com/
- *kubelet.kubernetes.io/
- *node.kubernetes.io/
כדאי להשתמש במפתחות ייחודיים משלכם להפרדה של עומסי העבודה.
הפרדה של עומסי עבודה באשכולות Standard ללא הקצאה אוטומטית של צמתים
כדי להפריד בין עומסי עבודה באשכולות Standard בלי הקצאת צמתים אוטומטית (NAP), צריך ליצור ידנית מאגרי צמתים עם ההכתמות והתוויות המתאימות של הצמתים כדי להתאים לעומסי העבודה. הוראות מפורטות זמינות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים. משתמשים בגישה הזו רק אם יש לכם דרישות ספציפיות שמחייבות ניהול ידני של מאגרי הצמתים.
יצירת אשכול עם כתמי צבע של צמתים
כשיוצרים אשכול ב-GKE, אפשר להקצות לאשכול taints של צמתים. הפעולה הזו מקצה את ה-taints לכל הצמתים שנוצרו באמצעות האשכול.
אם יוצרים מאגר צמתים, מאגר הצמתים לא מקבל בירושה את ההכתמות מהאשכול. אם רוצים להוסיף כתמי צבע למאגר הצמתים, צריך להשתמש בדגל --node-taints כשיוצרים את מאגר הצמתים.
אם יוצרים אשכול רגיל עם כתמי צבע של צמתים שיש להם את האפקט NoSchedule או את האפקט NoExecute, מערכת GKE לא יכולה לתזמן רכיבים מנוהלים מסוימים של GKE, כמו kube-dns או metrics-server, במאגר הצמתים שמוגדר כברירת מחדל ש-GKE יוצרת כשיוצרים את האשכול. מערכת GKE לא יכולה לתזמן את הרכיבים האלה כי אין להם את ההתאמות המתאימות ל-taints של הצומת.
צריך להוסיף מאגר צמתים חדש שעומד באחד מהתנאים הבאים:
- אין כתמים
- השפעת ה-taint היא
PreferNoSchedule - ה-taint
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'
}
]
...
}
...
}
}
הסרת כל ה-taints ממאגר צמתים
כדי להסיר את כל ההכתמות ממאגר צמתים, מריצים את הפקודה הבאה:
gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
POOL_NAME: השם של מאגר הצמתים שרוצים לשנות. -
CLUSTER_NAME: שם האשכול של מאגר הצמתים.