במאמר הזה נסביר לאופרטורים איך להגדיר את השירות המנוהל של Google Cloud ל-Prometheus כדי לסנן ולאסוף מדדי Kubernetes ספציפיים מאשכולות ומעומסי עבודה של Google Kubernetes Engine (GKE).
כדאי להכיר את הנושאים הבאים:
איסוף מדדים ב-GKE
רכיבי מערכת באשכולות GKE פולטים ומציגים מדדים של Prometheus. כברירת מחדל, כל האשכולות קולטים מדדי מערכת שספציפיים ל-GKE. יש חבילות מדדים מובנות נוספות שאפשר להשתמש בהן כדי להטמיע אוספים של מדדים שנאספו לרכיבים שונים.
בנוסף לחבילות המדדים המובנות של GKE, אפשר להגדיר באופן ידני את השירות המנוהל של Google Cloud ל-Prometheus כדי להטמיע מדדים ספציפיים של Prometheus. ההגדרה האישית הזו מתאימה לתרחישי שימוש כמו:
- מעקב אחרי אותות ספציפיים באשכול ובעומסי העבודה.
- כדי לצמצם את העלויות, אתם יכולים להשבית חבילות של מדדים שאתם לא צריכים ולהטמיע רק קבוצת משנה של מדדים.
- איסוף מדדים שמופקים על ידי רכיבים אבל לא נכללים בחבילת מדדים.
למפעילים, מדדי הצומת, שמופקים על ידי תהליך kubelet בכל צומת, עשויים להיות שימושיים למעקב אחרי עומסי עבודה וצמתים כדי לזהות אותות ספציפיים.
משאבים מותאמים אישית לאיסוף מדדים
כדי לסנן ולהטמיע מדד ספציפי, מגדירים כללי תיוג מחדש של Prometheus באחד מהמשאבים המותאמים אישית הבאים:
-
PodMonitoring: הגדרת איסוף מדדים מ-Pods במרחב שמות ספציפי. -
ClusterPodMonitoring: הגדרת איסוף מדדים מ-Pods בכל מרחב שמות. -
ClusterNodeMonitoring: הגדרה של איסוף מדדים מרכיבי צמתים כמוkubeletו-cAdvisor.
העתקה של מדד
אם אתם מסננים לפי מדד שנכלל גם בחבילת מדדים פעילה של אשכול, המדד מופיע כמה פעמים בשירות המנוהל של Google Cloud ל-Prometheus. לדוגמה, אם חבילת המדדים KUBELET מופעלת באשכול שלכם ואתם מגדירים את איסוף המדד kubelet_running_containers, יוצגו לכם ערכים כפולים.
כדי להימנע מכפילויות, צריך לוודא שהמדדים שאתם אוספים לא נכללים באף אחת מחבילות המדדים הפעילות. מידע נוסף על המדדים הכלולים זמין בחבילות המדדים הבאות:
- מדדי מערכת של GKE
- מדדים של מישור הבקרה
- מדדים של מצב אובייקט Kubernetes
- cAdvisor ומדדי
kubelet - מדדים של NVIDIA DCGM
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-Google Cloud CLI למשימה הזו, מתקינים ואז מאתחלים את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם את ההרשאות שנדרשות כדי לבצע את הפעולות שמתוארות במסמך הזה.
- משתמשים באשכול GKE קיים או יוצרים אשכול חדש.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות בשביל לאסוף מדדים ולהציג אותם, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
יצירת משאבים ב-Kubernetes באשכול: מפתח Kubernetes Engine (
roles/container.developer) -
הצגת מדדים ב-Monitoring:
Monitoring Viewer (
roles/monitoring.viewer)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
הפעלת השירות המנוהל של Google Cloud ל-Prometheus
השירות המנוהל של Google Cloud ל-Prometheus מופעל כברירת מחדל בכל אשכולות GKE, ואי אפשר להשבית אותו באשכולות Autopilot. אם אתם משתמשים באשכול Autopilot, דלגו לקטע הגדרת איסוף המדדים.
כדי לוודא שהשירות המנוהל של Google Cloud ל-Prometheus מופעל באשכול Standard, בוחרים באחת מהאפשרויות הבאות:
המסוף
נכנסים לדף Kubernetes clusters במסוף Google Cloud .
בשורה של האשכול שרוצים לבדוק, לוחצים על פעולות > עריכה. נפתח הדף Cluster details.
בקטע תכונות, בודקים את הערך בשדה שירות מנוהל ל-Prometheus. אם הערך הוא Enabled, אפשר לדלג אל הקטע הגדרת איסוף מדדים. אם הערך הוא Disabled, צריך להפעיל את השירות המנוהל של Google Cloud ל-Prometheus:
- לוחצים על עריכת השירות המנוהל ל-Prometheus. תיפתח תיבת הדו-שיח Edit Managed Service for Prometheus.
- מסמנים את התיבה Enable Managed Service for Prometheus.
- לוחצים על שמירת השינויים.
gcloud
בודקים אם השירות המנוהל של Google Cloud ל-Prometheus מופעל באשכול:
gcloud container clusters describe CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--format='value(monitoringConfig.managedPrometheusConfig.enabled)'
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של אשכול Standard. -
CONTROL_PLANE_LOCATION: האזור או התחום של מישור הבקרה של האשכול, למשלus-central1אוus-central1-a.
אם הפלט הוא True, השירות המנוהל של Google Cloud ל-Prometheus מופעל.
אם הפלט הוא False, צריך להפעיל את השירות המנוהל של Google Cloud ל-Prometheus:
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-managed-prometheus
הגדרת איסוף מדדים
כדי להגדיר את השירות המנוהל של Google Cloud ל-Prometheus כך שיקלוט מדד ספציפי, אתם צריכים את הפרטים הבאים על המדד:
- שם המדד, למשל
kubelet_working_pods. - נקודת הקצה (endpoint) שחושפת את המדד, כמו
/metrics/cadvisorאו/metrics.
כדי למצוא מדדים ולהגדיר איסוף, פועלים לפי השלבים הבאים:
מחפשים מדד במאמרי העזרה של הרכיב הספציפי. לדוגמה, אפשר להשתמש במקורות המידע הבאים כדי למצוא מדד של צומת:
בודקים את חבילות המדדים הפעילות באשכול:
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --flatten=monitoringConfig.componentConfig \ --format='value(enableComponents)'הפלט אמור להיראות כך:
SYSTEM_COMPONENTS;STORAGE;POD;DEPLOYMENT;STATEFULSET;DAEMONSET;HPA;JOBSET;CADVISOR;KUBELET;DCGMכדי לבדוק אם המדד שרוצים לאסוף נמצא באחד מהחבילות הפעילות האלה, אפשר להשתמש במידע שבקטע מדדים זמינים. אם המדד שלכם כלול בחבילת מדדים פעילה, יכול להיות שיופיעו מדדים כפולים בכרטיסייה 'מעקב'. אם המדד לא נמצא בחבילת מדדים פעילה, ממשיכים לשלב הבא.
אופציונלי: כדי לוודא שהמדד זמין בנקודת הקצה של המדדים, מריצים שאילתה בנקודת הקצה באמצעות הפקודה
kubectl get --raw. לדוגמה, הפקודה הבאה שולחת שאילתה לנקודת הקצה/metricsלגבי המדדkubelet_working_pods:kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/metrics" | grep "kubelet_working_pods"מחליפים את
NODE_NAMEבשם הצומת שרוצים לשלוח אליו שאילתה.הפלט אמור להיראות כך, מה שאומר שהמדד זמין:
# HELP kubelet_working_pods [ALPHA] Number of pods the kubelet is actually running, broken down by lifecycle phase, whether the pod is desired, orphaned, or runtime only (also orphaned), and whether the pod is static. An orphaned pod has been removed from local configuration or force deleted in the API and consumes resources that are not otherwise visible. # TYPE kubelet_working_pods gauge kubelet_working_pods{config="desired",lifecycle="sync",static=""} 8 kubelet_working_pods{config="desired",lifecycle="sync",static="true"} 1 kubelet_working_pods{config="desired",lifecycle="terminated",static=""} 0 kubelet_working_pods{config="desired",lifecycle="terminated",static="true"} 0 kubelet_working_pods{config="desired",lifecycle="terminating",static=""} 0 kubelet_working_pods{config="desired",lifecycle="terminating",static="true"} 0אחרי שמזהים את המדד שרוצים לאסוף, משתמשים בכלל של Prometheus לשינוי תוויות במשאב מותאם אישית מסוג PodMonitoring, ClusterPodMonitoring או ClusterNodeMonitoring כדי לסנן את המדד הזה. המשאב המותאם אישית שבו משתמשים תלוי במאפיינים של המדד, כפי שמתואר בקטע משאבים מותאמים אישית לאיסוף מדדים.
לדוגמה, במניפסט ClusterNodeMonitoring הבא:
apiVersion: monitoring.googleapis.com/v1 kind: ClusterNodeMonitoring metadata: name: kubelet-pod-counts spec: selector: matchLabels: {} endpoints: - path: "/metrics" scheme: "https" interval: "30s" tls: insecureSkipVerify: true # metricRelabeling specifies the metrics to ingest. The metrics must be # available at the specified endpoint. metricRelabeling: - action: keep sourceLabels: [__name__] regex: kubelet_(active|working)_podsלמניפסט הזה יש את המאפיינים הבאים:
- השדה
selector.matchLabelsהוא קבוצה ריקה ({}), שתואמת לכל הצמתים. - השדה
endpoints.pathמזהה את נקודת הקצה של המדדים שצריך לגרד. - בשדה
metricRelabelingמציינים את המדדים הספציפיים שרוצים לאסוף. בדוגמה הזו, השירות המנוהל של Google Cloud ל-Prometheus אוסף מהנקודת הקצה מדדים עם השמותkubelet_active_podsו-kubelet_working_pods.
- השדה
כשפורסים את המשאב המותאם אישית, השירות המנוהל של Google Cloud ל-Prometheus קולט מדדים שתואמים להגדרה שציינתם. אפשר לראות את המדדים האלה ולשאול עליהם שאילתות באותן שיטות שבהן משתמשים למדדים אחרים, כמו Cloud Monitoring.
אימות של איסוף המדדים באמצעות מדד לדוגמה
בשלבים הבאים מוסבר איך להגדיר את השירות המנוהל של Google Cloud ל-Prometheus כדי לאסוף את המדד kubelet_runtime_operations_errors_total מ-kubelet.
בשלבים לדוגמה האלה, מוודאים שהמדד לא נאסף כרגע, יוצרים ClusterNodeMonitoring (כי kubelet הוא רכיב צומת), ואז מוודאים שהמדד מופיע ב-Monitoring.
מוודאים שהמדד
kubelet_runtime_operations_errors_totalלא מופיע כבר בדף 'מעקב':נכנסים לדף Metrics explorer במסוף Google Cloud .
בקטע Queries, בשדה Metric, נסו לבחור את המדד
prometheus/kubelet_runtime_operations_errors_total/counter. אם לא מופיעה תוצאת חיפוש, סימן שלא מתבצע איסוף של המדד.
כדי לסנן את המדד
kubelet_runtime_operations_errors_total, יוצרים ClusterNodeMonitoring:שומרים את המניפסט הבא של ClusterNodeMonitoring בתור
kubelet-runtime-errors-collector.yaml:apiVersion: monitoring.googleapis.com/v1 kind: ClusterNodeMonitoring metadata: name: kubelet-runtime-errors-collector spec: selector: matchLabels: {} endpoints: - path: /metrics scheme: https interval: 30s tls: insecureSkipVerify: true metricRelabeling: - action: keep sourceLabels: [__name__] regex: kubelet_runtime_operations_errors_totalיוצרים את ClusterNodeMonitoring:
kubectl apply -f kubelet-runtime-errors-collector.yaml
יכול להיות שיחלפו עד 10 דקות עד שהמדד יופיע בדף 'מעקב'.
במסוף Google Cloud , מוודאים שהמדד מופיע ב-Monitoring:
עוברים לדף Metrics Explorer.
בקטע Queries, בשדה Metric, בוחרים במדד
prometheus/kubelet_runtime_operations_errors_total/counter.אופציונלי: בתפריט הנפתח Filter (סינון), בוחרים את האשכול.
בקטע תוצאות מוצג תרשים עם המדד שנאסף.
המאמרים הבאים
- עיון בחבילות המדדים הזמינות ב-GKE
- הגדרת מעקב אוטומטי אחרי אפליקציות לעומסי עבודה
- יצירה וניהול של לוחות בקרה מותאמים אישית של Monitoring