הגדרת הפרדה של עומסי עבודה ב-GKE

בדף הזה מוסבר איך להגדיר ב-Google Kubernetes Engine ‏ (GKE) את האופן שבו יתוזמנו הפודים: ביחד, בנפרד או במיקומים ספציפיים.

הפרדה של עומסי עבודה מאפשרת להשתמש בכתמים (taints) וסובלנויות (tolerations) כדי להנחות את GKE להפריד בין Pods בצמתים שונים, למקם Pods בצמתים שעומדים בקריטריונים ספציפיים או לתזמן עומסי עבודה ספציפיים יחד. מה שצריך לעשות כדי להגדיר הפרדה בין עומסי עבודה תלוי בהגדרות של אשכול GKE. בטבלה הבאה מפורטים ההבדלים:

הגדרת הפרדה של עומסי עבודה

מוסיפים טולרנטיות לצמד מפתח:ערך ספציפי למפרט של ה-Pod, ובוחרים את צמד המפתח:ערך הזה באמצעות nodeSelector. ‫GKE יוצר צמתים, מחיל את ההכתמה המתאימה של הצומת ומתזמן את ה-Pod בצומת.

הוראות מפורטות מופיעות בקטע הפרדה בין עומסי עבודה באשכולות של Autopilot בדף הזה.

רגיל ללא הקצאת צמתים אוטומטית
  1. יצירת מאגר צמתים עם taint של צומת ותווית צומת
  2. הוספת סבילות ל-taint הזה למפרט של ה-Pod

הוראות מפורטות זמינות במאמר בנושא בידוד עומסי עבודה במאגרי צמתים ייעודיים.

במדריך הזה נעשה שימוש בתרחיש לדוגמה שבו יש לכם שני עומסי עבודה, משימת אצווה ושרת אינטרנט, שאתם רוצים להפריד ביניהם.

מתי כדאי להשתמש בהפרדה של עומסי עבודה ב-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 לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

הפרדה בין עומסי עבודה באשכולות Autopilot

כדי להפריד בין עומסי עבודה, מוסיפים סבילות ובורר צמתים לכל מפרט של עומס עבודה שמגדיר את הצומת שבו עומס העבודה צריך לפעול. השיטה הזו פועלת גם באשכולות רגילים שבהם מופעלת הקצאת משאבים אוטומטית של צמתים.

  1. שומרים את קובץ המניפסט הבא בשם 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 בצמתים עם ה-taint‏ group=servers:NoSchedule. ‫GKE לא יכול לתזמן Pods שלא כוללים את ההגדרה הזו בצמתים האלה.
    • spec.nodeSelector: מערכת GKE צריכה למקם את ה-Pods בצמתים עם התווית group: servers.

    ‫GKE מוסיף את התוויות וההכתמות המתאימות לצמתים ש-GKE מקצה באופן אוטומטי כדי להריץ את ה-Pods האלה.

  2. שומרים את קובץ המניפסט הבא בשם 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 בצמתים עם ה-taint‏ group=jobs:NoSchedule. ‫GKE לא יכול לתזמן Pods שלא כוללים את ההגדרה הזו בצמתים האלה.
    • spec.nodeSelector: מערכת GKE צריכה למקם את ה-Pods בצמתים עם התווית group: jobs.

    ‫GKE מוסיף את התוויות וההכתמות המתאימות לצמתים ש-GKE מקצה באופן אוטומטי כדי להריץ את ה-Pods האלה.

  3. פריסת עומסי העבודה:

    kubectl apply -f batch-job.yaml web-server.yaml
    

כשפורסים את עומסי העבודה, GKE מבצע את הפעולות הבאות לכל עומס עבודה:

  1. ‫GKE מחפש צמתים קיימים עם כתם הצומת ותווית הצומת התואמים שצוינו במניפסט. אם הצמתים קיימים ויש בהם משאבים זמינים, GKE מתזמן את עומס העבודה בצומת.
  2. אם 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.

המסוף

יצירת אשכול עם כתמי צבע של צמתים:

  1. נכנסים לדף Create a Kubernetes cluster במסוף Cloud de Confiance .

    מעבר אל יצירת אשכול Kubernetes

  2. מגדירים את האשכול לפי הצורך.

  3. בחלונית הניווט, בקטע Node Pools, מרחיבים את מאגר הצמתים שרוצים לשנות ולוחצים על Metadata.

  4. בקטע Node taints (הכתמות של צמתים), לוחצים על Add Taint (הוספת הכתמה).

  5. ברשימה הנפתחת אפקט, בוחרים את האפקט הרצוי.

  6. מזינים את צמד המפתח/ערך הרצוי בשדות מפתח וערך.

  7. לוחצים על יצירה.

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: שם האשכול של מאגר הצמתים.

המאמרים הבאים