Istio

Dokumen ini menjelaskan cara mengonfigurasi deployment Google Kubernetes Engine, sehingga Anda dapat menggunakan Google Cloud Managed Service for Prometheus untuk mengumpulkan metrik dari Istio. Dokumen ini menunjukkan cara melakukan hal berikut:

  • Siapkan Istio untuk melaporkan metrik.
  • Konfigurasi resource PodMonitoring untuk Google Cloud Managed Service for Prometheus guna mengumpulkan metrik yang diekspor.
  • Akses dasbor di Cloud Monitoring untuk melihat metrik.
  • Konfigurasi aturan pemberitahuan untuk memantau metrik.

Petunjuk ini hanya berlaku jika Anda menggunakan koleksi terkelola dengan Managed Service for Prometheus. Jika Anda menggunakan pengumpulan yang di-deploy sendiri, baca repositori sumber untuk Istio guna mengetahui informasi penginstalannya.

Petunjuk ini diberikan sebagai contoh dan diharapkan dapat berfungsi di sebagian besar lingkungan Kubernetes. Jika Anda mengalami masalah saat menginstal aplikasi atau pengekspor karena kebijakan organisasi atau keamanan yang ketat, sebaiknya baca dokumentasi open source untuk mendapatkan dukungan.

Untuk mengetahui informasi tentang Istio, lihat Istio.

Prasyarat

Untuk mengumpulkan metrik dari Istio menggunakan Managed Service for Prometheus dan pengumpulan terkelola, deployment Anda harus memenuhi persyaratan berikut:

  • Cluster Anda harus menjalankan Google Kubernetes Engine versi 1.21.4-gke.300 atau yang lebih baru.
  • Anda harus menjalankan Google Cloud Managed Service for Prometheus dengan mengaktifkan koleksi terkelola. Untuk informasi selengkapnya, lihat Mulai menggunakan koleksi terkelola.

Istio mengekspos metrik format Prometheus secara otomatis; Anda tidak perlu menginstalnya secara terpisah. Anda dapat menjalankan pemeriksaan berikut untuk memverifikasi bahwa Proxy Istio telah dimasukkan sebagai file bantuan dan Istiod, bidang kontrol Istio, serta Proxy Istio memberikan metrik tentang endpoint yang diharapkan.

  • Untuk menentukan apakah Proxy Istio dimasukkan sebagai file bantuan, jalankan perintah berikut, yang menghitung container yang berjalan di pod aplikasi:

    kubectl get pod -l app=APPLICATION_NAME -n NAMESPACE_NAME -o jsonpath='{.items[0].spec.containers[*].name}'
    

    Jika Anda melihat bahwa pod berisi container file bantuan istio, berarti pengekspor telah dimasukkan. Jika file bantuan tidak dimasukkan, ikuti petunjuk di Istio: Menginstal sespan.

  • Untuk memverifikasi bahwa metrik dikeluarkan oleh Proxy Istio, jalankan perintah berikut, yang memeriksa endpoint /stats/prometheus dari istio pada pod yang ditentukan:

    kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- curl -sS 'localhost:15090/stats/prometheus'
    

    Jika Anda melihat metrik Prometheus istio_* dan envoy_* mentah, berarti metrik ditampilkan dengan benar.

  • Untuk memastikan bahwa metrik dimunculkan dengan cara yang sama di Istiod, jalankan perintah berikut, yang memeriksa endpoint /metrics dari Istiod di salah satu pod dalam deployment istiod:

    kubectl exec -n istio-system deployment/istiod -- curl -sS 'localhost:15014/metrics'
    

Menentukan resource PodMonitoring

Untuk penemuan target, Layanan Terkelola untuk Operator Prometheus memerlukan resource PodMonitoring yang sesuai dengan pengekspor Istio di namespace yang sama.

Anda dapat menggunakan konfigurasi PodMonitoring berikut:

# Copyright 2022 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
#
#     https://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: istiod
  namespace: istio-system
  labels:
    app.kubernetes.io/name: istiod
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  selector:
    matchLabels:
      app: istiod
  endpoints:
  - port: 15014
    interval: 30s
    path: /metrics
  targetLabels:
    fromPod:
    - from: app
      to: app
---
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: istio-proxy
  labels:
    app.kubernetes.io/name: istio-proxy
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  selector:
    matchLabels:
  endpoints:
  - port: http-envoy-prom
    scheme: http
    interval: 30s
    path: /stats/prometheus
Istio memerlukan dua resource PodMonitoring terpisah: Satu yang memantau Istiod dan satu lagi yang memantau file bantuan Proxy Istio serta gateway masuk dan keluar. Untuk memantau metrik Istio Proxy di seluruh namespace dalam cluster sekaligus, terapkan PodMonitoring istio-proxy ke setiap namespace atau siapkan resource ClusterPodMonitoring, bukan resource PodMonitoring per namespace.

Jika Anda berencana menggunakan dasbor Grafana yang disediakan Istio, selain resource PodMonitoring yang dijelaskan dalam dokumen ini, pastikan Anda juga mengonfigurasi scraping cAdvisor dan Kubelet.

Untuk menerapkan perubahan konfigurasi dari file lokal, jalankan perintah berikut:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Anda juga dapat menggunakan Terraform untuk mengelola konfigurasi Anda.

Menentukan aturan dan pemberitahuan

Anda dapat menggunakan konfigurasi Rules berikut untuk menentukan pemberitahuan di metrik Istio:

# Copyright 2022 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
#
#     https://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: istio-rules
  labels:
    app.kubernetes.io/component: rules
    app.kubernetes.io/name: istio-rules
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  groups:
  - name: istio
    interval: 30s
    rules:
    - alert: IstioHighTotalRequestRate
      expr: sum(rate(istio_requests_total{reporter="destination"}[5m])) > 1000
      for: 2m
      labels:
        severity: warning
      annotations:
        summary: Istio high total request rate (instance {{ $labels.instance }})
        description: |-
          Global request rate in the service mesh is unusually high.
            VALUE = {{ $value }}
            LABELS = {{ $labels }}
    - alert: IstioLowTotalRequestRate
      expr: sum(rate(istio_requests_total{reporter="destination"}[5m])) < 100
      for: 2m
      labels:
        severity: warning
      annotations:
        summary: Istio low total request rate (instance {{ $labels.instance }})
        description: |-
          Global request rate in the service mesh is unusually low.
            VALUE = {{ $value }}
            LABELS = {{ $labels }}
    - alert: IstioHigh4xxErrorRate
      expr: sum(rate(istio_requests_total{reporter="destination", response_code=~"4.*"}[5m])) / sum(rate(istio_requests_total{reporter="destination"}[5m])) * 100 > 5
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: Istio high 4xx error rate (instance {{ $labels.instance }})
        description: |-
          High percentage of HTTP 5xx responses in Istio (> 5%).
            VALUE = {{ $value }}
            LABELS = {{ $labels }}
    - alert: IstioHigh5xxErrorRate
      expr: sum(rate(istio_requests_total{reporter="destination", response_code=~"5.*"}[5m])) / sum(rate(istio_requests_total{reporter="destination"}[5m])) * 100 > 5
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: Istio high 5xx error rate (instance {{ $labels.instance }})
        description: |-
          High percentage of HTTP 5xx responses in Istio (> 5%).
            VALUE = {{ $value }}
            LABELS = {{ $labels }}
    - alert: IstioHighRequestLatency
      expr: rate(istio_request_duration_milliseconds_sum{reporter="destination"}[1m]) / rate(istio_request_duration_milliseconds_count{reporter="destination"}[1m]) > 100
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: Istio high request latency (instance {{ $labels.instance }})
        description: |-
          Istio average requests execution is longer than 100ms.
            VALUE = {{ $value }}
            LABELS = {{ $labels }}
    - alert: IstioLatency99Percentile
      expr: histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket[1m])) by (destination_canonical_service, destination_workload_namespace, source_canonical_service, source_workload_namespace, le)) > 1
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: Istio latency 99 percentile (instance {{ $labels.instance }})
        description: |-
          Istio 1% slowest requests are longer than 1s.
            VALUE = {{ $value }}
            LABELS = {{ $labels }}

Untuk menerapkan perubahan konfigurasi dari file lokal, jalankan perintah berikut:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Anda juga dapat menggunakan Terraform untuk mengelola konfigurasi Anda.

Untuk mengetahui informasi selengkapnya tentang cara menerapkan aturan ke cluster Anda, lihat Evaluasi dan pemberitahuan aturan terkelola.

Konfigurasi Rules ini diadaptasi dari aturan Istio yang disediakan oleh Awesome Prometheus Alerts. Anda dapat menyesuaikan nilai minimum pemberitahuan agar sesuai dengan aplikasi Anda.

Memverifikasi konfigurasi

Anda dapat menggunakan Metrics Explorer untuk memverifikasi bahwa Anda telah mengonfigurasi pengekspor Istio dengan benar. Cloud Monitoring mungkin memerlukan waktu satu atau dua menit untuk menyerap metrik Anda.

Untuk memastikan metrik diserap, lakukan tindakan berikut:

  1. Di panel navigasi Konsol Google Cloud, pilih Monitoring, lalu pilih  Metrics Explorer:

    Buka Metrics Explorer

  2. Di toolbar panel pembuat kueri, pilih tombol dengan nama  MQL atau  PromQL.
  3. Pastikan PromQL dipilih di tombol Language. Tombol bahasa berada di toolbar yang sama yang memungkinkan Anda memformat kueri.
  4. Masukkan dan jalankan kueri berikut:
    sum(istio_build{cluster="CLUSTER_NAME"}) by (component)
    

Lihat dasbor

Integrasi Cloud Monitoring meliputi dasbor Istio Envoy Prometheus Overview. Dasbor diinstal secara otomatis saat Anda mengonfigurasi integrasi. Anda juga dapat melihat pratinjau statis dasbor tanpa menginstal integrasi.

Untuk melihat dasbor yang terinstal, lakukan hal berikut:

  1. Di panel navigasi konsol Google Cloud, pilih Monitoring, lalu pilih  Dashboards:

    Buka Dasbor

  2. Pilih tab Daftar Dasbor.
  3. Pilih kategori Integrations.
  4. Klik nama dasbor, misalnya, Istio Envoy Prometheus Overview.

Untuk melihat pratinjau statis dasbor, lakukan hal berikut:

  1. Di panel navigasi konsol Google Cloud, pilih Monitoring, lalu pilih  Integrations:

    Buka Integrations

  2. Klik filter platform deployment Kubernetes Engine.
  3. Temukan integrasi Istio, lalu klik View Details.
  4. Pilih tab Dasbor.

Pemecahan masalah

Untuk mengetahui informasi tentang cara memecahkan masalah penyerapan metrik, lihat Masalah terkait pengumpulan dari pengekspor dalam Memecahkan masalah sisi penyerapan.