בדף הזה מוסבר איך להגדיר אשכול של Google Kubernetes Engine (GKE) כדי לשלוח מדדים שנוצרו על ידי שרת ה-API, Scheduler ו-Controller Manager של Kubernetes ל-Cloud Monitoring באמצעות השירות המנוהל של Google Cloud ל-Prometheus. בנוסף, מוסבר איך המדדים האלה מעוצבים כשהם נכתבים ב-Monitoring ואיך שולחים שאילתות לגבי מדדים.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-Google Cloud CLI למשימה הזו, מתקינים ואז מאתחלים את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.
דרישות
כדי לשלוח ל-Cloud Monitoring מדדים שנוצרו על ידי רכיבים ברמת הבקרה של Kubernetes, צריך לעמוד בדרישות הבאות:
- באשכול צריכה להיות הפעלה של מדדי המערכת.
הגדרת איסוף המדדים של מישור הבקרה
אפשר להפעיל מדדים של מישור הבקרה באשכול GKE קיים באמצעות מסוף Google Cloud , ה-CLI של gcloud או Terraform.
המסוף
אפשר להפעיל את המדדים של מישור הבקרה באשכול דרך הכרטיסייה Observability או הכרטיסייה Details של האשכול. בכרטיסייה Observability אתם יכולים לראות תצוגה מקדימה של התרשימים והמדדים הזמינים לפני שאתם מפעילים את חבילת המדדים.
כדי להפעיל מדדים של מישור הבקרה מהכרטיסייה Observability של האשכול:
-
במסוף Google Cloud , נכנסים לדף Kubernetes clusters:
נכנסים לדף Kubernetes clusters.
אם אתם משתמשים בשורת החיפוש כדי למצוא את הדף הזה, בחרו בתוצאה שכותרת המשנה שלה היא Kubernetes Engine.
לוחצים על שם האשכול ובוחרים בכרטיסייה Observability.
בוחרים באפשרות Control Plane מרשימת התכונות.
לוחצים על הפעלת החבילה.
אם המדדים של מישור הבקרה כבר מופעלים, תראו קבוצה של תרשימים למדדים של מישור הבקרה.
כדי להפעיל את מדדי מישור הבקרה מהכרטיסייה Details של האשכול:
-
במסוף Google Cloud , נכנסים לדף Kubernetes clusters:
נכנסים לדף Kubernetes clusters.
אם אתם משתמשים בשורת החיפוש כדי למצוא את הדף הזה, בחרו בתוצאה שכותרת המשנה שלה היא Kubernetes Engine.
לוחצים על שם האשכול.
בשורה Features, לוחצים על סמל העריכה של Cloud Monitoring.
בתיבת הדו-שיח Edit Cloud Monitoring שמופיעה, מוודאים שהאפשרות Enable Cloud Monitoring מסומנת.
בתפריט הנפתח Components, בוחרים את רכיבי מישור הבקרה שמהם רוצים לאסוף מדדים: שרת API, Scheduler או Controller Manager.
לוחצים על OK.
לוחצים על שמירת השינויים.
gcloud
מעדכנים את האשכול כדי לאסוף מדדים שנשלחים על ידי שרת ה-API, Scheduler ו-Controller Manager של Kubernetes:
gcloud container clusters update CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--monitoring=SYSTEM,API_SERVER,SCHEDULER,CONTROLLER_MANAGER
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: שם האשכול. COMPUTE_LOCATION: המיקום של האשכול ב-Compute Engine.
Terraform
כדי להגדיר את איסוף המדדים של מישור הבקרה של Kubernetes באמצעות Terraform, עיינו בבלוק monitoring_config ב
מרשם של Terraform ל-google_container_cluster.
מידע כללי על השימוש ב- Google Cloud עם Terraform מופיע במאמר Terraform עם Google Cloud.
מכסה
מדדי מישור הבקרה צורכים את המכסה "בקשות להטמעת סדרות זמן לדקה" של Cloud Monitoring API. לפני שמפעילים את חבילות המדדים, בודקים את השיא האחרון בשימוש במכסה הזו. אם יש לכם הרבה אשכולות באותו פרויקט או שאתם כבר מתקרבים למגבלת המכסה, אתם יכולים לבקש להגדיל את מגבלת המכסה לפני שתפעילו את אחת מחבילות התצפית.
תמחור
המדדים של מישור הבקרה של GKE משתמשים בשירות המנוהל של Google Cloud ל-Prometheus כדי לטעון מדדים ל-Cloud Monitoring. החיובים ב-Cloud Monitoring על הטמעת המדדים האלה מבוססים על מספר הדגימות שהוטמעו.
למידע נוסף, קראו את המאמר התמחור של Cloud Monitoring.
פורמט המדד
כל המדדים של מישור הבקרה של Kubernetes שנכתבים ב-Cloud Monitoring משתמשים בסוג המשאב
prometheus_target.
לכל שם של מדד יש את הקידומת prometheus.googleapis.com/ וסיומת שמציינת את סוג המדד של Prometheus, כמו /gauge, /histogram או /counter. אחרת, כל שם של מדד זהה לשם המדד שחשוף על ידי Kubernetes בקוד פתוח.
ייצוא מ-Cloud Monitoring
אפשר לייצא את המדדים של מישור הבקרה של Kubernetes מ-Cloud Monitoring באמצעות Cloud Monitoring API. כל המדדים של מישור הבקרה של Kubernetes נקלטים באמצעות השירות המנוהל של Google Cloud ל-Prometheus, ולכן אפשר לשלוח שאילתות על המדדים של מישור הבקרה של Kubernetes באמצעות שפת השאילתות של Prometheus (PromQL). אפשר גם לשלוח שאילתות באמצעות שפת שאילתת מעקב (MQL).
מדדי שאילתות
כששולחים שאילתות על מדדים של מישור הבקרה של Kubernetes, השם שבו משתמשים תלוי בשאלה אם משתמשים ב-PromQL או בתכונות שמבוססות על Cloud Monitoring, כמו MQL או הממשק מבוסס התפריטים של Metrics Explorer.
בטבלאות הבאות של מדדי מישור הבקרה של Kubernetes מוצגות שתי גרסאות של כל שם מדד:
- PromQL metric name: כשמשתמשים ב-PromQL בדפי Cloud Monitoring במסוף Google Cloud או בשדות PromQL ב-Cloud Monitoring API, משתמשים בשם המדד של PromQL.
- שם המדד ב-Cloud Monitoring כשמשתמשים בתכונות אחרות של Cloud Monitoring, משתמשים בשם המדד ב-Cloud Monitoring שמופיע בטבלאות שבהמשך. השם הזה חייב לכלול את הקידומת
prometheus.googleapis.com/, שהושמטה מהרשומות בטבלה.
מדדי שרת API
בקטע הזה מופיעה רשימה של מדדי שרת ה-API ומידע נוסף על פירוש המדדים והשימוש בהם.
רשימת המדדים של שרת ה-API
כשמפעילים את המדדים של שרת ה-API, כל המדדים שמוצגים בטבלה הבאה מיוצאים ל-Cloud Monitoring באותו פרויקט שבו נמצא אשכול GKE.
לשמות של מדדי Cloud Monitoring בטבלה הזו צריך להוסיף את הקידומת prometheus.googleapis.com/. התחילית הזו הושמטה מהרשומות בטבלה.
| שם המדד ב-PromQL שלב ההשקה שם המדד ב-Cloud Monitoring |
|
|---|---|
|
סוג, סוג, יחידה
משאבים במעקב גרסת GKE נדרשת |
תיאור תוויות |
apiserver_admission_controller_admission_duration_seconds
GAapiserver_admission_controller_admission_duration_seconds/histogram
|
|
Cumulative, Distribution, s
prometheus_target 1.23.6+ |
היסטוגרמה של זמן האחזור של בקר הגישה בשניות, לפי שם, בחלוקה לכל פעולה, משאב וסוג של API (אימות או גישה).name
operation
rejected
type
|
apiserver_admission_step_admission_duration_seconds
GAapiserver_admission_step_admission_duration_seconds/histogram
|
|
Cumulative, Distribution, s
prometheus_target 1.22.13+ |
היסטוגרמה של זמן האחזור של שלב המשנה של הקבלה בשניות, בחלוקה לכל פעולה, משאב API וסוג שלב (אימות או קבלה).operation
rejected
type
|
apiserver_admission_webhook_admission_duration_seconds
GAapiserver_admission_webhook_admission_duration_seconds/histogram
|
|
Cumulative, Distribution, s
prometheus_target 1.22.13+ |
היסטוגרמה של זמן האחזור של תגובת ה-webhook לאימות, בשניות, שמזוהה לפי שם ומחולקת לכל פעולה, משאב וסוג של API (אימות או אישור).name
operation
rejected
type
|
apiserver_current_inflight_requests
GAapiserver_current_inflight_requests/gauge
|
|
Gauge, Double, 1
prometheus_target 1.22.13+ |
המספר המקסימלי של בקשות שנמצאות כרגע בטיפול ב-apiserver הזה, לפי סוג הבקשה בשנייה האחרונה.request_kind
|
apiserver_flowcontrol_current_executing_seats
בטאapiserver_flowcontrol_current_executing_seats/gauge
|
|
Gauge, Double, 1
prometheus_target 1.28.3 ואילך |
מספר המושבים התפוסים על ידי הבקשות שמתבצעות כרגע (השלב הראשוני של WATCH, כל שלב אחרת) בתת-המערכת "עדיפות והוגנות" של ה-API.flow_schema
priority_level
|
apiserver_flowcontrol_current_inqueue_requests
בטאapiserver_flowcontrol_current_inqueue_requests/gauge
|
|
Gauge, Double, 1
prometheus_target 1.28.3+ (1.25.16-gke.1360000+, 1.26.11+, 1.27.8+ for prior minor versions) |
מספר הבקשות שממתינות כרגע בתורים של תת-המערכת API Priority and Fairness.flow_schema
priority_level
|
apiserver_flowcontrol_nominal_limit_seats
בטאapiserver_flowcontrol_nominal_limit_seats/gauge
|
|
Gauge, Double, 1
prometheus_target 1.28.3 ואילך (1.26.11 ואילך, 1.27.8 ואילך לגרסאות משניות קודמות) |
מספר נומינלי של מושבי ביצוע שמוגדרים לכל רמת עדיפות.priority_level
|
apiserver_flowcontrol_priority_level_seat_utilization
בטאapiserver_flowcontrol_priority_level_seat_utilization/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.37.0-gke.3503000+ |
תצפיות, בסוף כל ננו-שנייה, על ניצול המושבים בכל שלב של הביצוע (אבל רק בשלב הראשוני של WATCHes).phase (תווית קבועה עם הערך
executing)
priority_level
|
apiserver_flowcontrol_rejected_requests_total
בטאapiserver_flowcontrol_rejected_requests_total/counter
|
|
Cumulative, Double, 1
prometheus_target 1.28.3+ (1.25.16-gke.1360000+, 1.26.11+, 1.27.8+ for prior minor versions) |
מספר הבקשות שנדחו על ידי תת-המערכת API Priority and Fairness.flow_schema
priority_level
reason
|
apiserver_flowcontrol_request_wait_duration_seconds
בטאapiserver_flowcontrol_request_wait_duration_seconds/histogram
|
|
Cumulative, Distribution, s
prometheus_target 1.28.3+ (1.25.16-gke.1360000+, 1.26.11+, 1.27.8+ for prior minor versions) |
משך הזמן שבקשה המתינה בתור.execute
flow_schema
priority_level
|
apiserver_longrunning_requests
GAapiserver_longrunning_requests/gauge
|
|
Gauge, Double, 1
prometheus_target 1.37.0-gke.3503000+ |
מדידה של כל הבקשות הפעילות ל-apiserver שפועלות לאורך זמן, בחלוקה לפי verb, group, version, resource, scope ו-component.
לא כל הבקשות נשלחות בדרך הזו.component
group
resource
scope
subresource
verb
version
|
apiserver_request_duration_seconds
GAapiserver_request_duration_seconds/histogram
|
|
Cumulative, Distribution, s
prometheus_target 1.23.6+ |
התפלגות זמן האחזור של התגובה בשניות לכל פועל, ערך הרצה ללא שינוי, קבוצה, גרסה, משאב, משאב משנה, היקף ורכיב.component
dry_run
group
resource
scope
subresource
verb
version
|
apiserver_request_total
GAapiserver_request_total/counter
|
|
Cumulative, Double, 1
prometheus_target 1.22.13+ |
מונה של בקשות apiserver שמחולקות לפי כל פועל, ערך הרצה ללא שמירה, קבוצה, גרסה, משאב, היקף, רכיב וקוד תגובת HTTP.code
component
dry_run
group
resource
scope
subresource
verb
version
|
apiserver_resource_size_estimate_bytes
בטאapiserver_resource_size_estimate_bytes/gauge
|
|
Gauge, Double, 1
prometheus_target 1.37.1-gke.2079000+ |
הגודל המשוער של האובייקטים שמאוחסנים במסד הנתונים. האומדן מבוסס על
סכום הגדלים האחרונים שנצפו של אובייקטים שעברו סריאליזציה.group
resource
|
apiserver_response_sizes
GAapiserver_response_sizes/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.22.13+ |
התפלגות גודל התגובה בבייטים לכל קבוצה, גרסה, פועל, משאב, משאב משנה, היקף ורכיב.component
group
resource
scope
subresource
verb
version
|
apiserver_storage_events_received_total
בטאapiserver_storage_events_received_total/counter
|
|
Cumulative, Int64, 1
prometheus_target 1.36.0-gke.1759000+ |
מספר אירועי ה-etcd שהתקבלו, בחלוקה לפי סוג.group
resource
|
apiserver_storage_objects
GAapiserver_storage_objects/gauge
|
|
Gauge, Double, 1
prometheus_target 1.22.13+ |
מספר האובייקטים המאוחסנים בזמן הבדיקה האחרונה, בחלוקה לפי סוג.resource
|
apiserver_storage_size_bytes
GAapiserver_storage_size_bytes/gauge
|
|
Gauge, Int64, By
prometheus_target 1.36.0-gke.1759000+ |
גודל קובץ מסד הנתונים של האחסון שהוקצה פיזית בבייטים.storage_cluster_id
|
apiserver_watch_events_sizes
בטאapiserver_watch_events_sizes/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.37.0-gke.3503000+ |
התפלגות גודל אירועי הצפייה בבייטים.group
resource
version
|
apiserver_watch_events_total
בטאapiserver_watch_events_total/counter
|
|
Cumulative, Double, 1
prometheus_target 1.37.0-gke.3503000+ |
מספר האירועים שנשלחו בלקוחות צפייה.group
resource
version
|
apiserver_watch_list_duration_seconds
בטאapiserver_watch_list_duration_seconds/histogram
|
|
Cumulative, Distribution, s
prometheus_target 1.36.0-gke.1759000+ |
התפלגות זמן האחזור של התגובה בשניות לבקשות של רשימת המעקב, לפי קבוצה, גרסה, משאב והיקף.group
resource
scope
version
|
בקטעים הבאים מוסבר בהרחבה על המדדים של שרת ה-API.
apiserver_request_duration_seconds
אפשר להשתמש במדד הזה כדי לעקוב אחרי זמן האחזור בשרת ה-API. משך הבקשה שמתועד במדד הזה כולל את כל שלבי העיבוד של הבקשה, מהרגע שהבקשה מתקבלת ועד שהשרת מסיים להגיב ללקוח. באופן ספציפי, הוא כולל את הזמן שהוקדש לפעולות הבאות:
- האימות וההרשאה של הבקשה.
- הפעלת ה-webhooks של המערכת ושל הצד השלישי שמשויכים לבקשה.
- אחזור האובייקט המבוקש ממטמון הזיכרון (לבקשות שמציינות פרמטר של כתובת URL מסוג
resourceVersion) או ממסד הנתונים של מצב האשכול שמבוסס על etcd או על Spanner, באמצעות קריאה ל-API שלetcd(לכל שאר הבקשות). - אפשר להשתמש בתוויות
group,version,resourceו-subresourceכדי לזהות באופן ייחודי בקשה איטית ולחקור אותה לעומק. - כתיבת התשובה ללקוח וקבלת התשובה מהלקוח.
למידע נוסף על השימוש במדד הזה, ראו זמן אחזור.
למדד הזה יש עוצמה גבוהה מאוד. כשמשתמשים במדד הזה, צריך להשתמש במסננים או בקיבוץ כדי למצוא מקורות ספציפיים של זמן אחזור.
apiserver_admission_controller_admission_duration_seconds
המדד הזה מודד את זמן האחזור ב-webhooks מובנים של אישורי כניסה, ולא ב-webhooks של צד שלישי. כדי לאבחן בעיות של זמן אחזור עם תגובות לפעולה מאתר אחר (webhook) של צד שלישי, משתמשים במדד apiserver_admission_webhook_admission_duration_seconds.
apiserver_admission_webhook_admission_duration_seconds וגם
apiserver_admission_step_admission_duration_seconds
המדדים האלה מודדים את זמן האחזור ב-webhook חיצוניים של צד שלישי לאימות בקשות.
המדד apiserver_admission_webhook_admission_duration_seconds הוא בדרך כלל המדד השימושי יותר. מידע נוסף על השימוש במדד הזה זמין במאמר זמן אחזור.
apiserver_request_total
המדד הזה משמש למעקב אחרי תנועת הבקשות בשרת ה-API. אפשר גם להשתמש בו כדי לקבוע את שיעורי ההצלחה והכישלון של הבקשות. מידע נוסף על השימוש במדד הזה זמין במאמר תנועה ושיעור שגיאות.
למדד הזה יש עוצמה גבוהה מאוד. כשמשתמשים במדד הזה, צריך להשתמש במסננים או בקיבוץ כדי לזהות את מקורות השגיאות.
apiserver_storage_objects
אפשר להשתמש במדד הזה כדי לזהות רוויה במערכת ודליפות אפשריות של משאבים. מידע נוסף זמין במאמר רוויה.
apiserver_current_inflight_requests
המדד הזה מתעד את המספר המקסימלי של בקשות שטופלו באופן פעיל בחלון של שנייה אחת. מידע נוסף זמין במאמר רוויה.
המדד לא כולל בקשות ארוכות כמו "watch".
מעקב אחרי שרת ה-API
המדדים של שרת ה-API יכולים לספק תובנות לגבי האותות העיקריים של תקינות המערכת:
- זמן אחזור: כמה זמן לוקח לטפל בבקשה?
- תנועה: מהו הביקוש שהמערכת חווה?
- שיעור השגיאות: באיזו תדירות הבקשות נכשלות?
- רוויה: עד כמה המערכת מלאה?
בקטע הזה מוסבר איך להשתמש במדדים של שרת ה-API כדי לעקוב אחרי התקינות של שרת ה-API.
זמן אחזור
כשיש עומס יתר על שרת ה-API, זמן האחזור של הבקשות מתארך. כדי למדוד את זמן האחזור של הבקשות לשרת ה-API, משתמשים במדד apiserver_request_duration_seconds. כדי לזהות את מקור זמן האחזור באופן ספציפי יותר, אפשר לקבץ את המדדים לפי התווית verb או resource.
הגבול העליון המומלץ לקריאה למשאב יחיד כמו GET, POST או PATCH הוא שנייה אחת. הגבול העליון המומלץ לקריאות LIST ברמת מרחב השמות וברמת האשכול הוא 30 שניות. הציפיות לגבול העליון נקבעות על ידי יעדי SLO שמוגדרים על ידי קהילת הקוד הפתוח של Kubernetes. למידע נוסף, קראו את פרטי ה-SLI/SLO של זמן האחזור של קריאות ל-API.
אם הערך של המדד apiserver_request_duration_seconds עולה מעבר למשך הזמן הצפוי, כדאי לבדוק את הסיבות האפשריות הבאות:
- יכול להיות שמישור הבקרה של Kubernetes עמוס מדי. כדי לבדוק, אפשר לעיין במדדים
apiserver_request_totalו-apiserver_storage_objects.- אפשר להשתמש בתווית
codeכדי לבדוק אם הבקשות מעובדות בהצלחה. למידע על הערכים האפשריים, קראו את המאמר קודי סטטוס של HTTP. - כדי לזהות בקשה באופן ייחודי, משתמשים בתוויות
group,version,resourceו-subresource.
- אפשר להשתמש בתווית
webhook של צד שלישי לאישור בקשות איטי או לא מגיב. אם הערך של המדד
apiserver_admission_webhook_admission_duration_secondsעולה, סימן שחלק מה-webhooks של צד שלישי או שהוגדרו על ידי המשתמשים איטיים או לא מגיבים. זמן אחזור ב-webhook של קבלה יכול לגרום לעיכובים בתזמון המשימות.כדי לשלוח שאילתה על זמן האחזור של ה-webhook באחוזון ה-99 לכל מכונה של מישור הבקרה של Kubernetes, משתמשים בשאילתת PromQL הבאה:
sum by (instance) (histogram_quantile(0.99, rate(apiserver_admission_webhook_admission_duration_seconds_bucket{cluster="CLUSTER_NAME"}[1m])))מומלץ גם לבדוק את האחוזונים ה-50, ה-90, ה-95 וה-99.9. אפשר לשנות את השאילתה הזו על ידי שינוי הערך של
0.99.ל-webhooks חיצוניים יש מגבלת זמן קצוב לתפוגה של כ-10 שניות. אתם יכולים להגדיר כללי מדיניות התראה במדד
apiserver_admission_webhook_admission_duration_secondsכדי לקבל התראה כשאתם מתקרבים לזמן הקצוב לתפוגה של ה-webhook.אפשר גם לקבץ את המדד
apiserver_admission_webhook_admission_duration_secondsלפי התוויתnameכדי לאבחן בעיות אפשריות ב-webhooks ספציפיים.
אתם מציגים הרבה אובייקטים. זמן האחזור של קריאות LIST צפוי לעלות ככל שמספר האובייקטים מסוג מסוים (גודל התגובה) עולה.
בעיות בצד הלקוח:
- יכול להיות שללקוח אין מספיק משאבים כדי לקבל תשובות בזמן. כדי לבדוק את זה, צריך להסתכל על מדדי השימוש ב-CPU של pod הלקוח.
- החיבור של הלקוח לרשת איטי. זה יכול לקרות כשהלקוח פועל במכשיר כמו טלפון נייד, אבל זה לא סביר ללקוחות שפועלים ברשת של Compute Engine.
- הלקוח יצא באופן לא צפוי, אבל לחיבור ה-TCP יש תקופת זמן קצובה של עשרות שניות. לפני שהזמן הקצוב לתפוגה של החיבור מסתיים, המשאבים של השרת נחסמים, מה שיכול להגדיל את זמן האחזור.
מידע נוסף זמין במאמר שיטות מומלצות לשימוש ב-API Priority and Fairness במסמכי התיעוד של Kubernetes.
תנועה ושיעור שגיאות
כדי למדוד את התנועה ואת מספר הבקשות שבוצעו בהצלחה והבקשות שנכשלו בשרת ה-API, משתמשים במדד apiserver_request_total. לדוגמה, כדי למדוד את התנועה בשרת ה-API לכל מכונה של מישור הבקרה של Kubernetes, משתמשים בשאילתת PromQL הבאה:
sum by (instance) (increase(apiserver_request_total{cluster="CLUSTER_NAME"}[1m]))
כדי לשלוח שאילתה על הבקשות שנכשלו, מסננים את התווית
codeלפי ערכי 4xx ו-5xx באמצעות השאילתה הבאה ב-PromQL:sum(rate(apiserver_request_total{code=~"[45].."}[5m]))כדי לשלוח שאילתה על הבקשות שהצליחו, מסננים את התווית
codeלפי ערכי 2xx באמצעות השאילתה הבאה ב-PromQL:sum(rate(apiserver_request_total{code=~"2.."}[5m]))כדי לשלוח שאילתה על הבקשות שנדחו על ידי שרת ה-API לכל מכונה של מישור הבקרה של Kubernetes, מסננים את התווית
codeלפי הערך 429 (http.StatusTooManyRequests) באמצעות השאילתה הבאה ב-PromQL:sum by (instance) (increase(apiserver_request_total{cluster="CLUSTER_NAME", code="429"}[1m]))
רוויה
כדי למדוד את הרוויה במערכת, אפשר להשתמש במדדים apiserver_current_inflight_requests ו-apiserver_storage_objects .
אם הערך של המדד apiserver_storage_objects
עולה, יכול להיות שיש בעיה בבקר בהתאמה אישית שיוצר אובייקטים אבל לא מוחק אותם. אתם יכולים לסנן או לקבץ את המדד לפי התווית resource כדי לזהות את המשאב שבו חלה העלייה.
צריך להעריך את המדד apiserver_current_inflight_requests בהתאם להגדרות של API Priority and Fairness. ההגדרות האלה משפיעות על סדר העדיפויות של הבקשות, ולכן אי אפשר להסיק מסקנות רק על סמך ערכי המדדים. מידע נוסף זמין במאמר עדיפות והוגנות של API.
מדדי תזמון
בקטע הזה מופיעה רשימה של מדדי המתזמן ומידע נוסף על פירוש המדדים והשימוש בהם.
רשימת המדדים של התזמון
כשמפעילים את מדדי המתזמן, כל המדדים שמוצגים בטבלה הבאה מיוצאים ל-Cloud Monitoring באותו פרויקט של אשכול GKE.
לשמות של מדדי Cloud Monitoring בטבלה הזו צריך להוסיף את הקידומת prometheus.googleapis.com/. התחילית הזו הושמטה מהרשומות בטבלה.
| שם המדד ב-PromQL שלב ההשקה שם המדד ב-Cloud Monitoring |
|
|---|---|
|
סוג, סוג, יחידה
משאבים במעקב גרסת GKE נדרשת |
תיאור תוויות |
kube_pod_resource_limit
GAkube_pod_resource_limit/gauge
|
|
Gauge, Double, 1
prometheus_target 1.31.1-gke.1621000+ |
מגבלת המשאבים לעומסי עבודה באשכול, בחלוקה לפי pod.
כאן מוצג השימוש במשאבים שהמתזמן וה-kubelet מצפים לו לכל pod, יחד עם יחידת המשאב, אם יש כזו.namespace
node
pod
priority
resource
scheduler
unit
|
kube_pod_resource_request
GAkube_pod_resource_request/gauge
|
|
Gauge, Double, 1
prometheus_target 1.31.1-gke.1621000+ |
הקצאות המשאבים שעומסי העבודה באשכול ביקשו, בחלוקה לפי Pod.
כאן מוצג השימוש במשאבים שהמתזמן וה-kubelet מצפים לו לכל pod, יחד עם יחידת המשאב, אם יש כזו.namespace
node
pod
priority
resource
scheduler
unit
|
scheduler_pending_pods
GAscheduler_pending_pods/gauge
|
|
Gauge, Double, 1
prometheus_target 1.22.13+ |
מספר הפודים בהמתנה, לפי סוג התור. "active" מייצג את מספר הפודים ב-activeQ, "backoff" מייצג את מספר הפודים ב-backoffQ ו-"unschedulable" מייצג את מספר הפודים ב-unschedulablePods.queue
|
scheduler_pod_scheduling_duration_seconds
הוצא משימושscheduler_pod_scheduling_duration_seconds/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.25.1 עד 1.29 (1.22.17-gke.3100+, 1.23.11+ ו-1.24.5+ לגרסאות משניות קודמות) |
[הוצא משימוש בגרסה 1.29; הוסר בגרסה 1.30 והוחלף על ידי
scheduler_pod_scheduling_sli_duration_seconds.]
זמן אחזור מקצה לקצה (E2E) של pod שמתוזמן, שעשוי לכלול כמה ניסיונות תזמון.attempts
|
scheduler_pod_scheduling_sli_duration_seconds
בטאscheduler_pod_scheduling_sli_duration_seconds/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.30 ואילך |
זמן האחזור מקצה לקצה של pod שנוסף לתזמון, מהרגע שה-pod נכנס לתור התזמון, ויכול להיות שיהיו כמה ניסיונות תזמון.attempts
|
scheduler_preemption_attempts_total
GAscheduler_preemption_attempts_total/counter
|
|
Cumulative, Double, 1
prometheus_target 1.22.13+ |
מספר ניסיונות ההפקעה הכולל באשכול עד עכשיו |
scheduler_preemption_victims
GAscheduler_preemption_victims/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.22.13+ |
מספר המכונות שנבחרו להפקעה |
scheduler_scheduling_attempt_duration_seconds
GAscheduler_scheduling_attempt_duration_seconds/histogram
|
|
Cumulative, Distribution, 1
prometheus_target 1.23.6+ |
זמן האחזור של ניסיון התזמון בשניות (אלגוריתם תזמון + קישור).profile
result
|
scheduler_schedule_attempts_total
GAscheduler_schedule_attempts_total/counter
|
|
Cumulative, Double, 1
prometheus_target 1.22.13+ |
מספר הניסיונות לתזמן Pods, לפי התוצאה. 'unschedulable' פירושו שלא ניתן היה לתזמן pod, ו-'error' פירושו בעיה פנימית בתזמון.profile
result
|
בקטעים הבאים מוסבר בהרחבה על המדדים של שרת ה-API.
scheduler_pending_pods
אפשר להשתמש במדד scheduler_pending_pods כדי לעקוב אחרי העומס על המתזמן. ערכים גבוהים במדד הזה יכולים להצביע על בעיות במשאבים. למתזמן יש שלושה תורים, והמדד הזה מדווח על מספר הבקשות הממתינות לפי תור. אלה התורים שנתמכים:
-
activeבתור- קבוצת הפודים שהמתזמן מנסה לתזמן. הפוד עם העדיפות הגבוהה ביותר נמצא בראש התור.
-
backoffבתור- קבוצת הפודים לא הייתה ניתנת לתזמון בפעם האחרונה שהמתזמן ניסה, אבל יכול להיות שהיא תהיה ניתנת לתזמון בפעם הבאה.
- פודים בתור הזה צריכים להמתין לתקופת השהיה (עד 10 שניות), ואז הם מועברים בחזרה לתור
activeלניסיון תזמון נוסף. למידע נוסף על ניהול התור שלbackoff, קראו את בקשת ההטמעה Kubernetes issue 75417.
הוגדרה מגבלת זמן אחת (
unschedulable)קבוצת ה-Pods שה-Scheduler ניסה להקצות, אבל נקבע שהם Unschedulable. הצבה בתור הזה עשויה להצביע על בעיות מוכנות או תאימות של הצמתים או של ההגדרות של בוררי הצמתים.
כשאילוצי משאבים מונעים תזמון של Pods, הם לא כפופים לטיפול בהשהיה לפני ניסיון חוזר. במקום זאת, כשאשכול מלא, לא ניתן לתזמן Pods חדשים והם מועברים לתור
unscheduled.אם יש פודים שלא תזמנתם, יכול להיות שאין לכם מספיק משאבים או שיש בעיה בהגדרת הצומת. ה-Pods מועברים לתור
backoffאו לתורactiveאחרי אירועים שמשנים את מצב האשכול. פודים בתור הזה מציינים שלא השתנה שום דבר באשכול שיאפשר לתזמן את הפודים.Affinities מגדירים כללים להקצאת Pods לצמתים. השימוש בכללי זיקה או אי-זיקה יכול להיות סיבה לעלייה במספר הפודים שלא תזמנו.
אירועים מסוימים, למשל PVC/Service ADD/UPDATE, סיום של pod או רישום של צמתים חדשים, מעבירים חלק מה-pods שלא תוזמנו או את כולם לתור
backoffאו לתורactive. מידע נוסף זמין בבעיה 81214 ב-Kubernetes.
למידע נוסף, ראו זמן האחזור של Scheduler ובעיות במשאבים.
scheduler_scheduling_attempt_duration_seconds
המדד הזה מודד את משך הזמן של ניסיון תזמון יחיד בתוך ה-Scheduler עצמו, והוא מחולק לפי התוצאה: מתוזמן, Unschedulable או שגיאה. משך הזמן נמדד מהרגע שהמתזמן בוחר pod ועד שהמתזמן מאתר צומת וממקם את ה-pod בצומת, קובע שלא ניתן לתזמן את ה-pod או נתקל בשגיאה. משך התזמון כולל את הזמן של תהליך התזמון וגם את זמן הקישור. קישור הוא התהליך שבו המתזמן מעביר את הקצאת הצומת שלו לשרת ה-API. מידע נוסף זמין במאמר זמן האחזור של Scheduler.
המדד הזה לא כולל את הזמן שה-pod נמצא בבקרת קבלה או באימות.
למידע נוסף על תזמון, ראו תזמון Pod.
scheduler_schedule_attempts_total
המדד הזה מודד את מספר ניסיונות התזמון. כל ניסיון לתזמן pod מגדיל את הערך. אתם יכולים להשתמש במדד הזה כדי לקבוע אם המתזמן זמין: אם הערך עולה, המתזמן פועל. אפשר להשתמש בתווית result כדי לקבוע את ההצלחה. הפודים הם scheduled או unschedulable.
המדד הזה קשור מאוד למדד scheduler_pending_pods: כשיש הרבה Pods בהמתנה, צפוי שיהיו הרבה ניסיונות לתזמן את ה-Pods. מידע נוסף מופיע במאמר בעיות במשאבים.
המדד הזה לא עולה אם למתזמן אין פודים לתזמון, וזה יכול לקרות אם יש לכם מתזמן משני בהתאמה אישית.
scheduler_preemption_attempts_total וגם scheduler_preemptions_victims
אתם יכולים להשתמש במדדי ההפקעה כדי להחליט אם צריך להוסיף משאבים.
יכול להיות שיש לכם פודים בעדיפות גבוהה יותר שאי אפשר לתזמן כי אין להם מקום. במקרה כזה, המתזמן מפנה משאבים על ידי הפקעת pod אחד או יותר שפועלים בצומת. המדד scheduler_preemption_attempts_total עוקב אחרי מספר הפעמים שהמתזמן ניסה להפקיע pod.
המדד scheduler_preemptions_victims סופר את הפודים שנבחרו להפקעה.
מספר ניסיונות ההפקעה קשור באופן הדוק לערך של המדד scheduler_schedule_attempts_total כשהערך של התווית result הוא unschedulable.
שני הערכים לא שווים: לדוגמה, אם באשכול יש 0 צמתים, אין ניסיונות להפקעת משאבים, אבל יכול להיות שיהיו ניסיונות תזמון שייכשלו.
מידע נוסף זמין במאמר בעיות במשאבים.
מעקב אחרי המתזמן
המדדים של המתזמן יכולים לספק תובנות לגבי הביצועים של המתזמן:
- זמן האחזור של המתזמן: האם המתזמן פועל? כמה זמן לוקח לתזמן Pods?
- בעיות במשאבים: האם הניסיונות לתזמן Pods נתקלים במגבלות של משאבים?
בקטע הזה מוסבר איך להשתמש במדד של המתזמן כדי לעקוב אחריו.
זמן האחזור של המתזמן
המשימה של המתזמן היא לוודא שה-pods פועלים, ולכן חשוב לדעת אם המתזמן נתקע או פועל לאט.
- כדי לוודא שהמתזמן פועל ומתזמן Pods, משתמשים במדד
scheduler_schedule_attempts_total. אם המתזמן פועל לאט, כדאי לבדוק את הסיבות האפשריות הבאות:
מספר ה-Pod-ים בהמתנה גדל. כדי לעקוב אחרי מספר הפודים בהמתנה, משתמשים במדד
scheduler_pending_pods. השאילתה הבאה ב-PromQL מחזירה את מספר הפודים בהמתנה לכל תור באשכול:sum by (queue) (delta(scheduler_pending_pods{cluster="CLUSTER_NAME"}[2m]))ניסיונות בודדים לתזמן פודים מתבצעים באיטיות. כדי לעקוב אחרי זמן האחזור של ניסיונות התזמון, אפשר להשתמש במדד
scheduler_scheduling_attempt_duration_seconds.מומלץ לבחון את המדד הזה לפחות באחוזונים ה-50 וה-95. השאילתה הבאה ב-PromQL מאחזרת ערכים של האחוזון ה-95, אבל אפשר לשנות אותה:
sum by (instance) (histogram_quantile(0.95, rate( scheduler_scheduling_attempt_duration_seconds_bucket{cluster="CLUSTER_NAME"}[5m])))
בעיות במשאבים
המדדים של המתזמן יכולים גם לעזור לכם להעריך אם יש לכם מספיק משאבים. אם הערך של המדד scheduler_preemption_attempts_total עולה, בודקים את הערך של scheduler_preemption_victims באמצעות השאילתה הבאה ב-PromQL:
scheduler_preemption_victims_sum{cluster="CLUSTER_NAME"}
מספר ניסיונות ההפקעה ומספר הפודים המופקעים גדלים כשיש פודים בעדיפות גבוהה יותר לתזמון. המדדים של פינוי המקום לא מציינים אם ה-pods בעדיפות גבוהה שהפעילו את פינוי המקום תזמנו, לכן כשאתם רואים עלייה בערך של מדדי פינוי המקום, אתם יכולים גם לעקוב אחרי הערך של המדד scheduler_pending_pods. אם גם מספר הפודים בהמתנה גדל, יכול להיות שאין לכם מספיק משאבים כדי לטפל בפודים בעלי עדיפות גבוהה יותר. יכול להיות שתצטרכו להגדיל את המשאבים הזמינים, ליצור פודים חדשים עם פחות דרישות למשאבים או לשנות את בורר הצמתים.
אם מספר הקורבנות של ההפקעה לא עולה, סימן שלא נשארו פודים עם עדיפות נמוכה שאפשר להסיר. במקרה כזה, כדאי להוסיף עוד צמתים כדי שאפשר יהיה להקצות את הפודים החדשים.
אם מספר הקורבנות של ההפקעה גדל, סימן שיש פודים בעדיפות גבוהה יותר שממתינים לתזמון, ולכן המתזמן מפקיע חלק מהפודים שפועלים. המדדים של ההפקעה לא מציינים אם הפודים בעדיפות הגבוהה יותר תזומנו בהצלחה.
כדי לבדוק אם הפודים בעדיפות גבוהה יותר מתוזמנים, חפשו ערכים יורדים במדד
scheduler_pending_pods. אם הערך של המדד הזה עולה, יכול להיות שצריך להוסיף עוד צמתים.
יכול להיות שתראו עליות זמניות בערכים של המדד scheduler_pending_pods כשעומסי העבודה מתוזמנים באשכול, למשל במהלך אירועים כמו עדכונים או שינוי קנה מידה.
אם יש לכם מספיק משאבים באשכול, העליות החדות האלה זמניות.
אם מספר הפודים בהמתנה לא יורד, מבצעים את הפעולות הבאות:
- מוודאים שהצמתים לא מבודדים. צמתים מבודדים לא מקבלים פודים חדשים.
- בודקים את הוראות התזמון הבאות, שיכול להיות שהוגדרו באופן שגוי ומונעות את התזמון של pod:
- בורר וקרבה של צומת.
- דחיות (taints) וטולרנטיות.
- אילוצים של פריסת טופולוגיית Pod.
אם אי אפשר לתזמן Pods בגלל מחסור במשאבים, כדאי לפנות חלק מהצמתים הקיימים או להגדיל את מספר הצמתים.
מדדים של Controller Manager
כשמפעילים את המדדים של מנהל הבקר, כל המדדים שמוצגים בטבלה הבאה מיוצאים ל-Cloud Monitoring באותו פרויקט של אשכול GKE.
לשמות של מדדי Cloud Monitoring בטבלה הזו צריך להוסיף את הקידומת prometheus.googleapis.com/. התחילית הזו הושמטה מהרשומות בטבלה.
| שם המדד ב-PromQL שלב ההשקה שם המדד ב-Cloud Monitoring |
|
|---|---|
|
סוג, סוג, יחידה
משאבים במעקב גרסת GKE נדרשת |
תיאור תוויות |
node_collector_evictions_total
GAnode_collector_evictions_total/counter
|
|
Cumulative, Double, 1
prometheus_target 1.24+ |
מספר פינויי הצמתים שהתרחשו מאז שהמופע הנוכחי של NodeController התחיל.zone
|