kubernetes monitoring dan alerting dengan prometheus grafana (part 1)

0
778

halo sobat sekolahlinux, kali ini saya akan membahas bagaimana caranya membuat monitoring dan juga alerting untuk kubernetes menggunakan prometheus dan grafana, kenapa pakai prometheus dan grafana berikut penjelasannya

  • grafana: grafana digunakan untuk keperluan visualisasi metric dari prometheus agar nantinya data yang ada mudah di lihat dan dipahami
  • prometheus: prometheus digunakan sebagai tempat untuk menyimpan metric yang dikirim dari client atau bisa disebut juga prometheus ini sebagai databasenya, selain untuk database prometheus ini juga bisa untuk alerting, karena di prometheus ada feature/service prometheus alert manager, nantinya alert manager ini akan mengirimkan notifikasi ke channel yang sudah di set contoh (slack, dll)

dalam ujicoba kali ini saya menggunakan minikube dengan spek sebagai berikut

  • 4 Thread CPU
  • 10GB RAM
  • kubernetes v1.14.2

untuk setup grafana dan prometheus saya menggunakan HELM 3.x, lalu untuk versi grafana dan prometheus seperti dibawah ini

step pertama kita download dulu values helm dari grafana dan prometheus menggunakan perintah dibawah ini

helm inspect values stable/prometheus > values-prometheus.yaml
helm inspect values stable/grafana > values-grafana.yaml

jika sudah buka file grafana.yaml dan lakukan penambahan juga perubahan seperti dibawah ini

pada bagian service grafana di file values-prometheus.yaml, rubah ClusterIP menjadi NodePort seperti dibawah

## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service).
## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
## ref: http://kubernetes.io/docs/user-guide/services/
##
service:
  type: NodePort
  port: 80
  targetPort: 3000
    # targetPort: 4181 To be used with a proxy extraContainer
  annotations: {}
  labels: {}
  portName: service

jika sudah buka file values-prometheus.yaml dan lakukan penambahan juga perubahan seperti dibawah ini

pada bagian service alertmanager di file values-prometheus.yaml, rubah ClusterIP menjadi NodePort seperti dibawah

  service:
    annotations: {}
    labels: {}
    clusterIP: ""

    ## Enabling peer mesh service end points for enabling the HA alert manager
    ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
    # enableMeshPeer : true

    ## List of IP addresses at which the alertmanager service is available
    ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
    ##
    externalIPs: []

    loadBalancerIP: ""
    loadBalancerSourceRanges: []
    servicePort: 80
    # nodePort: 30000
    sessionAffinity: None
    type: NodePort

pada bagian service prometheus server di file values-prometheus.yaml, rubah ClusterIP menjadi NodePort seperti dibawah

  service:
    annotations: {}
    labels: {}
    clusterIP: ""

    ## List of IP addresses at which the Prometheus server service is available
    ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
    ##
    externalIPs: []

    loadBalancerIP: ""
    loadBalancerSourceRanges: []
    servicePort: 80
    sessionAffinity: None
    type: NodePort

kenapa saya merubah type service ClusterIP menjadi NodePort, dikarenakan karena saat ini saya mencobanya di minikube maka untuk dapat mengakses service tersebut melalui ip host/vm minikube saya harus menggunakan NodePort, atau bisa juga melalui kubectl proxy atau jika kalian berada di gke atau k8s yg di provide cloud provider kalian, bisa juga menggunakan type LoadBalancer, namun pada tutorial kali ini untuk akses ke prometheus dan grafana saya menggunakan NodePort

selanjutnya pada bagian alertmanager ConfigMap entries modifikasi menjadi seperti dibawah ini, disini receiversnya atau media untuk notifikasinya menggunakan slack

## alertmanager ConfigMap entries
##
alertmanagerFiles:
  
  alertmanager.yml: |-
    global: {}
      #  slack_api_url: ''

    receivers:
      - name: default-receiver
        slack_configs:
        - channel: '#percobaan-akbar'
          api_url: 'https://hooks.slack.com/services/xxxxx4394/xxxxx0QSXRP/xxxxxcBtfnbDVPstC0aais4J'
          icon_url: https://avatars3.githubusercontent.com/u/3380462
          send_resolved: true
          text: "{{ range .Alerts }}{{ .Annotations.message }}{{ end }}"

    route:
      group_wait: 10s
      group_interval: 1m
      receiver: default-receiver
      repeat_interval: 1m

untuk detailnya paramater apa saja yang bisa kamu tambahkan serta penjelasan untuk setiap paramater yang digunakan  di alertmanager ConfigMap entries kamu bisa lihat di link berikut

lalu pada bagian Prometheus server ConfigMap entries khususnya di alerting_rules.yml, modifikasi menjadi seperti dibawah, disini saya menambahkan alert untuk mendeteksi pod mana yang gagal statusnya menjadi ready, baik itu error ataupun CrashloopBackOff dan juga status lainnya kecuali status pods ready, maka akan ada alert ke channel slack yang sudah kita set

## Prometheus server ConfigMap entries
##
serverFiles:

  ## Alerts configuration
  ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
  alerting_rules.yml:
      groups:
      - name: PodsNotReady
        rules:
          - alert: Kube PodNotReady
            annotations:
              message: "Pod `{{ $labels.pod }}` on Namespace `{{ $labels.namespace }}` Not Ready"
              alertname: "PodNotReady"
            expr: kube_pod_container_status_ready{namespace=~".*",pod=~".*"} == 0
            for: 1m
            labels:
              severity: critical
              publish: page
              componentType: app
              appType: pod-k8s

untuk detailnya paramater apa saja yang bisa kamu tambahkan serta penjelasan untuk setiap paramater yang digunakan di Prometheus server ConfigMap entries entries kamu bisa lihat di link berikut

selanjutnya jika sudah kamu bisa install atau upgrade grafana dan prometheus dengan menggunakan file values-prometheus.yaml dan juga values-grafana.yaml menggunakan perintah dibawah

  • install, jika kamu ingin install baru gunakan perintah dibawah
helm install -f values-grafana.yaml grafana stable/grafana --namespace default
helm install -f values-prometheus.yaml prometheus stable/prometheus --namespace default
  • upgrade, jika sebelumnya kamu sudah install dan hanya ingin upgrade rule nya saja, gunakan perintah dibawah
helm upgrade -f values-grafana.yaml grafana stable/grafana --namespace default
helm upgrade -f values-prometheus.yaml prometheus stable/prometheus --namespace default

jika sudah kurang lebih maka nanti alert yang akan di kirimkan ke slack akan seperti gambar dibawah baik saat problem dan juga sudah solved

jika kita lihat diatas maka tampilan title dari alertnya sangat berantakan dan sulit dibaca, pada artikel selanjutnya nanti saya akan membahas tentang bagaimana membuat custom template untuk alertmanager juga bagaimana cara menggunakan grafananya

sekian dari saya artikel ini, selamat mencoba