הפעלת רישום ביומן ומעקב באפליקציה

אתם יכולים להגדיר אשכול משתמשים ב-Google Distributed Cloud כדי לשלוח מהאפליקציות שלכם יומנים ומדדים בהתאמה אישית אל Cloud Logging, אל Cloud Monitoring ואל השירות המנוהל של Google Cloud ל-Prometheus. הנתונים האלה עוזרים לכם לעקוב אחרי התקינות של עומסי העבודה ולפתור בעיות. באמצעות השירות המנוהל של Google Cloud ל-Prometheus, אתם יכולים גם לעקוב אחרי עומסי העבודה באופן גלובלי ולקבל התראות לגביהם באמצעות Prometheus.

הפעלת השירות המנוהל של Google Cloud ל-Prometheus

ההגדרות של השירות המנוהל של Google Cloud ל-Prometheus מצוינות באובייקט Stackdriver שנקרא stackdriver. למידע נוסף, כולל שיטות מומלצות ופתרון בעיות, קראו את המסמכים של השירות המנוהל של Google Cloud ל-Prometheus.

  1. פותחים את האובייקט stackdriver לעריכה:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
    

    מחליפים את USER_CLUSTER_KUBECONFIG בנתיב של קובץ ה-kubeconfig של אשכול המשתמש.

  2. בקטע 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
    
  3. שומרים וסוגרים את הקובץ הערוך. רכיבי Prometheus שמנוהלים על ידי Google מופעלים באופן אוטומטי באשכול במרחב השמות gmp-system.

  4. בודקים את הרכיבים:

    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.

פריסת האפליקציה לדוגמה

כדי לפרוס את האפליקציה:

  1. יוצרים את מרחב השמות gmp-test למשאבים שיוצרים כחלק מאפליקציית הדוגמה:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG create ns gmp-test
    
  2. השירות המנוהל מספק מניפסט לאפליקציה לדוגמה שפולטת מדדי 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:

  1. במסוף Google Cloud , נכנסים לדף Monitoring או לוחצים על הכפתור הבא:

    כניסה לדף Monitoring

  2. בחלונית הניווט, לוחצים על Metrics Explorer.

  3. משתמשים בשפת השאילתות של Prometheus‏ (PromQL) כדי לציין את הנתונים שיוצגו בתרשים:

    1. בסרגל הכלים של החלונית Select a metric, לוחצים על Code Editor.

    2. בוחרים באפשרות PromQL במתג Language. המתג להחלפת שפה נמצא בתחתית החלונית Code Editor.

    3. מזינים את השאילתה בעורך השאילתות. לדוגמה, כדי להציג בתרשים את מספר השניות הממוצע שמעבדים השקיעו בכל מצב בשעה האחרונה, משתמשים בשאילתה הבאה:

      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:

תרשים של שירות מנוהל ל-Prometheus למדד \`kubernetes.io/anthos/container/cpu/core_usage_time\` של Prometheus.

אם אתם אוספים הרבה נתונים, כדאי לסנן את המדדים שמיוצאים כדי לצמצם את העלויות.

הפעלת Cloud Logging לאפליקציות של משתמשים

ההגדרות של Logging ו-Cloud Monitoring נמצאות באובייקט Stackdriver שנקרא stackdriver.

  1. פותחים את האובייקט stackdriver לעריכה:

    kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
    

    מחליפים את USER_CLUSTER_KUBECONFIG בנתיב של קובץ ה-kubeconfig של אשכול המשתמש.

  2. בקטע 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
    
  3. שומרים וסוגרים את הקובץ הערוך.

הרצת אפליקציה לדוגמה

בקטע הזה יוצרים אפליקציה שכותבת יומנים בהתאמה אישית.

  1. שומרים את המניפסט הבא של הפריסה בקובץ בשם 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
    
  2. יוצרים את הפריסה:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
    

הצגת יומני האפליקציה

המסוף

  1. נכנסים לדף Logs Explorer במסוף Google Cloud .

    כניסה לדף Logs Explorer

  2. לוחצים על משאב. בקטע ALL_RESOURCE_TYPES, בוחרים באפשרות Kubernetes Container.

  3. בקטע CLUSTER_NAME, בוחרים את שם אשכול המשתמשים.

  4. בקטע NAMESPACE_NAME, בוחרים באפשרות default.

  5. לוחצים על Add ואז על Run Query.

  6. בקטע 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

  1. מריצים את הפקודה הבאה:

    gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \
        resource.type="k8s_container" AND resource.labels.namespace_name="default"'
    

    מחליפים את PROJECT_ID במזהה של הפרויקט למעקב אחרי רישום ביומן.

  2. בפלט, אתם יכולים לראות רשומות ביומן מהפריסה של 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.

  1. פותחים את האובייקט stackdriver לעריכה:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \
        edit stackdriver stackdriver
    

    מחליפים את USER_CLUSTER_KUBECONFIG בנתיב לקובץ kubeconfig של אשכול המשתמשים.

  2. מוסיפים קטע 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
    
  3. שומרים וסוגרים את הקובץ הערוך.

  4. (אופציונלי) אם אתם משתמשים ב-podLabelSelectors, הפעילו מחדש את DaemonSet של stackdriver-log-forwarder כדי שהשינויים ייכנסו לתוקף בהקדם האפשרי:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \
        rollout restart daemonset stackdriver-log-forwarder
    

    בדרך כלל, podLabelSelectors נכנסים לתוקף אחרי 10 דקות. כדי שהשינויים ייכנסו לתוקף מהר יותר, אפשר להפעיל מחדש את DaemonSet stackdriver-log-forwarder.

דוגמה: הכללת יומני ERROR או WARN במרחב השמות prod בלבד

הדוגמה הבאה ממחישה איך פועל מסנן של יומן אפליקציה. אתם מגדירים מסנן שמשתמש במרחב שמות (prod), בביטוי רגולרי (.*(ERROR|WARN).*) ובתווית Pod‏ (disableGCPLogging=yes). לאחר מכן, כדי לוודא שהמסנן פועל, אתם מריצים Pod במרחב השמות prod כדי לבדוק את תנאי המסנן האלה.

כדי להגדיר ולבדוק מסנן של יומן אפליקציות:

  1. מציינים מסנן של יומן האפליקציה באובייקט 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
    
    
  2. פורסים 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.

  3. מוסיפים את התווית 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