Aktifkan logging dan pemantauan aplikasi

Halaman ini menunjukkan cara mengonfigurasi GKE pada cluster Bare Metal sehingga log dan metrik kustom dari aplikasi pengguna dikirim ke Cloud Logging dan Cloud Monitoring serta Google Cloud Managed Service for Prometheus.

Untuk pengalaman logging dan pemantauan aplikasi pengguna terbaik, sebaiknya gunakan konfigurasi berikut:

  • Aktifkan Google Cloud Managed Service for Prometheus dengan menetapkan enableGMPForApplications ke true di objek Stackdriver. Dengan konfigurasi ini, Anda dapat memantau dan membuat pemberitahuan workload secara global, menggunakan Prometheus. Untuk petunjuk dan informasi tambahan, lihat Mengaktifkan Layanan Terkelola untuk Prometheus di halaman ini.

  • Aktifkan Cloud Logging untuk aplikasi pengguna dengan menetapkan enableCloudLoggingForApplications ke true di objek Stackdriver. Konfigurasi ini menyediakan logging untuk beban kerja Anda. Untuk petunjuk dan informasi tambahan, lihat Mengaktifkan Cloud Logging untuk aplikasi pengguna di halaman ini.

  • Nonaktifkan Logging dan Monitoring lama untuk aplikasi pengguna dengan menetapkan enableApplication ke false di resource cluster. Menonaktifkan kemampuan ini akan mencegah metrik aplikasi dikumpulkan dua kali. Gunakan langkah-langkah di bagian Mengaktifkan Logging dan Monitoring untuk aplikasi pengguna (Lama), tetapi tetapkan enableApplication ke false, bukan true.

Mengaktifkan Google Cloud Managed Service for Prometheus

Konfigurasi Google Cloud Managed Service for Prometheus ditentukan dalam objek Stackdriver bernama stackdriver. Untuk mengetahui informasi tambahan, termasuk praktik terbaik dan pemecahan masalah, lihat dokumentasi Google Cloud Managed Service for Prometheus.

Untuk mengonfigurasi objek stackdriver guna mengaktifkan Google Cloud Managed Service for Prometheus:

  1. Buka objek stackdriver untuk diedit:

    kubectl --kubeconfig=CLUSTER_KUBECONFIG \
        --namespace kube-system edit stackdriver stackdriver
    

    Ganti CLUSTER_KUBECONFIG dengan jalur file kubeconfig cluster Anda.

  2. Di bagian spec, tetapkan enableGMPForApplications ke 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. Simpan dan tutup file yang diedit.

    Komponen Prometheus yang dikelola Google dimulai secara otomatis dalam cluster di namespace gmp-system.

  4. Periksa komponen Prometheus yang dikelola Google:

    kubectl --kubeconfig=CLUSTER_KUBECONFIG --namespace gmp-system get pods
    

    Output perintah ini akan mirip dengan berikut ini:

    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 Managed Service for Prometheus mendukung pemberitahuan dan evaluasi aturan. Untuk menyiapkan evaluasi aturan, lihat Evaluasi aturan.

Menjalankan aplikasi contoh

Layanan terkelola menyediakan manifes untuk aplikasi contoh, prom-example, yang memunculkan metrik Prometheus pada port metrics-nya. Aplikasi ini menggunakan tiga replika.

Untuk men-deploy aplikasi:

  1. Buat namespace gmp-test untuk resource yang Anda buat sebagai bagian dari aplikasi contoh:

    kubectl --kubeconfig=CLUSTER_KUBECONFIG create ns gmp-test
    
  2. Terapkan manifes aplikasi dengan perintah berikut:

    kubectl -n gmp-test apply \
        -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/example-app.yaml
    

Mengonfigurasi resource PodMonitoring

Di bagian ini, Anda akan mengonfigurasi resource kustom PodMonitoring untuk mengambil data metrik yang dikeluarkan oleh aplikasi contoh dan mengirimkannya ke Managed Service for Prometheus. Resource kustom PodMonitoring menggunakan scraping target. Dalam hal ini, agen kolektor melakukan scraping endpoint /metrics yang menjadi tujuan dikeluarkannya data oleh aplikasi contoh.

Resource kustom PodMonitoring menyalin target dalam namespace tempat resource tersebut di-deploy saja. Untuk menyalin target dalam beberapa namespace, deploy resource kustom PodMonitoring yang sama di setiap namespace. Anda dapat memastikan bahwa resource PodMonitoring diinstal di namespace yang diinginkan dengan menjalankan perintah berikut:

kubectl --kubeconfig CLUSTER_KUBECONFIG get podmonitoring -A

Untuk dokumentasi referensi tentang semua resource kustom Managed Service for Prometheus, lihat referensi prometheus-engine/doc/api.

Manifes berikut menentukan resource PodMonitoring, prom-example, dalam namespace gmp-test. Resource ini menemukan semua Pod dalam namespace yang memiliki label app dengan nilai prom-example. Pod yang cocok disalin pada port bernama metrics, setiap 30 detik, di jalur HTTP /metrics.

apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: prom-example
spec:
  selector:
    matchLabels:
      app: prom-example
  endpoints:
  - port: metrics
    interval: 30s

Untuk menerapkan resource ini, jalankan perintah berikut:

kubectl --kubeconfig CLUSTER_KUBECONFIG -n gmp-test apply \
    -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/pod-monitoring.yaml

Managed Service for Prometheus kini mengekstrak Pod yang cocok.

Membuat kueri data metrik

Cara termudah untuk memverifikasi bahwa data Prometheus Anda diekspor adalah dengan menggunakan kueri PromQL di Metrics Explorer di Konsol Google Cloud.

Untuk menjalankan kueri PromQL, lakukan hal berikut:

  1. Di konsol Google Cloud, buka halaman Monitoring atau klik tombol berikut:

    Buka Monitoring

  2. Di panel navigasi, pilih Metrics Explorer.

  3. Gunakan Bahasa Kueri Prometheus (PromQL) untuk menentukan data yang akan ditampilkan pada diagram:

    1. Di toolbar pada panel Select a metric, pilih Code Editor.

    2. Pilih PromQL di tombol Language. Tombol bahasa berada di bagian bawah panel Code Editor.

    3. Masukkan kueri Anda ke editor kueri. Misalnya, untuk membuat diagram jumlah detik rata-rata yang dihabiskan CPU dalam setiap mode selama satu jam terakhir, gunakan kueri berikut:

      avg(rate(kubernetes_io:anthos_container_cpu_usage_seconds_total
      {monitored_resource="k8s_node"}[1h]))
      

    Untuk mengetahui informasi selengkapnya tentang penggunaan PromQL, lihat PromQL di Cloud Monitoring.

Screenshot berikut menunjukkan diagram yang menampilkan metrik anthos_container_cpu_usage_seconds_total:

Diagram Google Cloud Managed Service for Prometheus untuk metrik `anthos_container_cpu_usage_seconds_total` Prometheus.

Jika Anda mengumpulkan data dalam jumlah besar, sebaiknya filter metrik yang diekspor untuk menekan biaya.

Mengaktifkan Cloud Logging untuk aplikasi pengguna

Konfigurasi untuk Cloud Logging dan Cloud Monitoring disimpan di objek Stackdriver bernama stackdriver.

  1. Buka objek stackdriver untuk diedit:

    kubectl --kubeconfig=CLUSTER_KUBECONFIG \
        --namespace kube-system edit stackdriver stackdriver
    

    Ganti CLUSTER_KUBECONFIG dengan jalur file kubeconfig cluster pengguna Anda.

  2. Di bagian spec, tetapkan enableCloudLoggingForApplications ke 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. Simpan dan tutup file yang diedit.

Menjalankan aplikasi contoh

Di bagian ini, Anda akan membuat aplikasi yang menulis log kustom.

  1. Simpan manifes Deployment berikut ke file bernama 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. Membuat Deployment

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

Lihat log aplikasi

Konsol

  1. Buka Logs Explorer di Konsol Google Cloud.

    Buka Logs Explorer

  2. Klik Resource. Di menu SEMUA RESOURCE JENIS, pilih Container Kubernetes.

  3. Pada CLUSTER_NAME, pilih nama cluster pengguna Anda.

  4. Di bagian NAMESPACE_NAME, pilih default.

  5. Klik Add, lalu klik Run Query.

  6. Di bagian Query results, Anda dapat melihat entri log dari Deployment monitoring-example. Contoh:

    {
      "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 CLI

  1. Jalankan perintah ini:

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

    Ganti PROJECT_ID dengan ID project Anda.

  2. Dalam output, Anda dapat melihat entri log dari Deployment monitoring-example. Contoh:

    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'
    

Filter log aplikasi

Pemfilteran log aplikasi dapat mengurangi penagihan logging aplikasi dan traffic jaringan dari cluster ke Cloud Logging. Dimulai dari GKE pada rilis Bare Metal 1.15.0, jika enableCloudLoggingForApplications ditetapkan ke true, Anda dapat memfilter log aplikasi berdasarkan kriteria berikut:

  • Label pod (podLabelSelectors)
  • Namespace (namespaces)
  • Ekspresi reguler untuk konten log (contentRegexes)

GKE pada Bare Metal hanya mengirimkan hasil filter ke Cloud Logging.

Menentukan filter log aplikasi

Konfigurasi untuk Logging ditentukan dalam objek Stackdriver yang bernama stackdriver.

  1. Buka objek stackdriver untuk diedit:

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

    Ganti USER_CLUSTER_KUBECONFIG dengan jalur ke file kubeconfig cluster pengguna Anda.

  2. Tambahkan bagian appLogFilter ke 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. Simpan dan tutup file yang diedit.

  4. (Opsional) Jika Anda menggunakan podLabelSelectors, mulai ulang DaemonSet stackdriver-log-forwarder untuk menerapkan perubahan sesegera mungkin:

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

    Biasanya, podLabelSelectors akan efektif setelah 10 menit. Memulai ulang stackdriver-log-forwarder DaemonSet akan membuat perubahan diterapkan lebih cepat.

Contoh: Sertakan log ERROR atau WARN hanya dalam namespace prod

Contoh berikut mengilustrasikan cara kerja filter log aplikasi. Anda menentukan filter yang menggunakan namespace (prod), ekspresi reguler (.*(ERROR|WARN).*), dan label Pod (disableGCPLogging=yes). Kemudian, untuk memastikan filter berfungsi, jalankan Pod di namespace prod untuk menguji kondisi filter ini.

Untuk menentukan dan menguji filter log aplikasi:

  1. Tentukan filter log aplikasi di objek Stackdriver:

    Pada contoh appLogFilter berikut, hanya log ERROR atau WARN dalam namespace prod yang disimpan. Setiap log untuk Pod dengan label disableGCPLogging=yes akan dihapus:

    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. Deploy Pod di namespace prod dan jalankan skrip yang menghasilkan entri log ERROR dan 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"
    

    Log yang difilter hanya boleh berisi entri ERROR, bukan entri INFO.

  3. Tambahkan label disableGCPLogging=yes ke Pod:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG label pods pod1 \
        --namespace prod disableGCPLogging=yes
    

    Log yang difilter tidak akan lagi berisi entri untuk Pod pod1.

Definisi API filter log aplikasi

Definisi untuk filter log aplikasi dideklarasikan dalam definisi resource kustom stackdriver.

Untuk mendapatkan definisi resource kustom stackdriver, jalankan perintah berikut:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get crd stackdrivers.addons.gke.io \
    --namespace kube-system -o yaml

Mengaktifkan Logging dan Pemantauan untuk aplikasi pengguna (Lama)

Sebaiknya ikuti panduan konfigurasi di awal dokumen ini.

Langkah-langkah berikut masih dapat dilakukan, tetapi tidak direkomendasikan. Baca masalah umum terkait ini sebelum menggunakan langkah-langkah berikut.

Untuk mengaktifkan Logging dan Monitoring untuk aplikasi Anda, gunakan kolom spec.clusterOperations.enableApplication di file konfigurasi cluster.

  1. Perbarui file konfigurasi cluster untuk menetapkan enableApplication ke true:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-user-basic
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: user-basic
      namespace: cluster-user-basic
    spec:
      type: user
      ...
      clusterOperations:
        projectID: project-fleet
        location: us-central1
        enableApplication: true
        ...
    
  2. Gunakan bmctl update untuk menerapkan perubahan:

    bmctl update cluster -c CLUSTER_NAME --admin-kubeconfig=ADMIN_KUBECONFIG
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster yang akan diupgrade.
    • ADMIN_KUBECONFIG: jalur ke file kubeconfig cluster admin.

Menganotasi workload

Untuk mengaktifkan pengumpulan metrik kustom dari aplikasi, tambahkan anotasi prometheus.io/scrape: "true" ke Service atau manifes Pod aplikasi, atau tambahkan anotasi yang sama ke bagian spec.template di Deployment atau manifes DaemonSet agar dapat diteruskan ke Pod-nya.

Menjalankan aplikasi contoh

Di bagian ini, Anda akan membuat aplikasi yang menulis log kustom dan menampilkan metrik kustom.

  1. Simpan manifes Layanan dan Deployment berikut ke file bernama my-app.yaml. Perhatikan bahwa Layanan memiliki anotasi prometheus.io/scrape: "true":

    kind: Service
    apiVersion: v1
    metadata:
      name: "monitoring-example"
      namespace: "default"
      annotations:
        prometheus.io/scrape: "true"
    spec:
      selector:
        app: "monitoring-example"
      ports:
        - name: http
          port: 9090
    ---
    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. Membuat Deployment dan Service:

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

Lihat log aplikasi

Konsol

  1. Buka Logs Explorer di Konsol Google Cloud.

    Buka Logs Explorer

  2. Klik Resource. Di bagian ALL RESOURCE TYPES, pilih Kubernetes Container.

  3. Pada CLUSTER_NAME, pilih nama cluster pengguna Anda.

  4. Di bagian NAMESPACE_NAME, pilih default.

  5. Klik Add, lalu klik Run Query.

  6. Di bagian Query results, Anda dapat melihat entri log dari Deployment monitoring-example. Contoh:

    {
      "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 CLI

  1. Jalankan perintah ini:

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

    Ganti PROJECT_ID dengan ID project Anda.

  2. Dalam output, Anda dapat melihat entri log dari Deployment monitoring-example. Contoh:

    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'
    

Melihat metrik aplikasi di Konsol Google Cloud

Aplikasi contoh Anda mengekspos metrik kustom bernama example_monitoring_up. Anda dapat melihat nilai metrik tersebut di Konsol Google Cloud.

  1. Buka Metrics Explorer di Konsol Google Cloud.

    Buka Metrics Explorer

  2. Untuk Resource type, pilih Kubernetes Pod atau Kubernetes Container.

  3. Untuk metric, pilih external.googleapis.com/prometheus/example_monitoring_up.

  4. Pada diagram, Anda dapat melihat bahwa example_monitoring_up memiliki nilai berulang 1.