בעיות באשכולות Autopilot של Google Kubernetes Engine (GKE) יכולות להשפיע על הזמינות של האפליקציה ועל היעילות התפעולית שלה. הבעיות האלה יכולות לשבש את כל מחזור החיים של האפליקציות, מהפריסה הראשונית ועד להרחבה בעומס.
בדף הזה מוסבר איך לאבחן ולפתור בעיות נפוצות שספציפיות לאשכולות Autopilot. כאן תוכלו למצוא הנחיות לפתרון בעיות שמונעות הקצאה של אשכולות, בעיות שקשורות לשינוי קנה מידה כמו שגיאות out
of resources ובעיות שקשורות לעומסי עבודה ספציפיים כמו שגיאות באחסון זמני או Pods שנתקעו במצב Pending.
המידע הזה חשוב למפתחי אפליקציות שצריכים לוודא שהאפליקציות שלהם נפרסות ופועלות בצורה חלקה, ולמנהלי פלטפורמות ולמפעילים שאחראים על התקינות הכללית ועל ניהול המשאבים של אשכולות Autopilot. למידע נוסף על התפקידים הנפוצים ודוגמאות למשימות שאנחנו מתייחסים אליהן בתוכן של Cloud de Confiance by S3NS , קראו את המאמר תפקידים ומשימות נפוצים של משתמשי GKE.
בעיות באשכולות
אי אפשר ליצור אשכול: 0 צמתים רשומים
הבעיה הבאה מתרחשת כשמנסים ליצור אשכול Autopilot עם חשבון שירות של IAM שמושבת או שאין לו את ההרשאות הנדרשות. יצירת האשכול נכשלת ומוצגת הודעת השגיאה הבאה:
All cluster resources were brought up, but: only 0 nodes out of 2 have registered.
כדי לפתור את הבעיה:
בודקים אם חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine או חשבון השירות בהתאמה אישית ב-IAM שבו רוצים להשתמש מושבתים:
gcloud iam service-accounts describe SERVICE_ACCOUNTמחליפים את
SERVICE_ACCOUNTבכתובת האימייל של חשבון השירות, למשלmy-iam-account@my-first-project.s3ns.iam.gserviceaccount.com.אם חשבון השירות מושבת, הפלט דומה לזה:
disabled: true displayName: my-service-account email: my-service-account@my-project.s3ns.iam.gserviceaccount.com ...אם חשבון השירות מושבת, מפעילים אותו:
gcloud iam service-accounts enable SERVICE_ACCOUNT
אם חשבון השירות מופעל והשגיאה נמשכת, צריך לתת לחשבון השירות את ההרשאות המינימליות שנדרשות ל-GKE:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:SERVICE_ACCOUNT" \
--role roles/container.defaultNodeServiceAccount
מרחב השמות תקוע במצב Terminating כשיש 0 צמתים באשכול
הבעיה הבאה מתרחשת כשמוחקים מרחב שמות באשכול אחרי שהאשכול מצטמצם לאפס צמתים. הרכיב metrics-server לא יכול לקבל את הבקשה למחיקת מרחב השמות כי יש לו אפס רפליקות.
כדי לאבחן את הבעיה, מריצים את הפקודה הבאה:
kubectl describe ns/NAMESPACE_NAME
מחליפים את NAMESPACE_NAME בשם של מרחב השמות.
הפלט שיתקבל:
Discovery failed for some groups, 1 failing: unable to retrieve the complete
list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to
handle the request
כדי לפתור את הבעיה, צריך להגדיל את עומס העבודה כדי לגרום ל-GKE ליצור צומת חדש. כשהצומת מוכן, הבקשה למחיקת מרחב השמות מסתיימת באופן אוטומטי. אחרי ש-GKE מוחק את מרחב השמות, מקטינים את עומס העבודה.
בעיות שקשורות לשינוי קנה מידה
ההרחבה האנכית של הצומת נכשלה: יכול להיות שה-Pod לא יתוזמן
הבעיה הבאה מתרחשת כשרישום ביומן של יציאה טורית מושבת בפרויקטCloud de Confiance by S3NS . כדי לנפות באגים ביעילות בצמתים של אשכולות GKE Autopilot, צריך להפעיל רישום ביומן של יציאה טורית. אם רישום ביומן של יציאה טורית מושבת, Autopilot לא יכול להקצות צמתים להרצת עומסי העבודה.
הודעת השגיאה ביומן האירועים של Kubernetes דומה להודעה הבאה:
LAST SEEN TYPE REASON OBJECT MESSAGE
12s Warning FailedScaleUp pod/pod-test-5b97f7c978-h9lvl Node scale up in zones associated with this pod failed: Internal error. Pod is at risk of not being scheduled
יכול להיות שרישום ביומן של היציאה הטורית מושבת ברמת הארגון באמצעות מדיניות ארגונית שאוכפת את האילוץ compute.disableSerialPortLogging. אפשר גם להשבית את רישום היציאה הטורית ביומן ברמת הפרויקט או ברמת המכונה הווירטואלית (VM).
כדי לפתור את הבעיה:
- מבקשים מהאדמין של מדיניות הארגון Cloud de Confiance by S3NS להסיר את האילוץ
compute.disableSerialPortLoggingבפרויקט עם אשכול Autopilot. - אם אין לכם מדיניות ארגונית שאוכפת את המגבלה הזו, נסו להפעיל את רישום היציאה הטורית ביומן במטא-נתונים של הפרויקט.
כדי לבצע את הפעולה הזו נדרשת הרשאת ה-IAM
compute.projects.setCommonInstanceMetadata.
הגדלת קנה המידה של הצומת נכשלה: נגמרו המשאבים ב-Compute Engine
הבעיה הבאה מתרחשת כשעומסי העבודה מבקשים יותר משאבים ממה שזמין לשימוש באזור או בתחום של Compute Engine. יכול להיות שה-Pods יישארו במצב Pending.
כדי לבדוק את האירועים של ה-Pod:
kubectl events --for='pod/POD_NAME' --types=Warningמחליפים את
RESOURCE_NAMEבשם של המשאב ב-Kubernetes שנמצא בהמתנה. לדוגמהpod/example-pod.הפלט אמור להיראות כך:
LAST SEEN TYPE REASON OBJECT Message 19m Warning FailedScheduling pod/example-pod gke.io/optimize-utilization-scheduler 0/2 nodes are available: 2 node(s) didn't match Pod's node affinity/selector. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling. 14m Warning FailedScheduling pod/example-pod gke.io/optimize-utilization-scheduler 0/2 nodes are available: 2 node(s) didn't match Pod's node affinity/selector. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling. 12m (x2 over 18m) Warning FailedScaleUp cluster-autoscaler Node scale up in zones us-central1-f associated with this pod failed: GCE out of resources. Pod is at risk of not being scheduled. 34s (x3 over 17m) Warning FailedScaleUp cluster-autoscaler Node scale up in zones us-central1-b associated with this pod failed: GCE out of resources. Pod is at risk of not being scheduled.
כדי לפתור את הבעיה, נסו את הפתרונות הבאים:
- פורסים את ה-Pod באזור או בתחום אחר. אם ל-Pod יש הגבלה אזורית, כמו בורר טופולוגיה, הסירו את ההגבלה אם אפשר. להוראות, קראו את המאמר הצבת פודים של GKE באזורים ספציפיים.
- יוצרים אשכול באזור אחר ומנסים שוב לפרוס.
- נסו להשתמש במחלקת מחשוב אחרת. במחלקות Compute שמגובות בסוגי מכונות קטנים יותר של Compute Engine, יש סיכוי גבוה יותר שיהיו משאבים זמינים. לדוגמה, סוג המכונה שמוגדר כברירת מחדל ב-Autopilot הוא בעל הזמינות הגבוהה ביותר. רשימה של סוגי מכונות וסוגי המכונות התואמים מופיעה במאמר מתי להשתמש בסוגי מכונות ספציפיים.
- אם אתם מריצים עומסי עבודה של GPU, יכול להיות שה-GPU שביקשתם לא זמין במיקום של הצומת. נסו לפרוס את עומס העבודה במיקום אחר או לבקש סוג אחר של GPU.
כדי למנוע בעיות בהגדלת קנה המידה שנגרמות בגלל זמינות המשאבים בעתיד, כדאי לשקול את הגישות הבאות:
- מגדירים ComputeClass בהתאמה אישית עם רשימה של סדרות מכונות חלופיות לפי סדר עדיפות, ומפעילים העברה פעילה (
optimizeRulePriority: true). ההגדרה הזו מאפשרת ל-GKE להקצות באופן אוטומטי חומרה חלופית כשאין מספיק קיבולת מחשוב באזור, ולהעביר את הפודים בחזרה כשהקיבולת המועדפת מתאוששת. - שימוש ב-PriorityClasses של Kubernetes כדי להקצות באופן עקבי קיבולת מחשוב נוספת באשכול. למידע נוסף, קראו את המאמר הקצאת קיבולת מחשוב נוספת להרחבה מהירה של Pod.
- שימוש במקומות שמורים ב-Compute Engine עם
PerformanceComputeClass או פודים מואצים. למידע נוסף, קראו את המאמר שימוש במשאבים שמורים של תחום מוגדר.
הצמתים לא מצליחים להגדיל את קנה המידה: חריגה מהמשאבים של Pod בתחום מוגדר
הבעיה הבאה מתרחשת כשמצב Autopilot לא מקצה צמתים חדשים ל-Pod באזור ספציפי, כי צומת חדש יפר את מגבלות המשאבים.
הודעת השגיאה ביומנים דומה להודעה הבאה:
"napFailureReasons": [
{
"messageId": "no.scale.up.nap.pod.zonal.resources.exceeded",
...
השגיאה הזו מתייחסת לאירוע noScaleUp, שבו הקצאת צמתים אוטומטית (NAP) לא הקצתה אף קבוצת צמתים ל-Pod באזור.
אם נתקלתם בשגיאה הזו, בדקו את הדברים הבאים:
- ל-Pods יש מספיק זיכרון ומעבד (CPU).
- טווח ה-CIDR של כתובת ה-IP של Pod גדול מספיק כדי לתמוך בגודל המקסימלי הצפוי של האשכול.
עומס העבודה מתוזמן בסדרת מכונות ישנה יותר או תקוע במצב Pending בגלל חוסר תאימות של האחסון
הבעיה הזו מתרחשת כשעומס עבודה עם שמירת מצב משתמש בסוג קודם של נפח Persistent Disk, כמו נפחי דיסק מתמיד סטנדרטי (pd-standard) או נפחי דיסק מתמיד שמבוסס על SSD (pd-ssd). סוגי אמצעי האחסון האלה לא תואמים לסדרות מכונות חדשות יותר, כמו C3 או E4.
הבעיה הזו יכולה להתבטא באחת משתי דרכים:
- תופעה 1: עומס עבודה שאתם מצפים שירוץ בסדרת מכונות חדשה יותר לשימוש כללי (כמו C3) מתוזמן אוטומטית לצומת E2 במקום זאת.
- תסמין 2: פוד שמבקש במפורש סדרת מכונות חדשה יותר (לדוגמה, באמצעות שדות
nodeSelectorאו ComputeClass בהתאמה אישית) נשאר תקוע במצבPending.
שורש הבעיה
ב-GKE Autopilot יש אכיפה של תאימות בין סוגי האחסון המבוקשים לבין סדרת המכונות של הצומת. בסדרות מכונות חדשות יותר, כמו C3 ו-E4, נדרש אחסון ב-Google Cloud Hyperdisk (כמו סוג הדיסק hyperdisk-balanced). בסדרות המכונות האלה אי אפשר להשתמש בסוגי נפחים קודמים של Persistent Disk, כמו נפחים של דיסק מתמיד סטנדרטי (pd-standard) או של דיסק מתמיד שמבוסס על SSD (pd-ssd).
- אם לא תציינו סדרת מכונות, GKE Autopilot יתזמן באופן אוטומטי את עומס העבודה בצומת E2, כי צומתי E2 תומכים בסוגי הנפחים האלה של Persistent Disk. עומס העבודה חוזר באופן אוטומטי מהחומרה החדשה יותר שמוגדרת כברירת מחדל.
- אם אתם מבקשים במפורש סדרת מכונות חדשה יותר (כמו C3 או E4) אבל מצרפים סוג קודם של נפח דיסק מתמיד, כמו נפחי דיסק מתמיד סטנדרטי (
pd-standard) או דיסק מתמיד שמבוסס על SSD (pd-ssd), GKE Autopilot לא יכול לעמוד בשתי הדרישות. ה-Pod נשאר תקוע במצבPending.
אימות
כדי לבדוק אם עומס העבודה מושפע ממגבלת התאימות הזו, מבצעים את הפעולות הבאות:
- בודקים את הגדרת הנפח של ה-Pod כדי לראות אם הוא משתמש בסוג קודם של נפח דיסק מתמיד, כמו דיסק מתמיד סטנדרטי (
pd-standard) או דיסק מתמיד שמבוסס על SSD (pd-ssd). אם ה-Pod תקוע במצב
Pending, צריך לבדוק את יומני החשיפה של המידרוג האוטומטי באשכול. מחפשים יומני הערכה של הקצאת צמתים אוטומטית (NAP) שדומים לאלה:NAP: injected node groups for requirements...בודקים את הודעת היומן של הרשימה
families="...". בודקים אם חסרות ברשימה משפחות מכונות חדשות יותר (כמו מזהים שלe4אוc3). מזהים חסרים מצביעים על כך ש-GKE סינן את המשפחות האלה במהלך התזמון בגלל דרישת האחסון. המזההe4משמש ביומנים פנימיים של סדרת המכונות E4.
רזולוציה
כדי לפתור את הבעיה, מבצעים אחת מהפעולות הבאות:
- שימוש באחסון ב-Hyperdisk: מעדכנים את ההגדרה של
StorageClassאו של אמצעי האחסון כדי להשתמש באחסון ב-Google Cloud Hyperdisk (כמו סוג הדיסקhyperdisk-balanced), שתואם לסדרות חדשות יותר של מכונות. - לאפשר תזמון בסדרות ישנות יותר: אם אתם חייבים להשתמש בסוגי נפחים ישנים יותר של Persistent Disk (כמו נפחים של דיסק מתמיד סטנדרטי (
pd-standard) או דיסק מתמיד שמבוסס על SSD (pd-ssd)), הסירו את כל הבקשות המפורשות לסדרות מכונות חדשות יותר (כמו שדותnodeSelectorאו ComputeClasses בהתאמה אישית). הסרת הבקשות האלה מאפשרת ל-GKE Autopilot לתזמן את ה-Pod בצמתים תואמים כמו E2.
בעיות בעומס העבודה
עומסי עבודה תקועים עם שגיאת אחסון זמני
GKE לא ייצור פודים אם הבקשות לאחסון הארעי של הפודים חורגות מהמקסימום של Autopilot, שהוא 10GiB ב-GKE בגרסה 1.28.6-gke.1317000 ואילך.
כדי לאבחן את הבעיה, מתארים את בקר עומס העבודה, כמו הפריסה או המשימה:
kubectl describe CONTROLLER_TYPE/CONTROLLER_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
CONTROLLER_TYPE: סוג בקר עומס העבודה, כמוreplicasetאוdaemonset. רשימה של סוגי בקרים מופיעה במאמר ניהול עומסי עבודה. -
CONTROLLER_NAME: השם של עומס העבודה שנתקע.
אם ה-Pod לא נוצר כי הבקשה לאחסון זמני חורגת מהמקסימום, הפלט אמור להיראות כך:
# lines omitted for clarity
Events:
{"[denied by autogke-pod-limit-constraints]":["Max ephemeral-storage requested by init containers for workload '' is higher than the Autopilot maximum of '10Gi'.","Total ephemeral-storage requested by containers for workload '' is higher than the Autopilot maximum of '10Gi'."]}
כדי לפתור את הבעיה, צריך לעדכן את הבקשות לאחסון זמני כך שהנפח הכולל של האחסון הזמני שמתבקש על ידי קונטיינרים של עומסי עבודה וקונטיינרים שמוזרקים על ידי תגובות לפעילות אינטרנט יהיה קטן מהמקסימום המותר או שווה לו. למידע נוסף על המקסימום, ראו בקשות למשאבים ב-Autopilot להגדרת עומס העבודה.
פודים תקועים במצב Pending
יכול להיות ש-Pod ייתקע בסטטוס Pending אם תבחרו צומת ספציפי לשימוש ב-Pod, אבל סכום בקשות המשאבים ב-Pod וב-DaemonSets שחייבים לפעול בצומת חורג מהקיבולת המקסימלית שניתן להקצות לצומת. זה עלול לגרום ל-Pod לקבל סטטוס Pending ולהישאר לא מתוזמן.
כדי למנוע את הבעיה הזו, בדקו את הגדלים של עומסי העבודה שפרסתם כדי לוודא שהם לא חורגים מהמספר המקסימלי של בקשות למשאבים ב-Autopilot.
אפשר גם לנסות לתזמן את ה-DaemonSets לפני שמתזמנים את ה-Pods של עומס העבודה הרגיל.
ביצועים לא אמינים באופן עקבי של עומס העבודה בצומת ספציפי
בגרסה 1.24 ואילך של GKE, אם עומסי העבודה בצומת מסוים חווים באופן עקבי שיבושים, קריסות או התנהגות לא אמינה דומה, אתם יכולים להודיע ל-GKE על הצומת הבעייתי על ידי בידוד שלו באמצעות הפקודה הבאה:
kubectl drain NODE_NAME --ignore-daemonsets
מחליפים את NODE_NAME בשם של הצומת הבעייתי.
כדי למצוא את שם הצומת, מריצים את הפקודה kubectl get nodes.
GKE מבצע את הפעולות הבאות:
- מפנה עומסי עבודה קיימים מהצומת ומפסיק לתזמן עומסי עבודה בצומת הזה.
- יוצר מחדש באופן אוטומטי בצמתים אחרים עומסי עבודה שפונו ומנוהלים על ידי בקר, כמו Deployment או StatefulSet.
- מסיים את כל עומסי העבודה שנותרו בצומת ומתקן או יוצר מחדש את הצומת לאורך זמן.
- אם אתם משתמשים ב-Autopilot, GKE משבית ומחליף את הצומת באופן מיידי ומתעלם מכל PodDisruptionBudgets שהוגדרו.
תזמון Pods באשכולות ריקים נמשך יותר זמן מהצפוי
האירוע הזה מתרחש כשפורסים עומס עבודה באשכול Autopilot שאין בו עומסי עבודה אחרים. אשכולות Autopilot מתחילים עם אפס צמתים שמישים, ומתרחבים לאפס צמתים אם האשכול ריק, כדי למנוע מצב של משאבי מחשוב לא מנוצלים באשכול. פריסת עומס עבודה באשכול שאין בו צמתים מפעילה אירוע של הרחבה אנכית בהתאם לעומס (scale up).
אם זה קורה, סימן ש-Autopilot פועל כמו שצריך ואין צורך לעשות שום דבר. עומס העבודה ייפרס כמצופה אחרי שהצמתים החדשים יופעלו.
בודקים אם ה-Pods ממתינים לצמתים חדשים:
תיאור של ה-Pod בהמתנה:
kubectl describe pod POD_NAMEמחליפים את
POD_NAMEבשם של ה-Pod בהמתנה.בודקים את הקטע
Eventsבפלט. אם ה-Pod ממתין לצמתים חדשים, הפלט דומה לזה:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 11s gke.io/optimize-utilization-scheduler no nodes available to schedule pods Normal TriggeredScaleUp 4s cluster-autoscaler pod triggered scale-up: [{https://www.googleapis.com/compute/v1/projects/example-project/zones/example-zone/instanceGroups/gk3-example-cluster-pool-2-9293c6db-grp 0->1 (max: 1000)} {https://www.googleapis.com/compute/v1/projects/example-project/zones/example-zone/instanceGroups/gk3-example-cluster-pool-2-d99371e7-grp 0->1 (max: 1000)}]האירוע
TriggeredScaleUpמראה שהאשכול שלכם משתנה מאפס צמתים למספר הצמתים שנדרש כדי להריץ את עומס העבודה שנפרס.
פודים של המערכת לא מצליחים לתזמן באשכולות ריקים
האירוע הזה מתרחש כשאין עומסי עבודה שפועלים באשכול, וכתוצאה מכך האשכול מצטמצם לאפס צמתים. אשכולות Autopilot מתחילים עם אפס צמתים שמישים, ומתכווצים לאפס צמתים אם לא מריצים אף אחד מעומסי העבודה באשכול. כך אפשר לצמצם את בזבוז משאבי המחשוב באשכול.
כשאשכול מצטמצם לאפס צמתים, עומסי העבודה של מערכת GKE לא יתוזמנו ויישארו במצב Pending. זו ההתנהגות המיועדת ואין צורך לבצע שום פעולה. בפעם הבאה שתפרסו עומס עבודה באשכול, GKE יגדיל את האשכול וה-Pods של המערכת שנמצאים בהמתנה יפעלו בצמתים האלה.
כדי לבדוק אם Pods של המערכת ממתינים בגלל אשכול ריק, מבצעים את הפעולות הבאות:
בודקים אם יש צמתים באשכול:
kubectl get nodesהפלט הבא מציין שבאשכול יש אפס צמתים:
No resources foundבודקים את הסטטוס של Pods של המערכת:
kubectl get pods --namespace=kube-systemהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE antrea-controller-horizontal-autoscaler-6d97f7cf7c-ngfd2 0/1 Pending 0 9d egress-nat-controller-84bc985778-6jcwl 0/1 Pending 0 9d event-exporter-gke-5c5b457d58-7njv7 0/2 Pending 0 3d5h event-exporter-gke-6cd5c599c6-bn665 0/2 Pending 0 9d konnectivity-agent-694b68fb7f-gws8j 0/2 Pending 0 3d5h konnectivity-agent-7d659bf64d-lp4kt 0/2 Pending 0 9d konnectivity-agent-7d659bf64d-rkrw2 0/2 Pending 0 9d konnectivity-agent-autoscaler-5b6ff64fcd-wn7fw 0/1 Pending 0 9d konnectivity-agent-autoscaler-cc5bd5684-tgtwp 0/1 Pending 0 3d5h kube-dns-65ccc769cc-5q5q7 0/5 Pending 0 3d5h kube-dns-7f7cdb9b75-qkq4l 0/5 Pending 0 9d kube-dns-7f7cdb9b75-skrx4 0/5 Pending 0 9d kube-dns-autoscaler-6ffdbff798-vhvkg 0/1 Pending 0 9d kube-dns-autoscaler-8b7698c76-mgcx8 0/1 Pending 0 3d5h l7-default-backend-87b58b54c-x5q7f 0/1 Pending 0 9d metrics-server-v1.31.0-769c5b4896-t5jjr 0/1 Pending 0 9dבודקים למה ה-Pods של המערכת נמצאים בסטטוס
Pending:kubectl describe pod --namespace=kube-system SYSTEM_POD_NAMEמחליפים את
SYSTEM_POD_NAMEבשם של כל Pod מערכת מהפלט של הפקודה הקודמת.הפלט אמור להיראות כך:
... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 4m35s (x27935 over 3d5h) default-scheduler no nodes available to schedule pods ...בפלט, הערך
no nodes available to schedule podsבשדהMessageשל האירועFailedSchedulingמציין שה-Pod של המערכת לא תזמן כי האשכול ריק.
שגיאה שקשורה להרשאה כשמנסים להריץ tcpdump מ-Pod ב-GKE Autopilot
באשכול GKE Autopilot אסור לגשת לצמתים הבסיסיים. לכן, צריך להריץ את הכלי tcpdump מתוך Pod ואז להעתיק אותו באמצעות הפקודה kubectl cp.
אם אתם מריצים בדרך כלל את כלי השירות tcpdump מתוך Pod באשכול GKE Autopilot, יכול להיות שתופיע השגיאה הבאה:
tcpdump: eth0: You don't have permission to perform this capture on that device
(socket: Operation not permitted)
זה קורה כי כברירת מחדל, GKE Autopilot מחיל הקשר אבטחה על כל ה-Pods שמבטלים את היכולת NET_RAW כדי לצמצם נקודות חולשה פוטנציאליות. לדוגמה:
apiVersion: v1
kind: Pod
metadata:
labels:
app: tcpdump
name: tcpdump
spec:
containers:
- image: nginx
name: nginx
resources:
limits:
cpu: 500m
ephemeral-storage: 1Gi
memory: 2Gi
requests:
cpu: 500m
ephemeral-storage: 1Gi
memory: 2Gi
securityContext:
capabilities:
# This section drops NET_RAW to mitigate security vulnerabilities
drop:
- NET_RAW
כדי לפתור את הבעיה, אם עומס העבודה שלכם דורש את היכולת NET_RAW, אתם יכולים להפעיל אותה מחדש:
מוסיפים את היכולת
NET_RAWלקטעsecurityContextבמפרט ה-YAML של ה-Pod:securityContext: capabilities: add: - NET_RAWמריצים את
tcpdumpמתוך Pod:tcpdump port 53 -w packetcap.pcap tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytesכדי להעתיק את הקובץ למכונה המקומית לניתוח נוסף, משתמשים בפקודה
kubectl cp:kubectl cp POD_NAME:/PATH_TO_FILE/FILE_NAME/PATH_TO_FILE/FILE_NAMEמשתמשים ב-
kubectl execכדי להריץ את הפקודהtcpdump, לבצע תיעוד של חבילות נתונים ולהפנות את הפלט:kubectl exec -it POD_NAME -- bash -c "tcpdump port 53 -w -" > packet-new.pcap
Pods לא יכולים לפעול בצומת כי הפעולה NRI RunPodSandbox נכשלה
במקרים נדירים, צומת Autopilot בסוגי המחשוב שמוגדרים כברירת מחדל, Balanced, Scale-Out, autopilot ו-autopilot-spot יכול להיכנס למצב שבו Pods של המערכת, כמו anetd, ו-Pods פוטנציאליים של משתמשים שמוקצים לצומת, לא יכולים לעבור למצב פעולה. אם anetd לא יכול לעבור למצב פעולה, אז הרשת של Pod שבורה באופן חלקי או מלא בצומת. מצב השגיאה הזה מופעל רק במהלך שדרוגים מסוימים של מישור הבקרה של האשכול.
אם אתם מבחינים בבעיה, אתם יכולים לצמצם אותה בצומת מסוים על ידי ביצוע ההליך לצמצום ביצועים לא אמינים של עומס עבודה בצומת ספציפי.
כדי למנוע את הישנות הבעיה, שדרגו ידנית את האשכול לאחת מגרסאות התיקונים הבאות של GKE:
- 1.35: כל גרסאות התיקון
- 1.34: 1.34.1-gke.3899000 ואילך
- 1.33: 1.33.5-gke.2392000 ואילך
אם אתם חושדים שצומת נמצא במצב השגיאה הזה, אתם יכולים לבדוק את זה כך:
מאתרים את ה-Pod של
efficiency-daemonשפועל בצומת החשוד:DAEMON_POD_NAME=$(kubectl get pods \ --namespace kube-system \ --selector k8s-app=efficiency-daemon \ --field-selector spec.nodeName=NODE_NAME \ --output custom-columns=":metadata.name" \ --no-headers) echo $DAEMON_POD_NAMEאם אין pod של
efficiency-daemonבצומת, הצומת לא מושפע מהבעיה הספציפית הזו.בודקים אם יש שגיאות ספציפיות ב-Pod של
efficiency-daemon:kubectl logs -n kube-system $DAEMON_POD_NAME | grep "connect: operation not permitted" | wc -lאם הפלט גדול מ-
10, סביר מאוד שהצומת מושפע מהבעיה הזו.
אם אתם רואים כל הזמן את הודעת השגיאה הבאה באירועי Pod של Pod שהוקצה לצומת, זה סימן שהצומת מושפע מהבעיה הזו: Failed to create pod sandbox: rpc error: code = Unknown desc = NRI RunPodSandbox failed: rpc error: code = Unknown desc = internal error: reconciliation failed.
המאמרים הבאים
אם לא מצאתם פתרון לבעיה במסמכי העזרה, תוכלו לקבל עזרה נוספת בקבלת תמיכה, כולל עצות בנושאים הבאים:
- לפתוח בקשת תמיכה באמצעות פנייה ל-Cloud Customer Care.
- לקבל תמיכה מהקהילה על ידי פרסום שאלות ב-StackOverflow ושימוש בתג
google-kubernetes-engineכדי לחפש בעיות דומות. אתם יכולים גם להצטרף לערוץ Slack של#kubernetes-engineכדי לקבל תמיכה מהקהילה. - דיווח על בעיות או שליחת בקשות להוספת תכונות באמצעות הכלי הציבורי Issue Tracker.