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
- grafana: https://github.com/helm/charts/tree/master/stable/grafana
- prometheus: https://github.com/helm/charts/tree/master/stable/prometheus
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