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

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

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

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

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

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

רגיל ללא הקצאת צמתים אוטומטית
  1. יצירת מאגר צמתים עם כתם צומת ותווית צומת
  2. הוספת טולרנטיות לדחייה (taint) הזו למפרט ה-Pod

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

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

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

הפרדה בין עומסי עבודה באשכולות 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 בצמתים עם group=servers:NoSchedule taint. ‫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 בצמתים עם group=jobs:NoSchedule taint. ‫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) של הצומת מבטיחה שעומסי עבודה ללא טולרנטיות לא ימוקמו בצומת.

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

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

המסוף

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

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

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

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