בדף הזה מוסבר איך להכין עומס עבודה לתזמון בצמתי Arm באשכול GKE Standard. מידע נוסף על תזמון עומסי עבודה של Arm באמצעות Autopilot זמין במאמר פריסת עומסי עבודה של Autopilot בארכיטקטורת Arm.
כדי לתזמן בהצלחה עומס עבודה לצומת Arm, אתם צריכים:
- קובץ אימג' של קונטיינר שתואם ל-Arm. הנחיות לבדיקה מופיעות במאמר האם עומס העבודה שלי מוכן ל-Arm?
- צמתי Arm שבהם אפשר לתזמן עומסי עבודה שתואמים ל-Arm. במאמר יצירת אשכולות ומאגרי צמתים עם צמתי Arm מוסבר איך ליצור את המשאבים הנדרשים.
- אשכול ב Google Cloud אזור או באזור משנה שבו מכונות וירטואליות (VM) של Arm זמינות. בטבלה הזו אפשר לסנן לפי סוגי מכונות ופלטפורמות.
סקירה כללית
כברירת מחדל, GKE מתזמן עומסי עבודה רק לצמתים מבוססי x86 – סדרות מכונות של Compute Engine עם מעבדי Intel או AMD – על ידי הצבת taint (kubernetes.io/arch=arm64:NoSchedule) בכל צמתי Arm. ההגדרה הזו מונעת מעומסי עבודה שתואמים ל-x86 להיות מתוזמנים בטעות לצמתים שלכם ב-Arm.
אפשר להסיר את ה<span class="glossary-term" data-original-term="taint" lang="he">דחייה (taint)</span> הזו שמוגדרת כברירת מחדל אם רוצים שתהיה אפשרות ל<span class="glossary-term" data-original-term="schedule" lang="he">הקצות</span> <span class="glossary-term" data-original-term="workload" lang="he">עומסי עבודה</span> שתואמים ל-x86 ב<span class="glossary-term" data-original-term="node" lang="he">צמתי</span> Arm בלי שיהיה צורך ב<span class="glossary-term" data-original-term="toleration" lang="he">טולרנטיות</span> המתאימה. מידע נוסף מופיע במאמר בנושא הגדרת ברירת המחדל של ההגדרה taint לארכיטקטורת Arm.
אם רוצים לפרוס עומס עבודה בצומת Arm עם ההגדרה המזהמת שמוגדרת כברירת מחדל, צריך להשתמש בשדות שמתוארים במסמך הזה כדי להנחות את מתזמן המשימות לשלוח את עומס העבודה לסוג הצומת המבוקש.
משתמשים באחד מהשדות הבאים:
- בורר צמתים.
- כלל זיקה של צומת.
כשמשתמשים בבורר צמתים או בכלל קרבה לצומת, GKE יקצה רק את עומסי העבודה שתואמים ל-Arm אם הצהרתם שקובץ אימג' של קונטיינר של עומס העבודה יכול לפעול בארכיטקטורה של הצומת.
אם מתזמנים עומס עבודה שתואם ל-Arm עם בורר צמתים או עם כלל זיקה לצמתים כמו שמתואר בקטעים הבאים, GKE מוסיף באופן אוטומטי toleration להגדרת עומס העבודה כדי שה-Pods יוכלו לפעול בצמתי Arm.
הטולרנטיות הזו שנוספה לעומס העבודה תואמת לדחייה (kubernetes.io/arch=arm64:NoSchedule) שנוספה לכל צמתי ה-Arm כברירת מחדל, כדי לאפשר תזמון של עומס העבודה בצמתי Arm.
במקרים מסוימים, למשל כשמשתמשים בתמונות מרובות ארכיטקטורות שיכולות לפעול בכל צומת, יכול להיות שתרצו להוסיף את הטולרנטיות הזו באופן ידני להגדרת עומס העבודה. הוראות מפורטות במאמר בנושא שימוש בטולרנטיות לתזמון עומסי עבודה מרובי-ארכיטקטורות לכל ארכיטקטורה.
שימוש בבורר צמתים כדי לתזמן עומס עבודה של Arm
מוסיפים את בורר הצמתים הבא למפרט:
nodeSelector:
kubernetes.io/arch: arm64
בורר הצמתים מציין שצריך לתזמן את עומס העבודה הזה רק לצמתים עם התווית arm64, שקיימת בכל צמתי Arm באשכולות GKE.
כשבורר הצמתים הזה נכלל בהגדרת עומס העבודה, GKE מוסיף את הטולרנטיות כדי להתאים את הדחייה ולאפשר את התזמון של עומס העבודה בצמתים של Arm.
שימוש בכלל node affinity לתזמון של עומס עבודה ב-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 משתמשים בהכתמה שמוגדרת כברירת מחדל.
שימוש ב-toleration לתזמון עומסי עבודה מרובי-ארכיטקטורות לכל הארכיטקטורות
אם יש לכם תמונה מרובת-ארכיטקטורות שאתם רוצים לתזמן לכל סוג ארכיטקטורה זמין באשכול Standard, אתם צריכים רק להוסיף את הטולרנטיות למפרט של עומס העבודה. אתם לא צריכים את בורר הצמתים או את כללי הקרבה לצמתים שמתוארים בדף הזה, כי אפשר לתזמן את עומס העבודה לכל סוגי הארכיטקטורה.
מוסיפים את הסבילות:
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
התוויות לכל סוג ארכיטקטורה הן:
-
arm64לצמתים שמשתמשים במעבדי Arm (לדוגמה, C4A). -
amd64בשביל צמתים עם מעבדי AMD (לדוגמה, Tau T2D) או צמתים עם מעבדי Intel (לדוגמה, C2).
לדוגמה, אם יש לכם אשכול עם מאגרי הצמתים הבאים וכלל הקרבה לצומת שצוין:
- 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 מוסיף לכל צומתי ה-Arm את ה-taint kubernetes.io/arch=arm64:NoSchedule. ההגדרה הזו מונעת תזמון של עומסי עבודה שתואמים רק לארכיטקטורת x86, ולא לארכיטקטורת Arm, לצמתים של Arm. אם יש לכם עומסי עבודה שתואמים גם ל-x86 וגם ל-Arm, אתם יכולים להשבית את ה-taint הזה כדי לאפשר ל-GKE לתזמן את עומסי העבודה האלה בצמתי Arm בלי שתצטרכו להגדיר toleration שמתאים ל-taint.
אפשר לעדכן את התנהגות ברירת המחדל רק במאגרי צמתים מסוג Standard באשכולות GKE שבהם מישור הבקרה מריץ את גרסה 1.35.0-gke.2141000 ואילך, או בצמתים שנוצרו עבור ComputeClasses מותאמים אישית. מידע נוסף מופיע במאמר בנושא הגדרת ברירת המחדל של ההגדרה taint לארכיטקטורת Arm. העדכון של התנהגות ה-taint לא חל על פריסת עומסי עבודה של Arm באמצעות Autopilot. מידע נוסף זמין במאמר פריסת עומסי עבודה של Autopilot בארכיטקטורת Arm.
אפשר להגדיר את ההתנהגות הזו במצבים הבאים באמצעות מאגרי צמתים רגילים:
- במהלך יצירת האשכול, עבור מאגר הצמתים שמוגדר כברירת מחדל (Standard)
- כשיוצרים או מעדכנים מאגר צמתים רגיל
אם יש לכם עומסי עבודה שפועלים באשכול ולא תואמים ל-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.