בדף הזה מוסבר איך להגדיר ב-Google Kubernetes Engine (GKE) את האופן שבו יתוזמנו ה-Pods: ביחד, בנפרד או במיקומים ספציפיים.
הפרדה של עומסי עבודה מאפשרת לכם להשתמש בכתמים (taints) וסובלנות (tolerations) כדי להנחות את GKE להפריד בין Pods בצמתים שונים, למקם Pods בצמתים שעומדים בקריטריונים ספציפיים או לתזמן עומסי עבודה ספציפיים יחד. הפעולות שצריך לבצע כדי להגדיר הפרדה בין עומסי עבודה תלויות בהגדרות של אשכול GKE. בטבלה הבאה מפורטים ההבדלים:
| הגדרת הפרדה של עומסי עבודה | |
|---|---|
|
מוסיפים טולרנטיות לצמד מפתח:ערך ספציפי למפרט של ה-Pod, ובוחרים את צמד המפתח:ערך הזה באמצעות nodeSelector. GKE יוצר צמתים, מחיל את ההכתמה המתאימה של הצומת ומתזמן את ה-Pod בצומת. הוראות מפורטות מופיעות בקטע הפרדה בין עומסי עבודה באשכולות Autopilot בדף הזה. |
| רגיל ללא הקצאת צמתים אוטומטית |
הוראות מפורטות מופיעות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים. |
במדריך הזה נעשה שימוש בתרחיש לדוגמה שבו יש לכם שני עומסי עבודה, משימת אצווה ושרת אינטרנט, שאתם רוצים להפריד ביניהם.
מתי כדאי להשתמש בהפרדה של עומסי עבודה ב-GKE
הפרדה של עומסי עבודה שימושית כשעומסי העבודה מבצעים תפקידים שונים ולא צריכים לפעול באותן מכונות בסיסיות. דוגמאות לתרחישים:
- יש לכם עומס עבודה של מתאם אצווה שיוצר משימות שאתם רוצים להפריד ביניהן.
- אתם מריצים שרת גיימינג עם עומס עבודה של שידוך שחקנים שאתם רוצים להפריד מ-Pods של סשנים.
- אתם רוצים להפריד בין חלקים שונים במערך שלכם, למשל להפריד בין שרת לבין מסד נתונים.
- אתם רוצים להפריד בין חלק מעומסי העבודה מסיבות שקשורות לתאימות או למדיניות.
תמחור
באשכולות במצב Autopilot, החיוב הוא על המשאבים שה-Pods מבקשים בזמן שהם פועלים. פרטים נוספים זמינים במאמר תמחור של Autopilot. לפודים שמשתמשים בהפרדה של עומסי עבודה יש בקשות מינימליות גבוהות יותר למשאבים מאשר לפודים רגילים.
ב-Standard clusters, החיוב מבוסס על הגדרת החומרה ועל הגודל של כל צומת, בלי קשר לשאלה אם הפודים פועלים בצמתים. פרטים נוספים זמינים במאמר בנושא תמחור רגיל.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק 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 בצמתים עם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 בדחייה (taint) של הצומת מבטיחה שעומסי עבודה ללא טולרנטיות לא ימוקמו בצומת.
אימות ההפרדה של עומסי העבודה
מציגים את רשימת ה-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/
כדאי להשתמש במפתחות ייחודיים משלכם להפרדה בין עומסי עבודה.
הפרדה של עומסי עבודה באשכולות רגילים ללא הקצאת צמתים אוטומטית (NAP)
כדי להפריד בין עומסי עבודה באשכולות רגילים בלי הקצאת צמתים אוטומטית (NAP), צריך ליצור ידנית מאגרי צמתים עם דחיות הצמתים ותוויות הצמתים המתאימים לעומסי העבודה. הוראות מפורטות מופיעות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים. משתמשים בגישה הזו רק אם יש לכם דרישות ספציפיות שמחייבות ניהול ידני של מאגרי הצמתים.
יצירת אשכול עם כתמי צבע של צמתים
כשיוצרים אשכול ב-GKE, אפשר להקצות לאשכול taints של צמתים. הפעולה הזו מקצה את ה-taints לכל הצמתים שנוצרו באמצעות האשכול.
אם יוצרים מאגר צמתים, מאגר הצמתים לא מקבל את ההכתמות מהאשכול. אם רוצים להוסיף כתמי צבע למאגר הצמתים, צריך להשתמש בדגל --node-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 במסוף Google Cloud .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, בקטע 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: השם של האשכול של מאגר הצמתים.
המאמרים הבאים
- אכיפת כללי מדיניות אבטחה מוגדרים מראש באמצעות בקר הכניסה PodSecurity
- הפעלת עומס עבודה מלא בקנה מידה גדול