הכנה לפריסת עומס עבודה (workload) של Arm באשכול רגיל

בדף הזה מוסבר איך להכין עומס עבודה לתזמון בצמתי Arm באשכול GKE Standard. מידע נוסף על תזמון עומסי עבודה של Arm באמצעות Autopilot זמין במאמר פריסת עומסי עבודה של Autopilot בארכיטקטורת Arm.

כדי לתזמן בהצלחה עומס עבודה לצומת Arm, אתם צריכים:

סקירה כללית

כברירת מחדל, GKE מתזמן עומסי עבודה רק לצמתים מבוססי x86 – סדרות מכונות של Compute Engine עם מעבדי Intel או AMD – על ידי הצבת taint (kubernetes.io/arch=arm64:NoSchedule) בכל צמתי Arm. ההגדרה הזו מונעת תזמון לא מכוון של עומסי עבודה שתואמים ל-x86 לצמתים שלכם מסוג Arm. אפשר להסיר את ההגדרה הזו של דחייה (taint) אם רוצים שתהיה אפשרות לתזמן עומסי עבודה (workload) שתואמים ל-x86 בצמתי Arm בלי שיהיה צורך בטולרנטיות תואמת. מידע נוסף מופיע במאמר בנושא הגדרת ברירת המחדל של ההגדרה taint לארכיטקטורת Arm.

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

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

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

אם מתזמנים עומס עבודה שתואם ל-Arm עם בורר צמתים או עם כלל זיקה לצמתים כמו שמתואר בקטעים הבאים, ‏ GKE מוסיף באופן אוטומטי toleration להגדרת עומס העבודה כדי שה-Pods יוכלו לפעול בצמתי Arm.

הסבילות הזו שנוספה לעומס העבודה תואמת ל-taint‏ (kubernetes.io/arch=arm64:NoSchedule) שנוסף לכל צמתי ה-Arm כברירת מחדל, כדי לאפשר תזמון של עומס העבודה בצמתי Arm.

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

שימוש בבורר צמתים כדי לתזמן עומס עבודה של Arm

מוסיפים את בורר הצמתים הבא למפרט:

nodeSelector:
    kubernetes.io/arch: arm64

בורר הצמתים מציין שצריך לתזמן את עומס העבודה הזה רק לצמתים עם התווית arm64, שקיימת בכל צמתי Arm באשכולות GKE.

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

שימוש בכלל של זיקה לצומת כדי לתזמן עומס עבודה של Arm

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

תזמון של עומס עבודה לארכיטקטורה אחת

מוסיפים את ההגדרה הבאה של צירוף צומת למפרט:

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64

כלל ההתאמה של הצומת קובע שעומס העבודה יתוזמן רק לצמתים עם התווית arm64, שקיימת בכל צומתי Arm באשכולות GKE.

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

תזמון עומס עבודה לארכיטקטורות x86 ו-Arm

אם רוצים לתזמן עומס עבודה גם בארכיטקטורות x86 (מעבדי Intel ו-AMD) וגם בארכיטקטורות Arm, ובמאגרי הצמתים של Arm נעשה שימוש בהתנהגות ברירת המחדל של הכתמת צמתים, אפשר לציין זאת בדרכים שונות. ההוראות הבאות מניחות שבמאגרי הצמתים של Arm נעשה שימוש בהכתמת ברירת המחדל.

שימוש בטולרנטיות לתזמון עומסי עבודה מרובי-ארכיטקטורות לכל ארכיטקטורה

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

מוסיפים את הסבילות:

  tolerations:
    - key: kubernetes.io/arch
      operator: Equal
      value: arm64
      effect: NoSchedule

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

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

  • my-c4a-node-pool, באמצעות מכונות וירטואליות מסוג c4a-standard-16‏ (arm64).
  • my-c2-node-pool, באמצעות מכונות וירטואליות מסוג c2-standard-8 ‏ (amd64).
  • my-t2d-node-pool, באמצעות מכונות וירטואליות מסוג t2-standard-48 ‏ (amd64).

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

שימוש בכלל של שיוך צומת לתזמון עומסי עבודה מרובי-ארכיטקטורות לכל ארכיטקטורה

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

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

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

בדוגמה הבאה מצוין שאפשר לתזמן את עומס העבודה הזה בצמתים עם מעבדי Arm או מעבדי x86:

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64
            - amd64

התוויות לכל סוג ארכיטקטורה הן:

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

  • my-c4a-node-pool, באמצעות מכונות וירטואליות מסוג c4a-standard-16‏ (arm64).
  • my-c2-node-pool, באמצעות מכונות וירטואליות מסוג c2-standard-8 ‏ (amd64).
  • my-t2d-node-pool, באמצעות מכונות וירטואליות מסוג t2-standard-48 ‏ (amd64).

אם פורסים באשכול הזה עומס עבודה שמשתמש בתמונה מרובת-ארכיטקטורות, והזיקה לצומת עם arm64 כלולה ברשימה values,‏ GKE מוסיף את הטולרנטיות בהגדרות של עומס העבודה, ויכול להקצות את עומס העבודה בכל מאגרי הצמתים.

הגדרת ברירת המחדל של taint בארכיטקטורת Arm

כברירת מחדל, GKE מטיל דחייה (taint) על כל צומתי ה-Arm עם הדחייה kubernetes.io/arch=arm64:NoSchedule. הדחייה הזו מונעת את ההקצאה של עומסי עבודה שתואמים רק לארכיטקטורת x86, אבל לא לארכיטקטורת Arm, בצומתי Arm. אם יש לכם עומסי עבודה שתואמים גם ל-x86 וגם ל-Arm, אתם יכולים להשבית את הדחייה הזו כדי לאפשר ל-GKE להקצות את עומסי העבודה האלה בצומתי Arm בלי שתצטרכו להגדיר טולרנטיות שמתאימה לדחייה.

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

אתם יכולים להגדיר את ההתנהגות הזו במצבים הבאים:

  • במהלך יצירת האשכול, עבור מאגר הצמתים הרגיל שמוגדר כברירת מחדל
  • כשיוצרים או מעדכנים מאגר צמתים רגיל

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

כדי להגדיר את ההכתמה של צומתי Arm כברירת מחדל, בוחרים באחת מהאפשרויות הבאות:

‫CLI של gcloud

כדי להגדיר את ההתנהגות של דחייה (taint) באמצעות ה-CLI של gcloud, משתמשים בדגל --node-architecture-taint-behavior כשמבצעים אחת מהפעולות הבאות:

  • כדי ליצור אשכול רגיל עם התנהגות ספציפית של כתמי צבע למאגר ברירת המחדל של הצמתים, משתמשים בפקודה gcloud container cluster create:

    gcloud container cluster create CLUSTER_NAME
        --location=CONTROL_PLANE_LOCATION \
        --node-architecture-taint-behavior=BEHAVIOR
    
  • יוצרים מאגר צמתים רגיל באמצעות הפקודה gcloud container node-pools create:

    gcloud container node-pools create POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --node-architecture-taint-behavior=BEHAVIOR
    
  • מעדכנים מאגר צמתים רגיל באמצעות הפקודה gcloud container node-pools update:

    gcloud container node-pools update POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --node-architecture-taint-behavior=BEHAVIOR
    

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

  • CLUSTER_NAME: השם של האשכול.
  • CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור לאשכולות אזוריים.
  • POOL_NAME: השם של מאגר הצמתים.
  • BEHAVIOR: אחת מההגדרות הבאות:

    • none: ב-GKE, ההכתמה (taint) שמוגדרת כברירת מחדל kubernetes.io/arch=arm64:NoSchedule מושמטת.
    • arm: מגדיר במפורש את התנהגות ברירת המחדל, שמוסיפה את ההגדרות kubernetes.io/arch=arm64:NoSchedule לכל הצמתים במאגר הצמתים של Arm.

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

Terraform

כדי להגדיר את ההתנהגות של taint בארכיטקטורה, מוסיפים את הבלוק taint_config הבא ב-node_config:

taint_config {
  architecture_taint_behavior = "BEHAVIOR"
}

מחליפים את BEHAVIOR באחת מההגדרות הבאות:

  • NONE: ב-GKE, ההכתמה (taint) שמוגדרת כברירת מחדל kubernetes.io/arch=arm64:NoSchedule מושמטת.
  • ARM: מגדיר במפורש את התנהגות ברירת המחדל, שמוסיפה את הכתמים kubernetes.io/arch=arm64:NoSchedule לכל הצמתים במאגר הצמתים של Arm.

דוגמה ל-node_config מלא של מאגר צמתים מסוג Standard שכולל את הבלוק הזה:

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "NODE_POOL_NAME"
  location   = "NODE_POOL_LOCATION"
  cluster    = google_container_cluster.primary.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = "ARM_MACHINE_TYPE"

    # Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
    service_account = google_service_account.default.email
    oauth_scopes    = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
    taint_config {
      architecture_taint_behavior = "BEHAVIOR"
    }
  }
}

בדוגמה הזו, NODE_POOL_NAME מייצג את השם של מאגר הצמתים, ו-NODE_POOL_LOCATION מייצג את המיקום של מישור הבקרה של האשכול.

פריסת עומס העבודה

אחרי שקובעים איפה לתזמן את עומסי העבודה שתואמים ל-Arm, אפשר לפרוס את עומס העבודה.

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

פתרון בעיות

מידע על פתרון בעיות ושגיאות נפוצות זמין במאמר פתרון בעיות בעומסי עבודה של Arm.

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