כשצריך לתקן או לתחזק צמתים, קודם צריך להעביר אותם למצב תחזוקה. הפעולה הזו מרוקנת בהדרגה את הפודים ועומסי העבודה הקיימים, לא כולל פודים קריטיים של המערכת כמו שרת ה-API. בנוסף, מצב תחזוקה מונע מהצומת לקבל הקצאות חדשות של פודים. במצב תחזוקה, אפשר לעבוד על הצמתים בלי לסכן את התנועה של ה-Pod.
איך זה עובד
Google Distributed Cloud מאפשר להעביר צמתים למצב תחזוקה. כך רכיבים אחרים באשכול יודעים שהצומת נמצא במצב תחזוקה. כשמעבירים צומת למצב תחזוקה, אי אפשר לתזמן פודים נוספים בצומת, והפודים הקיימים מופסקים.
במקום להשתמש במצב תחזוקה, אפשר להשתמש באופן ידני בפקודות Kubernetes כמו kubectl cordon ו-kubectl drain בצומת ספציפי.
כשמשתמשים בתהליך של מצב תחזוקה, Google Distributed Cloud מבצע את הפעולות הבאות:
1.29
Google Distributed Cloud מוסיף את ה
baremetal.cluster.gke.io/maintenance:NoScheduletaint לצמתים שצוינו כדי למנוע תזמון של פודים חדשים בצומת.ב-Google Distributed Cloud, המערכת משתמשת ב-Eviction API כדי להוציא כל Pod. בשיטה הזו של ניקוי הצמתים מתחשבים ב-PodDisruptionBudgets (תקציבים להפרעות ב-Pod). אתם יכולים להגדיר PDBs כדי להגן על עומסי העבודה על ידי ציון רמת הפרעה נסבלת עבור קבוצה של Pod באמצעות השדות
minAvailableו-maxUnavailable. ניקוי הצמתים בדרך הזו מספק הגנה טובה יותר מפני הפרעות בעומסי העבודה. ניקוי צמתים שמבוסס על הוצאה זמין כ-GA לגרסה 1.29.מוגדר פסק זמן של 20 דקות כדי לוודא שהצמתים לא ייתקעו בהמתנה להפסקת הפעולה של הפודים. יכול להיות שפודים לא ייעצרו אם הם מוגדרים לסבול את כל הכתמים או אם יש להם finalizers. מערכת Google Distributed Cloud מנסה לעצור את כל הפודים, אבל אם חלף הזמן הקצוב לתפוגה, הצומת עובר למצב תחזוקה. ההגדרה הזו מונעת מ-pods פועלים לחסום שדרוגים.
1.28 ומטה
Google Distributed Cloud מוסיף את ה
baremetal.cluster.gke.io/maintenance:NoScheduletaint לצמתים שצוינו כדי למנוע תזמון של פודים חדשים בצומת.Google Distributed Cloud מוסיף את התג
baremetal.cluster.gke.io/maintenance:NoExecute. בתגובה לתגNoExecute, Google Distributed Cloudkube-schedulerמפסיק את הפודים ומרוקן את הצומת. בשיטה הזו של ריקון צמתים לא מתבצעת התחשבות ב-PDB.מוגדר פסק זמן של 20 דקות כדי לוודא שהצמתים לא ייתקעו בהמתנה להפסקת הפעולה של הפודים. יכול להיות שפודים לא ייעצרו אם הם מוגדרים לסבול את כל הכתמים או אם יש להם finalizers. מערכת Google Distributed Cloud מנסה לעצור את כל הפודים, אבל אם חלף הזמן הקצוב לתפוגה, הצומת עובר למצב תחזוקה. ההגדרה הזו מונעת מ-pods פועלים לחסום שדרוגים.
התרוקנות על בסיס פינוי
אין שינויים פרוצדורליים שקשורים למעבר מניקוי צמתים שמבוסס על כתמי צבע לניקוי צמתים שמבוסס על פינוי. השינוי משפיע רק על לוגיקת ההתאמה.
היכולת הזו לא נמצאת באותו שלב השקה בכל הגרסאות הנתמכות:
- 1.29: GA
- 1.28: לא זמין
- 1.16: לא זמין
סדר ניקוז
לפני גרסה 1.29, תהליך ניקוי הצמתים שמבוסס על כתמי צבע שמתבצע ב-Google Distributed Cloud kube-scheduler לא משתמש באלגוריתם מסוים כדי לנקות את הפודים מצומת. בתהליך ניקוי הצמתים שמבוסס על פינוי, הפודים מפונים בסדר מסוים לפי העדיפות. העדיפות לפינוי משויכת לקריטריונים ספציפיים של פודים, כמו שמוצג בטבלה הבאה:
| סדר ניקוז | קריטריונים ל-Podcast (חייבים להתאים לכולם) וגם |
|---|---|
| 1 |
מערכת Kubernetes מוציאה משימוש (evict) פודים שעומדים בקריטריונים הבאים:
|
| 2 |
מערכת Kubernetes מוציאה משימוש (evict) פודים שעומדים בקריטריונים הבאים:
|
| 3 |
מערכת Kubernetes מוציאה משימוש (evict) פודים שעומדים בקריטריונים הבאים:
צו הפינוי של פודים תואמים מבוסס על |
| 4 |
מחכים עד ש-CSI ינקה את נקודות הצירוף של PV/PVC אחרי שכל הפודים יפונו. משתמשים בערך |
| 5 |
מערכת Kubernetes מפנה (evicts) את הפודים שעומדים בקריטריונים הבאים:
עדיין צריך לרוקן את הפודים האלה, כי kubelet לא מספק תאימות לשדרוג במקום. |
מכיוון שריקון צמתים שמבוסס על פינוי מכבד את ה-PDB, יכול להיות שהגדרות ה-PDB יחסמו את ריקון הצמתים בנסיבות מסוימות. למידע על פתרון בעיות שקשורות לריקון של מאגר צמתים, אפשר לעיין במאמר בדיקה למה צומת נמצא בסטטוס של ריקון במשך זמן רב.
המועד האחרון להפסקת השימוש בשיטה מבוססת-הסרה
כשמעבירים צמתים למצב תחזוקה, המערכת אוכפת פסק זמן של 20 דקות (1,200 שניות) לניקוי הצמתים. כשפסק הזמן מסתיים, כל ה-Pods שלא תומכים במצב תחזוקה מפונים והצומת מועבר למצב תחזוקה. החל מגרסה 1.16, אפשר להוסיף את ההערה baremetal.cluster.gke.io/maintenance-mode-deadline-seconds למשאב האשכול כדי לשנות את משך פסק הזמן. לדוגמה, כדי לשנות את פסק הזמן ל-10 דקות, מוסיפים את ההערה baremetal.cluster.gke.io/maintenance-mode-deadline-seconds: "600" למשאב האשכול.
לפעמים, תהליך הניקוי שמבוסס על פינוי חורג מהמועד האחרון שצוין על ידי maintenance-mode-deadline-seconds. אם תרמילי Pod נתקעים במצב סיום אחרי שהמועד האחרון חלף, אל תשתמשו ב-kubectl עם הדגלים --grace-period=0 --force כדי למחוק אותם בכוח, כי זה עלול לגרום להשחתת נתונים או לבעיות של פיצול מוח באפליקציות עם שמירת מצב. במקום זאת, הפעילו מחדש את הצמתים עם תרמילי Pod תקועים עם שמירת מצב.
לקבלת עזרה נוספת, אפשר לפנות אל Cloud Customer Care. אפשר גם לעיין במאמר קבלת תמיכה כדי לקבל מידע נוסף על מקורות תמיכה, כולל:
- דרישות לפתיחת בקשת תמיכה.
- כלים שיעזרו לכם לפתור בעיות, כמו הגדרת הסביבה, היומנים והמדדים.
- רכיבים נתמכים.
השבתה של ניקוז צמתים מבוסס-הוצאה
התכונה 'הפסקת פעילות של צמתים על סמך פינוי' מופעלת כברירת מחדל באשכולות בגרסה משנית 1.29 ואילך, או באשכולות שמשודרגים לגרסה משנית 1.29 ואילך. אם ניקוי הצמתים שמבוסס על הוצאת פודים גורם לבעיות בשדרוגי האשכול או בתחזוקת האשכול, אפשר לחזור לניקוי הצמתים שמבוסס על כתמי צבע על ידי הוספת ההערה baremetal.cluster.gke.io/maintenance-mode-ignore-pdb: "" למשאב האשכול.
כדי לשחזר את התנהגות ברירת המחדל של ניקוי הצמתים על סמך פינוי, צריך להסיר את ההערה לגמרי. הגדרת ההערה ל-false לא תפעיל מחדש את התנהגות ברירת המחדל.
העברת צומת למצב תחזוקה
בוחרים את הצמתים שרוצים להעביר למצב תחזוקה על ידי ציון טווחי כתובות IP לצמתים שנבחרו בקטע maintenanceBlocks בקובץ התצורה של האשכול. הצמתים שבוחרים צריכים להיות במצב מוכן ולפעול באשכול.
כדי להעביר צמתים למצב תחזוקה:
עורכים את קובץ ההגדרות של האשכול כדי לבחור את הצמתים שרוצים להעביר למצב תחזוקה.
אפשר לערוך את קובץ התצורה באמצעות עורך לבחירתכם, או לערוך ישירות את המשאב המותאם אישית של האשכול באמצעות הפעלת הפקודה הבאה:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAMESPACE: מרחב השמות של האשכול. -
CLUSTER_NAME: שם האשכול.
-
מוסיפים את הקטע
maintenanceBlocksלקובץ ההגדרות של האשכול כדי לציין כתובת IP אחת או טווח כתובות לצמתים שרוצים להעביר למצב תחזוקה.בדוגמה הבאה אפשר לראות איך בוחרים כמה צמתים על ידי ציון טווח של כתובות IP:
metadata: name: my-cluster namespace: cluster-my-cluster spec: maintenanceBlocks: cidrBlocks: - 172.16.128.1-172.16.128.64שומרים את ההגדרות המעודכנות של האשכול ומחילים אותן.
מערכת Google Distributed Cloud מתחילה להעביר את הצמתים למצב תחזוקה.
מריצים את הפקודה הבאה כדי לקבל את הסטטוס של הצמתים באשכול:
kubectl get nodes --kubeconfig=KUBECONFIGהפלט אמור להיראות כך:
NAME STATUS ROLES AGE VERSION user-baremetal-01 Ready control-plane 2d22h v1.27.4-gke.1600 user-baremetal-04 Ready worker 2d22h v1.27.4-gke.1600 user-baremetal-05 Ready worker 2d22h v1.27.4-gke.1600 user-baremetal-06 Ready worker 2d22h v1.27.4-gke.1600הערה: עדיין אפשר לתזמן את הצמתים, אבל הדחיות מונעות תזמון של Podים (ללא טולרנטיות מתאימה) בצומת.
מריצים את הפקודה הבאה כדי לקבל את מספר הצמתים במצב תחזוקה:
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIGהתגובה אמורה להיות דומה לדוגמה הבאה:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0UNDERMAINTENANCEהעמודה הזו בדוגמה מראה שצומת אחד נמצא במצב תחזוקה.בנוסף, מערכת Google Distributed Cloud מוסיפה את ה-taints הבאים לצמתים כשהם עוברים למצב תחזוקה:
baremetal.cluster.gke.io/maintenance:NoExecutebaremetal.cluster.gke.io/maintenance:NoSchedule
הסרת צומת ממצב תחזוקה
כדי להסיר צמתים ממצב תחזוקה:
עורכים את קובץ ההגדרות של האשכול כדי לנקות את הצמתים שרוצים להסיר ממצב תחזוקה.
אפשר לערוך את קובץ התצורה באמצעות עורך לבחירתכם, או לערוך ישירות את המשאב המותאם אישית של האשכול באמצעות הפעלת הפקודה הבאה:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAMESPACE: מרחב השמות של האשכול. -
CLUSTER_NAME: שם האשכול.
-
אפשר לערוך את כתובות ה-IP כדי להסיר צמתים ספציפיים ממצב תחזוקה, או להסיר את הקטע
maintenanceBlocksכדי להסיר את כל הצמתים ממצב תחזוקה.שומרים את ההגדרות המעודכנות של האשכול ומחילים אותן.
אפשר להשתמש בפקודות
kubectlכדי לבדוק את הסטטוס של הצמתים.
כיבוי והפעלה מחדש של אשכול
אם יש צורך להשבית אשכול שלם, אפשר להשתמש בהוראות שבסעיפים הבאים כדי להשבית אשכול ולהפעיל אותו מחדש בצורה בטוחה.
כיבוי אשכול
אם משביתים אשכול שמנהל אשכולות משתמשים, צריך להשבית קודם את כל אשכולות המשתמשים המנוהלים. ההוראות הבאות רלוונטיות לכל סוגי האשכולות של Google Distributed Cloud.
בודקים את הסטטוס של כל צמתי האשכול:
kubectl get nodes --kubeconfig CLUSTER_KUBECONFIGמחליפים את הערך
CLUSTER_KUBECONFIGבנתיב של קובץ ה-kubeconfig של האשכול.הפלט אמור להיראות כך:
NAME STATUS ROLES AGE VERSION control-0 Ready control-plane 202d v1.27.4-gke.1600 control-1 Ready control-plane 202d v1.27.4-gke.1600 control-2 Ready control-plane 202d v1.27.4-gke.1600 worker-0 Ready worker 202d v1.27.4-gke.1600 worker-1 Ready worker 202d v1.27.4-gke.1600 worker-2 Ready worker 202d v1.27.4-gke.1600 worker-3 Ready worker 202d v1.27.4-gke.1600 worker-4 Ready worker 154d v1.27.4-gke.1600 worker-5 Ready worker 154d v1.27.4-gke.1600 worker-6 Ready worker 154d v1.27.4-gke.1600 worker-7 Ready worker 154d v1.27.4-gke.1600 worker-8 Ready worker 154d v1.27.4-gke.1600 worker-9 Ready worker 154d v1.27.4-gke.1600אם הערך של
STATUSעבור צומת מסוים הוא לאReady, מומלץ מאוד לפתור את הבעיה בצומת ולהמשיך רק כשכל הצמתים הםReady.אם משביתים אשכול משתמשים, צריך לבדוק את הסטטוס של הצמתים באשכול האדמין:
kubectl get nodes --kubeconfig ADMIN_KUBECONFIGמחליפים את
ADMIN_KUBECONFIGבנתיב של קובץ ה-kubeconfig של האשכול המנהל.השלבים הבאים תלויים באשכול הניהול. אם הערך
STATUSשל צומת מסוים הוא לאReady, מומלץ מאוד לפתור את הבעיה בצומת ולהמשיך רק כשכל הצמתים הםReady.בודקים את תקינות האשכול שרוצים להשבית:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIGמחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAME: שם האשכול שבודקים.
ADMIN_KUBECONFIG: הנתיב של קובץ ה-kubeconfig של האשכול לניהול.
לפני שממשיכים, צריך לפתור את הבעיות שדווחו.
עבור האשכול שאתם משביתים, מוודאים שכל ה-Pods
etcdפועלים:kubectl get pods --kubeconfig CLUSTER_KUBECONFIG -A \ -l component=etcdמחליפים את הערך
CLUSTER_KUBECONFIGבנתיב של קובץ ה-kubeconfig של האשכול.הפלט אמור להיראות כך:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-control-0-admin 1/1 Running 0 2d22h kube-system etcd-control-1-admin 1/1 Running 0 2d22h kube-system etcd-control-2-admin 1/1 Running 0 2d22hאם הערך של
STATUSעבור פוד מסוים הוא לאRunning, מומלץ מאוד לפתור את הבעיה בפוד ולהמשיך רק כשכל הפודים הםRunning.מבצעים גיבוי כמו שמתואר במאמר גיבוי של אשכול.
חשוב לגבות את etcd לפני שמכבים את האשכול, כדי שאפשר יהיה לשחזר את האשכול אם נתקלים בבעיות בהפעלה מחדש של האשכול. השחתה של etcd, כשלים בחומרה של הצומת, בעיות בקישוריות לרשת ותנאים אחרים עלולים למנוע את ההפעלה מחדש של האשכול בצורה תקינה.
אם משביתים אשכול עם צמתי עובדים, צריך להעביר את צמתי העובדים למצב תחזוקה.
השלב הזה מצמצם את כמות הכתיבה ל-etcd, וכך מקטין את הסיכוי שיהיה צורך בתיקון של כמות גדולה של כתיבות ל-etcd כשמפעילים מחדש את האשכול.
מעבירים את הצמתים של מישור הבקרה למצב תחזוקה.
השלב הזה מונע כתיבה פגומה לעומסי עבודה עם שמירת מצב במהלך השבתת הצומת.
מכבים את צמתי האשכול ברצף הבא:
- צומתי עובד
- צמתים של מאזן עומסים במישור הבקרה
צמתים של מישור הבקרה, החל מהצמתים העוקבים של etcd ועד לצומת המוביל של etcd
אם יש לכם אשכול זמינות גבוהה (HA), אתם יכולים למצוא את ה-etcd leader באמצעות SSH כדי להתחבר לכל צומת של מישור הבקרה ולהריץ את הפקודה הבאה
etcdctl:ETCDCTL_API=3 etcdctl \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ --write-out=table endpoint statusהתשובה כוללת עמודה
IS LEADER, שמחזירהtrueאם הצומת הוא ה-etcd leader.
בשלב הזה, האשכול מושבת לחלוטין. אחרי שתבצעו את כל פעולות התחזוקה הנדרשות, תוכלו להפעיל מחדש את האשכול כמו שמתואר בקטע הבא.
הפעלה מחדש של האשכול
כדי להפעיל מחדש אשכול שהושבת לחלוטין, פועלים לפי השלבים הבאים.
מפעילים את מכונות הצמתים בסדר הפוך לסדר הכיבוי.
מסירים את הצמתים של מישור הבקרה ממצב תחזוקה.
הוראות מפורטות מופיעות במאמר הסרת צומת ממצב תחזוקה.
הסרת צמתי עובדים ממצב תחזוקה.
מריצים בדיקות תקינות של האשכול כדי לוודא שהוא פועל בצורה תקינה:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIGאם בעיה, כמו etcd crashlooping, מונעת מהאשכול להפעיל מחדש בצורה תקינה, נסו לשחזר את האשכול מהגיבוי האחרון הידוע. הוראות מפורטות מופיעות במאמר שחזור אשכול.
מצב חיוב ותחזוקה
החיוב על Google Distributed Cloud מבוסס על מספר המעבדים הווירטואליים (vCPU) שיש לאשכול שלכם עבור צמתים שיכולים להריץ עומסי עבודה. כשמעבירים צומת למצב תחזוקה, נוספים לצומת NoExecute ו-NoSchedule taints, אבל הם לא משביתים את החיוב. אחרי שמכניסים צומת למצב תחזוקה, צריך להגדיר את הצומת (kubectl cordon NODE_NAME) כך שלא ניתן יהיה לתזמן בו פעולות. אחרי שמסמנים צומת כצומת שלא ניתן לתזמן, הצומת והמעבדים הווירטואליים שמשויכים אליו לא נכללים בחיוב.
כמו שמתואר בדף התמחור, אפשר להשתמש ב-kubectl כדי לראות את קיבולת ה-vCPU (שמשמשת לחיוב) של כל אחד מאשכולות המשתמשים. הפקודה לא מתייחסת לשאלה אם אפשר לתזמן את הצומת או לא, היא מספקת רק ספירה של vCPU לכל צומת.
כדי לזהות את מספר המעבדים הווירטואליים לכל צומת באשכול המשתמשים:
kubectl get nodes \
--kubeconfig USER_KUBECONFIG \
-o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
{.status.capacity.cpu}{\"\n\"}{end}"
מחליפים את USER_KUBECONFIG בנתיב של קובץ ה-kubeconfig של אשכול המשתמשים.