הפעלת השירות המנוהל של Google Cloud ל-Prometheus
ההגדרות של השירות המנוהל של Google Cloud ל-Prometheus מצוינות באובייקט Stackdriver שנקרא stackdriver. למידע נוסף, כולל שיטות מומלצות ופתרון בעיות, קראו את המסמכים של השירות המנוהל של Google Cloud ל-Prometheus.
פותחים את האובייקט
stackdriverלעריכה:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriverמחליפים את USER_CLUSTER_KUBECONFIG בנתיב של קובץ ה-kubeconfig של אשכול המשתמש.
בקטע
spec, מגדירים אתenableGMPForApplicationsלערךtrue:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableGMPForApplications: true enableVPC: ... optimizedMetrics: trueשומרים וסוגרים את הקובץ הערוך. רכיבי Prometheus שמנוהלים על ידי Google מופעלים באופן אוטומטי באשכול במרחב השמות
gmp-system.בודקים את הרכיבים:
kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace gmp-system get podsהפלט של הפקודה הזו אמור להיראות כך:
NAME READY STATUS RESTARTS AGE collector-abcde 2/2 Running 1 (5d18h ago) 5d18h collector-fghij 2/2 Running 1 (5d18h ago) 5d18h collector-klmno 2/2 Running 1 (5d18h ago) 5d18h gmp-operator-68d49656fc-abcde 1/1 Running 0 5d18h rule-evaluator-7c686485fc-fghij 2/2 Running 1 (5d18h ago) 5d18h
השירות המנוהל של Google Cloud ל-Prometheus תומך בהערכת כללים ובהתראות. כדי להגדיר הערכת כללים, קראו את המאמר הערכת כללים.
הרצת אפליקציה לדוגמה
בקטע הזה תיצרו אפליקציה שפולטת מדדי Prometheus, ותשתמשו בשירות המנוהל של Google Cloud ל-Prometheus כדי לאסוף את המדדים. מידע נוסף זמין במאמר השירות המנוהל של Google Cloud ל-Prometheus.
פריסת האפליקציה לדוגמה
כדי לפרוס את האפליקציה:
יוצרים את מרחב השמות
gmp-testלמשאבים שיוצרים כחלק מאפליקציית הדוגמה:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG create ns gmp-testהשירות המנוהל מספק מניפסט לאפליקציה לדוגמה שפולטת מדדי Prometheus ביציאה
metrics. האפליקציה משתמשת בשלוש רפליקות.כדי לפרוס את האפליקציה לדוגמה, מריצים את הפקודה הבאה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n gmp-test apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/example-app.yaml
הגדרת משאב PodMonitoring
מגדירים משאב בהתאמה אישית של PodMonitoring כדי לתעד את נתוני המדדים שנשלחים מאפליקציית הדוגמה, ולשלוח אותם לשירות המנוהל של Google Cloud ל-Prometheus. המשאב המותאם אישית PodMonitoring משתמש בגירוד נתונים (scraping) של יעדים. במקרה הזה, סוכני האיסוף מגרדים את נקודת הקצה (endpoint) /metrics שאליה אפליקציית הדוגמה פולטת נתונים.
משאב בהתאמה אישית מסוג PodMonitoring אוסף נתונים רק מיעדים במרחב השמות שבו הוא נפרס. כדי לאסוף יעדים בכמה מרחבי שמות, צריך לפרוס את אותו משאב מותאם אישית של PodMonitoring בכל מרחב שמות. כדי לוודא שהמשאב PodMonitoring מותקן במרחב השמות הרצוי, מריצים את הפקודה הבאה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get podmonitoring -A
במאמרי העזרה של prometheus-engine/doc/api תוכלו למצוא מידע על כל המשאבים המותאמים אישית של השירות המנוהל של Google Cloud ל-Prometheus.
המניפסט הבא מגדיר משאב PodMonitoring, prom-example, במרחב השמות gmp-test. המשאב מוצא את כל הפודים במרחב השמות עם התווית app והערך prom-example. ה-Pods התואמים נסרקים ביציאה בשם metrics, כל 30 שניות, בנתיב ה-HTTP /metrics.
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
name: prom-example
spec:
selector:
matchLabels:
app: prom-example
endpoints:
- port: metrics
interval: 30s
כדי להחיל את המשאב הזה, מריצים את הפקודה הבאה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n gmp-test apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/pod-monitoring.yaml
השירות המנוהל של Google Cloud ל-Prometheus אוסף עכשיו את הנתונים מה-Pods התואמים.
שליחת שאילתות לגבי נתוני מדדים
הדרך הפשוטה ביותר לוודא שנתוני Prometheus מיוצאים היא להשתמש בשאילתות PromQL ב-Metrics Explorer במסוף Google Cloud .
כדי להריץ שאילתת PromQL:
במסוף Google Cloud , נכנסים לדף Monitoring או לוחצים על הכפתור הבא:
בחלונית הניווט, לוחצים על
Metrics Explorer.משתמשים בשפת השאילתות של Prometheus (PromQL) כדי לציין את הנתונים שיוצגו בתרשים:
בסרגל הכלים של החלונית Select a metric, לוחצים על Code Editor.
בוחרים באפשרות PromQL במתג Language. המתג להחלפת שפה נמצא בתחתית החלונית Code Editor.
מזינים את השאילתה בעורך השאילתות. לדוגמה, כדי להציג בתרשים את מספר השניות הממוצע שמעבדים השקיעו בכל מצב בשעה האחרונה, משתמשים בשאילתה הבאה:
avg(rate({ "__name__"="kubernetes.io/anthos/container/cpu/core_usage_time", "monitored_resource"="k8s_container"}[1h]))
מידע נוסף על השימוש ב-PromQL מופיע במאמר PromQL ב-Cloud Monitoring.
בצילום המסך הבא מוצג תרשים עם המדד kubernetes.io/anthos/container/cpu/core_usage_time:
אם אתם אוספים הרבה נתונים, כדאי לסנן את המדדים שמיוצאים כדי לצמצם את העלויות.
הפעלת Cloud Logging לאפליקציות של משתמשים
ההגדרות של Logging ו-Cloud Monitoring נמצאות באובייקט Stackdriver שנקרא stackdriver.
פותחים את האובייקט
stackdriverלעריכה:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriverמחליפים את USER_CLUSTER_KUBECONFIG בנתיב של קובץ ה-kubeconfig של אשכול המשתמש.
בקטע
spec, מגדירים אתenableCloudLoggingForApplicationsלערךtrue:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableCloudLoggingForApplications: true enableVPC: ... optimizedMetrics: trueשומרים וסוגרים את הקובץ הערוך.
הרצת אפליקציה לדוגמה
בקטע הזה יוצרים אפליקציה שכותבת יומנים בהתאמה אישית.
שומרים את המניפסט הבא של הפריסה בקובץ בשם
my-app.yaml.apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100mיוצרים את הפריסה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
הצגת יומני האפליקציה
המסוף
נכנסים לדף Logs Explorer במסוף Google Cloud .
לוחצים על משאב. בקטע ALL_RESOURCE_TYPES, בוחרים באפשרות
Kubernetes Container.בקטע CLUSTER_NAME, בוחרים את שם אשכול המשתמשים.
בקטע NAMESPACE_NAME, בוחרים באפשרות
default.לוחצים על Add ואז על Run Query.
בקטע Query results, אתם יכולים לראות רשומות ביומן מהפריסה של
monitoring-example. לדוגמה:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud
מריצים את הפקודה הבאה:
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'מחליפים את PROJECT_ID במזהה של הפרויקט למעקב אחרי רישום ביומן.
בפלט, אתם יכולים לראות רשומות ביומן מהפריסה של
monitoring-example. לדוגמה:insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
סינון יומני האפליקציות
סינון יומני האפליקציות יכול להפחית את החיוב על רישום ביומן של האפליקציות ואת התנועה ברשת מהאשכול אל Cloud Logging. החל מגרסה 1.15.0 של Google Distributed Cloud, כשהערך של enableCloudLoggingForApplications הוא true, אפשר לסנן את יומני האפליקציות לפי הקריטריונים הבאים:
- תוויות של Pod (
podLabelSelectors) - מרחבי שמות (
namespaces) - ביטויים רגולריים לתוכן של יומנים (
contentRegexes)
Google Distributed Cloud שולח רק את תוצאות הסינון ל-Cloud Logging.
הגדרת מסננים ליומני האפליקציה
ההגדרות של Logging מפורטות באובייקט Stackdriver שנקרא stackdriver.
פותחים את האובייקט
stackdriverלעריכה:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ edit stackdriver stackdriverמחליפים את USER_CLUSTER_KUBECONFIG בנתיב לקובץ kubeconfig של אשכול המשתמשים.
מוסיפים קטע
appLogFilterל-spec:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: enableCloudLoggingForApplications: true projectID: ... clusterName: ... clusterLocation: ... appLogFilter: keepLogRules: - namespaces: - prod ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes ruleName: drop-logsשומרים וסוגרים את הקובץ הערוך.
(אופציונלי) אם אתם משתמשים ב-
podLabelSelectors, הפעילו מחדש את DaemonSet שלstackdriver-log-forwarderכדי שהשינויים ייכנסו לתוקף בהקדם האפשרי:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ rollout restart daemonset stackdriver-log-forwarderבדרך כלל,
podLabelSelectorsנכנסים לתוקף אחרי 10 דקות. כדי שהשינויים ייכנסו לתוקף מהר יותר, אפשר להפעיל מחדש את DaemonSetstackdriver-log-forwarder.
דוגמה: הכללת יומני ERROR או WARN במרחב השמות prod בלבד
הדוגמה הבאה ממחישה איך פועל מסנן של יומן אפליקציה. אתם מגדירים מסנן שמשתמש במרחב שמות (prod), בביטוי רגולרי (.*(ERROR|WARN).*) ובתווית Pod (disableGCPLogging=yes). לאחר מכן, כדי לוודא שהמסנן פועל, אתם מריצים Pod במרחב השמות prod כדי לבדוק את תנאי המסנן האלה.
כדי להגדיר ולבדוק מסנן של יומן אפליקציות:
מציינים מסנן של יומן האפליקציה באובייקט Stackdriver:
בדוגמה הבאה ל-
appLogFilter, נשמרים רק יומניERRORאוWARNבמרחב השמותprod. כל היומנים של Pods עם התוויתdisableGCPLogging=yesנמחקים:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: ... appLogFilter: keepLogRules: - namespaces: - prod contentRegexes: - ".*(ERROR|WARN).*" ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes # kubectl label pods pod disableGCPLogging=yes ruleName: drop-logsפורסים Pod במרחב השמות
prodומריצים סקריפט שיוצר רשומות ביומן שלERRORו-INFO:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG run pod1 \ --image gcr.io/cloud-marketplace-containers/google/debian10:latest \ --namespace prod --restart Never --command -- \ /bin/sh -c "while true; do echo 'ERROR is 404\\nINFO is not 404' && sleep 1; done"היומנים המסוננים צריכים להכיל רק את הרשומות של
ERROR, ולא את הרשומות שלINFO.מוסיפים את התווית
disableGCPLogging=yesל-Pod:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG label pods pod1 \ --namespace prod disableGCPLogging=yesהיומן המסונן לא אמור להכיל יותר רשומות של Pod בשם
pod1.
הגדרת API של מסנן יומן האפליקציה
ההגדרה של מסנן יומן האפליקציה מוצהרת בתוך הגדרת המשאב בהתאמה אישית של Stackdriver.
כדי לקבל את הגדרת המשאב בהתאמה אישית של Stackdriver, מריצים את הפקודה הבאה:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get crd stackdrivers.addons.gke.io \
--namespace kube-system -o yaml