הגדרת מיקום קומפקטי לצמתים של GKE

אתם יכולים לקבוע את המיקום הפיזי של הצמתים של Google Kubernetes Engine‏ (GKE) ביחס זה לזה באזור באמצעות מדיניות מיקום קומפקטית.

סקירה כללית

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

שימוש במיקום קומפקטי עם GKE Autopilot

ב-Autopilot clusters, אפשר לבקש מיקום קומפקטי לעומסי עבודה ספציפיים על ידי הוספת node selectors למפרט ה-Pod. אתם יכולים להשתמש במדיניות ברירת המחדל של Autopilot למיקום קומפקטי, או במדיניות קיימת של Compute Engine למיקום קומפקטי שמשתמשת בסדרת המכונות N2 או בסדרת המכונות N2D.

מגבלות

  • ‫GKE מקצה עומסי עבודה במיקום קומפקטי באותו אזור.
  • זמין בסוגי המחשוב Balanced, ‏ Performance ו-Accelerator.
  • זמין רק בסוגי מכונות C2,‏ C2D,‏ C3,‏ C3D,‏ C4A,‏ C4D,‏ H3,‏ H4D,‏ N2 ו-N2D.
  • זמין רק עם מעבדי GPU מסוג A100,‏ L4 ו-H100.
  • מיקום קומפקטי זמין לקבוצות של Pods שמקובצות בעד 1,500 צמתים.

הפעלת מדיניות למיקום קומפקטי

כדי להפעיל מיקום קומפקטי ב-GKE Autopilot, מוסיפים nodeSelector למפרט ה-Pod עם המפתחות הבאים:

  • cloud.google.com/gke-placement-group: המזהה שאתם מקצים לקבוצת ה-Pods שצריכה לפעול יחד, באותה קבוצת מיקום קומפקטית. כל קבוצת מיקומי מודעות מוגבלת ל-1,500 צמתים. מומלץ להגביל את קבוצת המיקומים רק לעומסי העבודה שמרוויחים מהקיבוץ, ולפזר את עומסי העבודה לקבוצות מיקומים נפרדות ככל האפשר.

  • אחד מהמפתחות הבאים להגדרת סוג המשאב:

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
  • cloud.google.com/placement-policy-name: באופן אופציונלי, השם של מדיניות קיימת למיקום קומפקטי ב-Compute Engine. אפשר לציין מדיניות למיקום קומפקטי מותאמת אישית רק ב-GKE מגרסה 1.31.1-gke.2010000 ואילך.

    הוראות מפורטות זמינות בקטע יצירת מדיניות מיקום קומפקטית בדף הזה.

הדוגמה הבאה של מפרט Pod מאפשרת מיקום קומפקטי עם מדיניות מיקום קומפקטי בהתאמה אישית:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME

מחליפים את PLACEMENT_POLICY_NAME בשם של מדיניות מיקום קומפקטית קיימת ב-Compute Engine. כדי להשתמש במדיניות ברירת המחדל למיקום קומפקטי בטייס אוטומטי, משמיטים את השורה cloud.google.com/placement-policy-name.

שימוש במדיניות מותאמת אישית למיקום קומפקטי ללא קבוצות מיקומים

כדי להשתמש במדיניות למיקום קומפקטי מותאמת אישית בלי קבוצות מיקום, צריך להוסיף את בורר הצמתים cloud.google.com/placement-policy-name למפרט של ה-Pod, או להגדיר סוג מחשוב מותאם אישית עם עדיפות למיקום.

הוספת בורר הצמתים cloud.google.com/placement-policy-name למפרט ה-Pod

הגישה הזו יכולה להיות שימושית אם רוצים להשתמש ב-JobSet כדי לתזמן כל משימה בנפרד, אבל גם רוצים להשתמש במדיניות מיקום קומפקטית בהתאמה אישית כדי למקם את הצמתים שמריצים את אותה משימה קרוב יותר זה לזה.

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

בדוגמה הבאה של מפרט Pod מופעל מיקום קומפקטי עם מדיניות למיקום קומפקטי מותאמת אישית עבור עומס עבודה של JobSet:

apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
  name: my-jobset
  annotations:
    alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
 replicatedJobs:
    - name: my-job
      template:
        spec:
          # lines omitted for clarity
          template:
            spec:
              nodeSelector:
                cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
                cloud.google.com/machine-family: "n2"
              # lines omitted for clarity

מחליפים את PLACEMENT_POLICY_NAME בשם של מדיניות מיקום קומפקטית קיימת ב-Compute Engine.

שימוש בסוג מחשוב מותאם אישית להגדרת מדיניות מיקום

לפרטים נוספים, אפשר לעיין במסמכים בנושא custom compute class with placement priority.

במקום להוסיף nodeSelector עם שם המדיניות ישירות למפרט של עומס העבודה, אפשר להחיל מדיניות מיקום קומפקטית על ידי הגדרת השדה placement בהגדרה של ComputeClass. פרטים נוספים זמינים במאמר בנושא סוגי מכונות וירטואליות בהתאמה אישית עם עדיפות למיקום.

שימוש במיקום קומפקטי ב-GKE Standard

מגבלות

יש מגבלות על מיקום קומפקטי במאגרי צמתים רגילים ב-GKE:

  • התמיכה קיימת רק במאגרי צמתים חדשים. אי אפשר להפעיל או להשבית מיקום קומפקטי במאגרי צמתים קיימים.
  • האפשרות זמינה רק למאגרי צמתים שפועלים בתחום אחד.
  • זמין רק בסוגי המכונות A2,‏ A3,‏ A4,‏ C2,‏ C2D,‏ C3,‏ C3D,‏ C4,‏ C4D,‏ G2,‏ G4,‏ H3,‏ H4D,‏ N2 ו-N2D. עם זאת, במקרה של A3 Ultra ו-A4, אנחנו ממליצים להשתמש בהזמנות עם טירגוט לחסימות במקום במיקום קומפקטי. פרטים נוספים מופיעים במאמר בנושא הזמנת קיבולת.
  • כל מדיניות תומכת בעד 1,500 מכונות וירטואליות ב-Compute Engine. אם מאגר הצמתים יחרוג מהמגבלה הזו בכל שלב, המערכת תדחה את היצירה שלו.
  • אי אפשר לספק מדיניות מותאמת אישית של משאבים באמצעות הדגל placement-policy בשדרוגים מסוג blue-green.

יצירת מדיניות למיקום קומפקטי

כדי ליצור מדיניות מיקום קומפקטית, ב-Google Cloud CLI מציינים את האפשרות placement-type=COMPACT במהלך יצירת מאגר צמתים או אשכול. בהגדרה הזו, מערכת GKE מנסה למקם צמתים במאגר צמתים בקרבה פיזית זה לזה.

כדי להשתמש במדיניות משאבים קיימת באשכול, מציינים את המיקום של המדיניות המותאמת אישית באמצעות הדגל placement-policy במהלך יצירת מאגר הצמתים או האשכול. כך אפשר להשתמש במיקומי מודעות מוזמנים, בכמה מאגרי צמתים עם אותה מדיניות מיקום ובאפשרויות מתקדמות אחרות למיקום מודעות. עם זאת, היא גם דורשת יותר פעולות ידניות מאשר ציון הדגל ‎--placement-type=COMPACT. לדוגמה, אתם צריכים ליצור, למחוק ולתחזק את מדיניות המשאבים המותאמת אישית. מוודאים שהמספר המקסימלי של מכונות VM נשמר בכל מאגרי הצמתים באמצעות מדיניות המשאבים. אם מגיעים למגבלה הזו כשחלק ממאגרי הצמתים לא הגיעו לגודל המקסימלי שלהם, הוספה של צמתים נוספים תיכשל.

אם לא מציינים את הדגלים placement-type ו-placement-policy, כברירת מחדל אין דרישות לגבי מיקום הצומת.

יצירת מדיניות מיקום קומפקטית באשכול חדש

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

כדי ליצור אשכול חדש שבו חלה מדיניות מיקום קומפקטית על מאגר הצמתים שמוגדר כברירת מחדל, משתמשים בפקודה הבאה:

gcloud container clusters create CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

מחליפים את מה שכתוב בשדות הבאים:

  • CLUSTER_NAME: השם של האשכול החדש.
  • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים, שחייב להיות סוג מכונה נתמך שמופיע במגבלות של אשכול רגיל.
  • --placement-type COMPACT: החלת מיקום קומפקטי על הצמתים במאגר הצמתים שמוגדר כברירת מחדל.
  • MAX_UNAVAILABLE: המספר המקסימלי של צמתים שיכולים להיות לא זמינים בו-זמנית במהלך שדרוג של מאגר צמתים. למיקום קומפקטי מומלץ להשתמש בשדרוגים מהירים ללא עליות פתאומיות כדי למקסם את הסיכוי למצוא צמתים במיקום משותף במהלך השדרוגים.

יצירת מדיניות למיקום קומפקטי באשכול קיים

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

כדי ליצור מאגר צמתים עם מדיניות מיקום קומפקטית, משתמשים בפקודה הבאה:

gcloud container node-pools create NODEPOOL_NAME \
    --machine-type MACHINE_TYPE \
    --cluster CLUSTER_NAME \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

מחליפים את מה שכתוב בשדות הבאים:

  • NODEPOOL_NAME: השם של מאגר הצמתים החדש.
  • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים, שחייב להיות סוג מכונה נתמך שמופיע במגבלות של אשכול רגיל.
  • CLUSTER_NAME: השם של האשכול הקיים.
  • --placement-type COMPACT: מציין שיש להחיל מיקום קומפקטי על הצמתים במאגר הצמתים החדש.
  • MAX_UNAVAILABLE: המספר המקסימלי של צמתים שיכולים להיות לא זמינים בו-זמנית במהלך שדרוג של מאגר צמתים. למיקום קומפקטי מומלץ להשתמש בשדרוגים מהירים ללא עליות פתאומיות כדי למקסם את הסיכוי למצוא צמתים במיקום משותף במהלך השדרוגים.

יצירת מאגרי צמתים באמצעות מדיניות מיקום מותאמת אישית משותפת

אפשר ליצור מדיניות משאבים באופן ידני ולהשתמש בה בכמה מאגרי צמתים.

  1. יוצרים את מדיניות המשאבים באזור Google Cloud של האשכול:

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION \
        --collocation collocated
    

    מחליפים את מה שכתוב בשדות הבאים:

    • POLICY_NAME: השם של מדיניות המשאבים.
    • REGION: האזור של האשכול.
  2. יוצרים מאגר צמתים באמצעות מדיניות המשאבים המותאמת אישית:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODEPOOL_NAME: השם של מאגר הצמתים החדש.
    • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים. צריך לציין סוג מכונה נתמך שמופיע במגבלות של אשכול רגיל.
    • CLUSTER_NAME: השם של האשכול הקיים.
    • MAX_UNAVAILABLE: המספר המקסימלי של צמתים שיכולים להיות לא זמינים בו-זמנית במהלך שדרוג של מאגר צמתים. למיקום קומפקטי מומלץ להשתמש בשדרוגים מהירים ללא עליות פתאומיות כדי למקסם את הסיכוי למצוא צמתים במיקום משותף במהלך השדרוגים.

שימוש במקום שמור ב-Compute Engine עם מדיניות למיקום קומפקטי

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

  1. כדי ליצור בקשה לשמירת מקום שמציינת מדיניות למיקום קומפקטי:

    gcloud compute reservations create RESERVATION_NAME \
        --vm-count MACHINE_COUNT \
        --machine-type MACHINE_TYPE \
        --resource-policies policy=POLICY_NAME \
        --zone ZONE \
        --require-specific-reservation
    

    מחליפים את מה שכתוב בשדות הבאים:

    • RESERVATION_NAME: השם של ההזמנה.
    • MACHINE_COUNT: מספר הצמתים שהוזמנו.
    • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים. צריך לציין סוג מכונה נתמך שמופיע במגבלות של אשכול רגיל.
    • POLICY_NAME: השם של מדיניות המשאבים.
    • ZONE: האזור שבו רוצים ליצור את ההזמנה.
  2. יוצרים מאגר צמתים על ידי ציון מדיניות המיקום הקומפקטי וההזמנה שיצרתם בשלב הקודם:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --reservation-affinity specific \
        --reservation RESERVATION_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

מחליפים את מה שכתוב בשדות הבאים:

  • NODEPOOL_NAME: השם של מאגר הצמתים החדש.
  • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים, שחייב להיות סוג מכונה נתמך שמופיע במגבלות של אשכול רגיל.
  • CLUSTER_NAME: השם של האשכול הקיים.

יצירת עומס עבודה בצמתים שמשתמשים במיקום קומפקטי

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

בדוגמה הבאה, אנחנו מוסיפים דחייה (taint) לצמתים הייעודיים ומוסיפים טולרנטיות והעדפה תואמות ל-Pods.

  1. מוסיפים taint לצמתים במאגר הצמתים שיש לו מדיניות למיקום קומפקטי:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. בהגדרת עומס העבודה, מציינים את הסבילות הנדרשת ואת ההעדפה של הצומת. דוגמה עם פוד יחיד:

    apiVersion: v1
    kind: Pod
    metadata:
      ...
    spec:
      ...
      tolerations:
      - key: dedicated-pool
        operator: "Equal"
        value: "NODEPOOL_NAME"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated-pool
                operator: In
                values:
                - NODEPOOL_NAME
    

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

שימוש במיקום קומפקטי להקצאת צמתים אוטומטית (NAP)

באמצעות הקצאת צמתים אוטומטית (NAP),‏ GKE מקצה אוטומטית מאגרי צמתים על סמך הביקוש למשאבי אשכול. מידע נוסף מופיע במאמר בנושא שימוש בהקצאת משאבים אוטומטית של צמתים.

כדי להפעיל הקצאה קומפקטית של מיקום להקצאת צמתים אוטומטית (NAP), מוסיפים nodeSelector למפרט של ה-Pod, כמו בדוגמה הבאה:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
# lines omitted for clarity

מחליפים את מה שכתוב בשדות הבאים:

  • PLACEMENT_GROUP_IDENTIFIER: המזהה שאתם מקצים לקבוצת ה-Pods שצריכים לפעול יחד, באותה קבוצת מיקום קומפקטית.
  • MACHINE_FAMILY: השם של משפחת המכונות. משתמשים באחת מקבוצות המכונות שתומכות במיקום קומפקטי. מומלץ להשתמש במשפחות המכונות C2 או C2D לעומסי עבודה עם דרישות ביצועים של מחשוב ורשת.
  • PLACEMENT_POLICY_NAME: באופן אופציונלי, השם של מדיניות קיימת למיקום קומפקטי ב-Compute Engine. מערכת GKE משתמשת במדיניות למיקום קומפקטי שצוינה כשמופעלת הקצאת צמתים אוטומטית (NAP) ונוצר מאגר צמתים חדש כדי לקבץ את ה-Pods. אפשר לציין מדיניות למיקום קומפקטי מותאמת אישית רק ב-GKE מגרסה 1.31.1-gke.2010000 ואילך.

    הוראות מפורטות זמינות בקטע יצירת מדיניות מיקום קומפקטית בדף הזה.

אפשר להשמיט את המפתח cloud.google.com/machine-family אם הגדרת ה-Pod כבר מגדירה סוג מכונה שנתמך במיקום קומפקטי. לדוגמה, אם מפרט ה-Pod כולל nvidia.com/gpu והאשכול מוגדר לשימוש ב-GPU מסוג A100, אין צורך לכלול את המפתח nvidia.com/gpu.cloud.google.com/machine-family

בדוגמה הבאה מוצג מפרט של Pod שמגדיר בקשת nvidia.com/gpu והאשכול מוגדר לשימוש ב-GPU מסוג A100. ה-Pod spec הזה לא כולל את המפתח cloud.google.com/machine-family:

  apiVersion: v1
  kind: Pod
  metadata:
    ...
  spec:
    ...
    nodeSelector:
      cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
      cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
    resources:
      limits:
        nvidia.com/gpu: 2

איך מגדירים Pods לשימוש ב-GPU

אופטימיזציה של גודל קבוצת מיקומי המודעות

מכיוון ש-GKE מוצא את המיקום הטוב ביותר לפריסות קטנות יותר, מומלץ להנחות את GKE להימנע מהרצת סוגים שונים של Pod באותה קבוצת מיקום. מוסיפים מפתח סובלנות עם המפתח cloud.google.com/gke-placement-group ומזהה המיקום הקומפקטי שהגדרתם.

הדוגמה הבאה היא מפרט של Pod שמגדיר טולרנטיות של Pod עם מיקום קומפקטי:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  tolerations:
  - key: cloud.google.com/gke-placement-group
    operator: "Equal"
    value: PLACEMENT_GROUP_IDENTIFIER
    effect: "NoSchedule"

מידע נוסף על הקצאת צמתים אוטומטית (NAP) עם טולרנטיות של Pod זמין במאמר בנושא הפרדה של עומסי עבודה.

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