Jalur Pembelajaran: Aplikasi yang skalabel - Pantau dengan Prometheus


Kumpulan tutorial ini ditujukan untuk admin dan Operator IT yang ingin men-deploy, menjalankan, dan mengelola lingkungan aplikasi modern yang berjalan di edisi Google Kubernetes Engine (GKE) Enterprise. Selama mempelajari serangkaian tutorial ini, Anda akan mempelajari cara mengonfigurasi pemantauan dan pemberitahuan, menskalakan workload, dan menyimulasikan kegagalan, semuanya menggunakan aplikasi microservice contoh Cymbal Bank:

  1. Membuat cluster dan men-deploy aplikasi contoh
  2. Pantau dengan Google Cloud Managed Service for Prometheus (tutorial ini)
  3. Menskalakan workload
  4. Menyimulasikan kegagalan

Ringkasan dan tujuan

Aplikasi contoh Cymbal Bank yang digunakan dalam kumpulan tutorial ini terdiri dari sejumlah microservice yang semuanya dijalankan di cluster GKE. Masalah pada salah satu layanan ini dapat mengakibatkan pengalaman buruk bagi nasabah bank, seperti tidak dapat mengakses aplikasi bank. Dengan mempelajari masalah pada layanan secepatnya, Anda dapat mulai memecahkan masalah dan menyelesaikan masalah dengan cepat.

Dalam tutorial ini, Anda akan mempelajari cara memantau workload di cluster GKE menggunakan Google Cloud Managed Service for Prometheus dan Cloud Monitoring. Anda akan mempelajari cara menyelesaikan tugas-tugas berikut:

  • Membuat webhook Slack untuk Alertmanager.

  • Konfigurasikan Prometheus untuk memantau status aplikasi berbasis layanan microservice contoh.

  • Simulasikan penonaktifan dan tinjau notifikasi yang dikirim menggunakan webhook Slack.

Biaya

Dengan mengaktifkan GKE Enterprise dan men-deploy aplikasi contoh Cymbal Bank untuk rangkaian tutorial ini, Anda akan dikenai biaya per cluster untuk GKE Enterprise di Google Cloud seperti yang tercantum di halaman Harga hingga Anda menonaktifkan GKE Enterprise atau menghapus project.

Anda juga bertanggung jawab atas biaya Google Cloud lainnya yang timbul saat menjalankan aplikasi contoh Cymbal Bank, seperti biaya untuk VM Compute Engine dan Cloud Monitoring.

Sebelum memulai

Untuk mempelajari cara memantau workload, Anda harus menyelesaikan tutorial pertama untuk membuat cluster GKE yang menggunakan Autopilot dan men-deploy aplikasi berbasis microservice contoh Cymbal Bank.

Sebaiknya Anda menyelesaikan rangkaian tutorial ini untuk Cymbal Bank secara berurutan. Seiring Anda mempelajari serangkaian tutorial, Anda akan mempelajari keterampilan baru dan menggunakan produk serta layanan Google Cloud tambahan.

Tutorial ini menggunakan Slack untuk menunjukkan contoh bagaimana cluster GKE Autopilot dapat menggunakan Google Cloud Managed Service for Prometheus untuk menghasilkan pesan ke platform komunikasi. Dalam deployment produksi sendiri, Anda dapat menggunakan alat komunikasi pilihan organisasi untuk memproses dan mengirimkan pesan saat cluster GKE mengalami masalah.

  • Bergabunglah ke ruang kerja Slack, baik dengan mendaftar menggunakan email Anda maupun menggunakan undangan yang dikirim oleh Admin Workspace.

Membuat aplikasi Slack

Bagian penting dari menyiapkan pemantauan adalah memastikan bahwa Anda diberi tahu saat terjadi peristiwa yang dapat ditindaklanjuti seperti pemadaman layanan. Pola umum untuk hal ini adalah mengirim notifikasi ke alat komunikasi seperti Slack, yang Anda gunakan dalam tutorial ini. Slack menyediakan fitur webhook yang memungkinkan aplikasi eksternal, seperti deployment produksi, membuat pesan. Anda dapat menggunakan alat komunikasi lain di organisasi untuk memproses dan mengirim pesan saat cluster GKE mengalami masalah.

Cluster GKE yang menggunakan Autopilot menyertakan instance Google Cloud Managed Service for Prometheus. Instance ini dapat menghasilkan pemberitahuan ketika terjadi sesuatu pada aplikasi Anda. Pemberitahuan ini kemudian dapat menggunakan webhook Slack untuk mengirim pesan ke ruang kerja Slack sehingga Anda akan menerima notifikasi prompt saat terjadi masalah.

Untuk menyiapkan notifikasi Slack berdasarkan pemberitahuan yang dihasilkan oleh Prometheus, Anda harus membuat aplikasi Slack, mengaktifkan Webhook Masuk untuk aplikasi, dan menginstal aplikasi ke ruang kerja Slack.

  1. Login ke Slack menggunakan nama ruang kerja dan kredensial akun Slack Anda.

  2. Membuat aplikasi Slack baru

    1. Dalam dialog Create an app(Buat aplikasi), klik From scratch (Mulai dari langkah awal).
    2. Tentukan App Name dan pilih ruang kerja Slack Anda.
    3. Klik Create App.
    4. Di bagian Tambahkan fitur dan fungsi, klik Webhook Masuk.
    5. Klik tombol Aktifkan Webhook Masuk.
    6. Di bagian Webhook URLs for Your Workspace, klik Add New Webhook to Workspace.
    7. Pada halaman otorisasi yang terbuka, pilih saluran yang akan menerima notifikasi.
    8. Klik Izinkan.
    9. Webhook untuk aplikasi Slack Anda ditampilkan di bagian URL webhook untuk Ruang Kerja Anda. Simpan URL untuk nanti.

Mengonfigurasi Alertmanager

Di Prometheus, Alertmanager memproses peristiwa pemantauan yang dihasilkan deployment Anda. Alertmanager dapat melewati peristiwa duplikat, peristiwa terkait grup, dan mengirim notifikasi, seperti menggunakan webhook Slack. Bagian ini menunjukkan cara mengonfigurasi Alertmanager untuk menggunakan webhook Slack baru Anda. Penetapan cara yang Anda inginkan untuk memproses peristiwa untuk dikirimkan oleh Alertmanager akan dibahas di bagian tutorial berikutnya, Mengonfigurasi Prometheus.

Untuk mengonfigurasi Alertmanager agar menggunakan webhook Slack, selesaikan langkah-langkah berikut:

  1. Ubah direktori ke repositori Git yang menyertakan semua manifes contoh untuk Cymbal Bank dari tutorial sebelumnya:

    cd ~/bank-of-anthos/
    

    Jika perlu, ubah lokasi direktori ke tempat Anda sebelumnya meng-clone repositori.

  2. Perbarui manifes YAML contoh Alertmanager dengan URL webhook aplikasi Slack Anda:

    sed -i "s@SLACK_WEBHOOK_URL@SLACK_WEBHOOK_URL@g" "extras/prometheus/gmp/alertmanager.yaml"
    

    Ganti SLACK_WEBHOOK_URL dengan URL webhook dari bagian sebelumnya.

  3. Untuk menggunakan URL webhook Slack unik Anda secara dinamis tanpa mengubah kode aplikasi, Anda dapat menggunakan Secret Kubernetes. Kode aplikasi akan membaca nilai Secret ini. Pada aplikasi yang lebih kompleks, kemampuan ini memungkinkan Anda mengubah, atau merotasi, nilai untuk alasan keamanan atau kepatuhan.

    Buat rahasia Kubernetes untuk Alertmanager menggunakan contoh manifes YAML yang berisi URL webhook Slack:

    kubectl create secret generic alertmanager \
      -n gmp-public \
      --from-file=extras/prometheus/gmp/alertmanager.yaml
    
  4. Prometheus dapat menggunakan pengekspor untuk mendapatkan metrik dari aplikasi tanpa perubahan kode. Pengekspor blackbox Prometheus memungkinkan Anda memeriksa endpoint seperti HTTP atau HTTPS. Pengekspor ini berfungsi dengan baik jika Anda tidak ingin, atau tidak bisa, mengekspos cara kerja bagian dalam aplikasi Anda ke Prometheus. Pengekspor blackbox Prometheus dapat berfungsi tanpa perubahan pada kode aplikasi untuk mengekspos metrik ke Prometheus.

    Deploy pengekspor blackbox Prometheus ke cluster Anda:

    kubectl apply -f extras/prometheus/gmp/blackbox-exporter.yaml
    

Mengonfigurasi Prometheus

Setelah mengonfigurasi Alertmanager untuk menggunakan webhook Slack, Anda perlu memberi tahu Prometheus hal yang harus dipantau di Cymbal Bank, dan jenis peristiwa yang ingin diberitahukan kepada Anda tentang penggunaan webhook Slack.

Dalam aplikasi contoh Cymbal Bank yang Anda gunakan dalam tutorial ini, ada berbagai microservice yang berjalan di cluster GKE. Satu masalah yang mungkin ingin Anda ketahui sesegera mungkin adalah jika salah satu layanan Cymbal Bank berhenti merespons permintaan secara normal, kemungkinan berarti pelanggan Anda tidak dapat mengakses aplikasi. Anda dapat mengonfigurasi Prometheus untuk merespons peristiwa berdasarkan kebijakan organisasi Anda.

Termometer Masak

Anda dapat mengonfigurasi pemeriksaan Prometheus untuk resource yang ingin dipantau. Pemeriksaan ini dapat menghasilkan peringatan berdasarkan respons yang diterima pemeriksaan. Dalam aplikasi contoh Cymbal Bank, Anda dapat menggunakan pemeriksaan HTTP yang memeriksa 200 kode respons level dari Layanan. Respons level HTTP 200 menunjukkan bahwa Layanan berjalan dengan benar dan dapat merespons permintaan. Jika ada masalah dan pemeriksaan tidak menerima respons yang diharapkan, Anda dapat menentukan aturan Prometheus yang menghasilkan pemberitahuan untuk Alertmanager agar dapat memproses dan melakukan tindakan tambahan.

  1. Membuat beberapa pemeriksaan Prometheus untuk memantau status HTTP berbagai microservice dalam aplikasi contoh Cymbal Bank. Tinjau contoh manifes berikut:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: frontend-probe
      labels:
        app.kubernetes.io/name: frontend-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [frontend:80]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: userservice-probe
      labels:
        app.kubernetes.io/name: userservice-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [userservice:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: balancereader-probe
      labels:
        app.kubernetes.io/name: balancereader-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [balancereader:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: contacts-probe
      labels:
        app.kubernetes.io/name: contacts-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [contacts:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: ledgerwriter-probe
      labels:
        app.kubernetes.io/name: ledgerwriter-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [ledgerwriter:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: transactionhistory-probe
      labels:
        app.kubernetes.io/name: transactionhistory-probe
    spec:
      selector:
        matchLabels:
          app: blackbox-exporter
      endpoints:
      - port: metrics
        path: /probe
        params:
          target: [transactionhistory:8080/ready]
          module: [http_2xx]
        timeout: 30s
        interval: 60s
    

    Manifes ini menjelaskan pemeriksaan keaktifan Prometheus dan mencakup kolom berikut:

    • spec.jobName: Nama tugas yang ditetapkan untuk metrik yang di-scrap.
    • spec.prober.url: URL Layanan dari pengekspor blackbox. Hal ini mencakup port default untuk pengekspor blackbox.
    • spec.prober.path: jalur pengumpulan metrik.
    • spec.targets.staticConfig.labels: label yang ditetapkan ke semua metrik yang di-scrap dari target.
    • spec.targets.staticConfig.static: daftar host yang akan diperiksa.
  2. Untuk membuat pemeriksaan keaktifan Prometheus, terapkan manifes ke cluster Anda:

    kubectl apply -f extras/prometheus/gmp/probes.yaml
    

Aturan

Prometheus perlu mengetahui apa yang ingin Anda lakukan berdasarkan respons yang diterima pemeriksaan yang Anda buat pada langkah sebelumnya. Anda menentukan respons ini menggunakan aturan Prometheus.

Dalam tutorial ini, Anda akan membuat aturan Prometheus untuk menghasilkan pemberitahuan bergantung pada respons terhadap pemeriksaan keaktifan. Kemudian, Alertmanager memproses output aturan ini untuk membuat notifikasi menggunakan webhook Slack.

  1. Buat aturan yang menghasilkan peristiwa berdasarkan respons terhadap pemeriksaan keaktifan. Tinjau contoh manifes berikut:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: Rules
    metadata:
      name: uptime-rule
    spec:
      groups:
      - name: Micro services uptime
        interval: 60s
        rules:
        - alert: BalancereaderUnavaiable
          expr: probe_success{job="balancereader-probe"} == 0
          for: 1m
          annotations:
            summary: Balance Reader Service is unavailable
            description: Check Balance Reader pods and it's logs
          labels:
            severity: 'critical'
        - alert: ContactsUnavaiable
          expr: probe_success{job="contacts-probe"} == 0
          for: 1m
          annotations:
            summary: Contacs Service is unavailable
            description: Check Contacs pods and it's logs
          labels:
            severity: 'warning'
        - alert: FrontendUnavaiable
          expr: probe_success{job="frontend-probe"} == 0
          for: 1m
          annotations:
            summary: Frontend Service is unavailable
            description: Check Frontend pods and it's logs
          labels:
            severity: 'critical'
        - alert: LedgerwriterUnavaiable
          expr: probe_success{job="ledgerwriter-probe"} == 0
          for: 1m
          annotations:
            summary: Ledger Writer Service is unavailable
            description: Check Ledger Writer pods and it's logs
          labels:
            severity: 'critical'
        - alert: TransactionhistoryUnavaiable
          expr: probe_success{job="transactionhistory-probe"} == 0
          for: 1m
          annotations:
            summary: Transaction History Service is unavailable
            description: Check Transaction History pods and it's logs
          labels:
            severity: 'critical'
        - alert: UserserviceUnavaiable
          expr: probe_success{job="userservice-probe"} == 0
          for: 1m
          annotations:
            summary: User Service is unavailable
            description: Check User Service pods and it's logs
          labels:
            severity: 'critical'
    

    Manifes ini menjelaskan PrometheusRule dan mencakup kolom berikut:

    • spec.groups.[*].name: nama grup aturan.
    • spec.groups.[*].interval: seberapa sering aturan dalam grup dievaluasi.
    • spec.groups.[*].rules[*].alert: nama pemberitahuan.
    • spec.groups.[*].rules[*].expr: ekspresi PromQL yang akan dievaluasi.
    • spec.groups.[*].rules[*].for: jumlah waktu yang harus ditampilkan melalui pemberitahuan sebelum dianggap diaktifkan.
    • spec.groups.[*].rules[*].annotations: daftar anotasi yang akan ditambahkan ke setiap pemberitahuan. Ini hanya valid untuk aturan pemberitahuan.
    • spec.groups.[*].rules[*].labels: label yang akan ditambahkan atau ditimpa.
  2. Untuk membuat aturan, terapkan manifes ke cluster Anda:

    kubectl apply -f extras/prometheus/gmp/rules.yaml
    

Menyimulasikan pemadaman layanan

Untuk memastikan pemeriksaan, aturan, dan konfigurasi Alertmanager Prometheus Anda sudah benar, Anda harus menguji apakah pemberitahuan dan notifikasi dikirim saat terjadi masalah. Jika tidak menguji alur ini, Anda mungkin tidak menyadari bahwa layanan produksi terhenti saat terjadi masalah.

  1. Untuk menyimulasikan pemadaman salah satu microservice, skalakan Deployment contacts ke nol. Dengan nol instance Layanan, aplikasi contoh Cymbal Bank tidak dapat membaca informasi kontak untuk pelanggan:

    kubectl scale deployment contacts --replicas 0
    

    GKE mungkin memerlukan waktu hingga 5 menit untuk menurunkan skala Deployment.

  2. Periksa status Deployment di cluster Anda dan verifikasi bahwa Deployment contacts diskalakan dengan benar:

    kubectl get deployments
    

    Pada contoh output berikut, Deployment contacts berhasil diperkecil skalanya ke instance 0:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    balancereader        1/1     1            1           17m
    blackbox-exporter    1/1     1            1           5m7s
    contacts             0/0     0            0           17m
    frontend             1/1     1            1           17m
    ledgerwriter         1/1     1            1           17m
    loadgenerator        1/1     1            1           17m
    transactionhistory   1/1     1            1           17m
    userservice          1/1     1            1           17m
    
  3. Setelah Deployment contacts diperkecil hingga nol, pemeriksaan Prometheus akan melaporkan kode error HTTP. Error HTTP ini menghasilkan pemberitahuan untuk Alertmanager agar diproses.

    Periksa saluran ruang kerja Slack Anda untuk melihat pesan notifikasi pemadaman dengan teks yang mirip dengan contoh berikut:

    [FIRING:1] ContactsUnavailable
    Severity: Warning :warning:
    Summary: Contacts Service is unavailable
    Namespace: default
    Check Contacts pods and it's logs
    
  4. Dalam skenario pemadaman layanan yang sebenarnya, setelah menerima notifikasi di Slack, Anda akan mulai memecahkan masalah dan memulihkan layanan. Untuk tutorial ini, simulasikan proses ini dan pulihkan Deployment contacts dengan meningkatkan skala jumlah replika:

    kubectl scale deployment contacts --replicas 1
    

    Mungkin diperlukan waktu hingga 5 menit untuk menskalakan Deployment dan agar pemeriksaan Prometheus menerima respons HTTP 200. Anda memeriksa status Deployment menggunakan perintah kubectl get deployments.

    Saat respons yang baik terhadap pemeriksaan Prometheus diterima, Alertmanager akan menghapus peristiwa tersebut. Anda akan melihat pesan notifikasi resolusi pemberitahuan di saluran ruang kerja Slack yang mirip dengan contoh berikut:

    [RESOLVED] ContactsUnavailable
    Severity: Warning :warning:
    Summary: Contacts Service is unavailable
    Namespace: default
    Check Contacts pods and it's logs
    

Pembersihan

Sebaiknya Anda menyelesaikan rangkaian tutorial ini untuk Cymbal Bank secara berurutan. Seiring Anda mempelajari serangkaian tutorial, Anda akan mempelajari keterampilan baru dan menggunakan produk serta layanan Google Cloud tambahan.

Jika ingin berhenti sejenak sebelum melanjutkan ke tutorial berikutnya dan agar tidak menimbulkan tagihan ke akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang Anda buat.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya

Pelajari cara menskalakan deployment di GKE Enterprise dalam tutorial berikutnya.