במאמר הזה מוסבר על התאמה אוטומטית של גודל האשכול (autoscaling) באשכול משתמשים ב-Google Distributed Cloud.
התאמה אוטומטית של גודל האשכול מגדילה או מקטינה את מספר הצמתים במאגר הצמתים בהתאם לדרישות של עומסי העבודה.
לפני שמתחילים
מידע נוסף על המגבלות של הכלי לשינוי גודל האשכול באופן אוטומטי
המידרוג האוטומטי של האשכול מבוסס על ההנחות הבאות:
אפשר להפעיל מחדש את כל ה-Pods המשוכפלים בצומת אחר, מה שעלול לגרום לשיבוש קצר. אם השירותים שלכם לא יכולים לסבול שיבושים, אנחנו לא ממליצים להשתמש בשינוי גודל אוטומטי של אשכולות.
משתמשים או אדמינים לא מנהלים צמתים באופן ידני. אם ההתאמה האוטומטית לעומס מופעלת במאגר צמתים, אי אפשר לקבוע ידנית את השדה
replicasשל מאגר הצמתים.לכל הצמתים במאגר צמתים יחיד יש את אותו סט של תוויות.
איך פועל מידרוג אוטומטי של אשכול
המידרוג האוטומטי של האשכול פועל על בסיס מאגר צמתים. כשמפעילים התאמה אוטומטית לעומס (autoscaling) במאגר צמתים, מציינים את המספר המינימלי והמקסימלי של הצמתים במאגר.
הכלי להתאמה אוטומטית לעומס באשכול מגדיל או מקטין את מספר הצמתים במאגר באופן אוטומטי, על סמך בקשות המשאבים (ולא על סמך ניצול המשאבים בפועל) של ה-Pods שפועלים בצמתים. הוא בודק מעת לעת את הסטטוס של Pods ושל צמתים, ופועל לפי הצורך:
אם אי אפשר לתזמן את הפודים כי אין מספיק צמתים במאגר, הכלי לשינוי גודל האשכול מוסיף צמתים עד למקסימום שצוין.
אם הצמתים לא מנוצלים מספיק, ואפשר לתזמן את כל ה-Pods עם פחות צמתים במאגר, הכלי Cluster Autoscaler מסיר צמתים, עד למינימום שצוין. אם אי אפשר לרוקן את הצומת בצורה מסודרת, הצומת מסתיים בכוח והדיסק המצורף שמנוהל על ידי Kubernetes מנותק בצורה בטוחה.
אם הפודים שלכם ביקשו מעט מדי משאבים (או שלא שינו את ברירות המחדל, שיכול להיות שלא מספיקות) ובצמתים שלכם יש מחסור במשאבים, הכלי לשינוי גודל האשכול לא יתקן את המצב הזה. כדי לוודא שהמידרוג האוטומטי של האשכול פועל בצורה מדויקת, אתם יכולים להגיש בקשות מפורשות למשאבים לכל עומסי העבודה.
עבור מאגר צמתים בודד, הערך של minReplicas צריך להיות ≥ 1. עם זאת, סכום הצמתים של אשכול המשתמשים שלא זוהמו בכל רגע נתון חייב להיות לפחות 3. כלומר, הסכום של הערכים של minReplicas בכל מאגרי הצמתים עם שינוי גודל אוטומטי, בתוספת הסכום של הערכים של replicas בכל מאגרי הצמתים ללא שינוי גודל אוטומטי, חייב להיות לפחות 3.
הכלי לשינוי גודל אוטומטי של אשכולות לוקח בחשבון את העלות היחסית של סוגי המופעים במאגרי הצמתים השונים, ומנסה להרחיב את מאגר הצמתים באופן שיגרום לבזבוז הכי קטן שאפשר.
יצירת אשכול משתמשים עם התאמה אוטומטית של גודל האשכול
כדי ליצור אשכול משתמשים עם התאמה אוטומטית לעומס שמופעל עבור מאגר צמתים, ממלאים את הקטע autoscaling של מאגר הצמתים בקובץ התצורה של אשכול המשתמשים. לדוגמה:
nodePools:
- name: pool‐1
…
replicas: 3
...
autoscaling:
minReplicas: 1
maxReplicas: 5
ההגדרה שלמעלה יוצרת מאגר צמתים עם 3 רפליקות, ומחילים על המאגר התאמה אוטומטית לעומס עם גודל מינימלי של 1 וגודל מקסימלי של 5.
הערך של minReplicas חייב להיות ≥ 1. אי אפשר לצמצם את מספר הצמתים בבריכת צמתים לאפס.
הוספת מאגר צמתים עם שינוי גודל אוטומטי
כדי להוסיף מאגר צמתים עם התאמה אוטומטית לעומס לאשכול קיים:
עורכים את קובץ ההגדרות של אשכול המשתמשים כדי להוסיף מאגר צמתים חדש, וכוללים קטע
autoscalingלמאגר. מגדירים את הערכים שלreplicas,minReplicasו-maxReplicasלפי הצורך. לדוגמה:nodePools: - name: my-new-node-pool … replicas: 3 ... autoscaling: minReplicas: 2 maxReplicas: 6מעדכנים את האשכול:
gkectl update cluster --config USER_CLUSTER_CONFIG \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
הפעלת שינוי גודל אוטומטי של מאגר צמתים קיים
כדי להפעיל התאמה לעומס (autoscaling) למאגר צמתים באשכול קיים:
עורכים את
nodePoolספציפי בקובץ ההגדרות של אשכול המשתמשים, וכוללים את הקטעautoscaling. מגדירים את הערכים שלminReplicasו-maxReplicasלפי הצורך.nodePools: - name: my-existing-node-pool … replicas: 3 ... autoscaling: minReplicas: 1 maxReplicas: 5מעדכנים את האשכול:
gkectl update cluster --config USER_CLUSTER_CONFIG \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
השבתת שינוי הגודל האוטומטי של מאגר צמתים קיים
כדי להשבית את שינוי הגודל האוטומטי של מאגר צמתים ספציפי:
עורכים את קובץ התצורה של אשכול המשתמשים ומסירים את הקטע
autoscalingשל מאגר הצמתים.מריצים את
gkectl update cluster.
בדיקת ההתנהגות של המידרוג האוטומטי באשכול
יש כמה דרכים לקבוע מה המידרוג האוטומטי של האשכול עושה.
בדיקת יומנים של המידרוג האוטומטי באשכול
קודם כל, צריך למצוא את השם של ה-Pod של המידרוג האוטומטי באשכול:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n USER_CLUSTER_NAME | grep cluster-autoscaler
בדיקת היומנים ב-Pod של המידרוג האוטומטי באשכול:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG logs cluster-autoscaler-POD_NAME --container cluster-autoscaler -n USER_CLUSTER_NAME
מחליפים את POD_NAME בשם של ה-Pod של Cluster Autoscaler.
בדיקת מפת ההגדרות
הכלי לשינוי גודל האשכול מפרסם את מפת ההגדרות kube-system/cluster-autoscaler-status.
כדי לראות את מפת ההגדרה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get configmap cluster-autoscaler-status -n kube-system -o yaml
בודקים את האירועים של המידרוג האוטומטי באשכול.
אפשר לבדוק אירועים של שינוי גודל אוטומטי של אשכולות:
- ב-pods (במיוחד ב-pods שלא ניתן לתזמן, או בצמתים שלא נעשה בהם שימוש מלא)
- בצמתים
- במפת ההגדרות
kube-system/cluster-autoscaler-status.
מגבלות
אלו המגבלות שחלות על המידרוג האוטומטי של האשכול:
אין תמיכה בתזמון מותאם אישית עם מסננים ששונו.
הצמתים לא גדלים אם ל-Pods יש ערך
PriorityClassמתחת ל--10. מידע נוסף זמין במאמר איך Cluster Autoscaler עובד עם Pod Priority ו-Preemption?אין תמיכה בהתאמת קנה מידה אוטומטית למאגרי צמתים של Windows.
פתרון בעיות
לפעמים, המידרוג האוטומטי של האשכול לא מצליח להקטין את האשכול באופן מלא, ונשאר צומת נוסף אחרי ההקטנה. המצב הזה יכול לקרות כשמתוזמנים פודים נדרשים של המערכת לצמתים שונים, כי אין טריגר להעברת הפודים האלה לצומת אחר. יש לי כמה צמתים עם ניצול נמוך, אבל הם לא מצטמצמים. למה? כדי לעקוף את ההגבלה הזו, אפשר להגדיר תקציב לשיבוש Pod.
אם נתקלתם בבעיות בהקטנת קנה המידה של האשכול, כדאי לעיין במאמר תזמון של Pod והפרעות. יכול להיות שתצטרכו להוסיף
PodDisruptionBudgetלתרמיליkube-system. מידע נוסף על הוספה ידנית שלPodDisruptionBudgetל-Pods שלkube-systemזמין במאמר שאלות נפוצות בנושא מידרוג אוטומטי של אשכולות Kubernetes.כשמצמצמים את קנה המידה, הכלי לשינוי גודל האשכול מכבד את כללי התזמון וההוצאה מהמערכת שהוגדרו ב-Pods. ההגבלות האלה יכולות למנוע את המחיקה של הצומת על ידי הכלי לשינוי גודל הקלאסטר באופן אוטומטי. יכול להיות שלא תהיה אפשרות למחוק צומת אם הוא מכיל Pod עם אחד מהתנאים הבאים:
כללי הזיקה או האנטי-זיקה של ה-Pod מונעים תזמון מחדש.
ל-Pod יש אחסון מקומי.
ה-Pod לא מנוהל על ידי בקר כמו Deployment, StatefulSet, Job או ReplicaSet.
ה-Pod נמצא במרחב השמות kube-system ואין לו PodDisruptionBudget
יכול להיות שהתקציב להפרעות ב-Pod של אפליקציה ימנע התאמה אוטומטית לעומס. אם מחיקת צמתים תוביל לחריגה מהתקציב, לא תתבצע הקטנה של גודל האשכול.
מידע נוסף
מידע נוסף על מידרוג אוטומטי של אשכולות ומניעת שיבושים זמין בשאלות הבאות בשאלות הנפוצות בנושא מידרוג אוטומטי של אשכולות Kubernetes:
- איך מצמצמים את מספר המכונות?
- האם Cluster Autoscaler פועל עם PodDisruptionBudget בהקטנת מספר הצמתים?
- אילו סוגים של Pods יכולים למנוע מ-Cluster Autoscaler להסיר צומת?