Kubernetes üzerine Prometheus Stack Kurulumu ve Ayarlanması
İster developer olun ister sistemci ister devopscu monitoring hayatımızın olmassa olmazı. Daha önce yayınlamış olduğumuz Kubernetes Nedir? makalemize göz attıysanız şuan ki makalemizden devam edebiliriz. 3-5 ay önce k8s clusterlarımızın ssl expire tarihlerini kontrol ediyorduk, tabi o zamanlar bunu monitör etmiyorduk ve etmek de açıkcası pek aklımıza gelmemişti. Sonra güncellemeler vs ile bunun stabil hale getirilip sadece ssl için değil proxy, etcd vs gibi control plane komponentleri ile ds/deployment gibi data komponentlerini de gözetleme ihtiyacı oluştu. Sık sık restart eden var mı? Evict olan var mı? Image çekemeyen var mı? gibi gibi…
Hali hazırda zaten p8s(yazının devamında prometheus yerine bu ifadeyi kullanacağım ) kullanıyorduk. Ama bu klasik yaml’lar ile oluşturulmuş eski bir versiyonu.
Sorunlar
- K8s control panelinde bulunan yapılar ile ssl tarihleri, genel node vs durumları gibi daha çok k8s altyapısının gözetlenmesi,
- Giriş seviyede k8s bilen birinin bile yazdığı servisi kolayca p8s’e bağlayıp alarmlarını yazabilmesi,
- P8s her config değişimi için restart olması, hatalı config durumda çökmesinin önüne geçilmesi
Operatorlar Nedir?
K8s varsayılan haliyle gelen her bir komponentinin yaşam döngüsü vardır. Misal pod kalkarken initcontainer’ı varsa önce onu çalıştırır sonra problara bakar bir şekilde exit olmuşsa, ve eğer controlerı da varsa (deployment,replicaset vs ) yeni bir isimle kendini tekrar oluşturur. Bunun yanında deamonset’lerde durum farklıdır, her bir node’da kendini kaldırır ve rollout restart vs gibi durumlarda yeni pod oluşturmak için önce o node üzerindeki eski podun terminate etmesini bekler.
Buraya kadar kulağa hoş geliyor fakat ya sizin uygulamanızın kendine has yaşam döngüsü ihtiyaçları varsa ve kurulum ile gelen k8s objeleri yeterli gelmiyorsa napıcaz? Bu durumda devreye operatorlar giriyor. Kendi ihtiyaçlarınıza göre k8s objeleri ve yaşam döngüleri üretebiliyorsunuz. Bu yazının temel konusu bu olmadığı için daha fazla uzatmayacağım.
Neden p8s-stack?
Prometheus stack aslında prometheus ve komponentlerinin, k8s üzerinde optimum şekilde ve kolaylıkla çalışması için yazılmıs operatordır. Yazının ilerleyen bölümlerine bize ne gibi avantajlar verdiğinden bahsedeceğim.
Başlayalım
Öncelikle bilgisayarınıza veya kurulumu nerden yapıcaksanız, vm vs, helm3 yüklemeniz gerekiyor.
Not: Helm2 ile de yükleyebilirsiniz ama helm2’nin tiller bağımlılığı ve tiller’da güvenlik açığı bulunduğundan helm3 kullanmanızı tavsiye ediyorum.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
Helm reposunu ekleyelim. “Helm repo eklemek, apt’ye ppa eklemekten çokta farklı değil aslında, mantık olarak aynı, source-code’dan build edip kurup ya da deb paketlerini kurup dependency yönetimini sizin yerinize nasıl apt/yum/apk vs yapıyorsa helm’de k8s bağımlıklarını yönetiyor, ( deployment,service,pvc,rolebinding aklınıza ne gelirse )
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
Ppa ekledik, sıra apt-get update’de;
$ helm repo update
Sonunda;
$ helm install --namespace monitoring p8s-stack prometheus-community/kube-prometheus-stack -f prometheus-stack/values.yaml --version="${chartVersion}"
Burda chartVerison bölümü biraz isteğe bağlı isterseniz orayı kaldırıp latest ile devam edebilirsiniz.
Default values.yaml -> https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml
Not: Sadece değişiklik yaptığınız kısımları yazdığınız bir values.yaml hazırlayıp, apply ederken onu verirseniz, helm değişiklerinizi kolay takip edersiniz hem de default yamlın içindeki kalabalıkla
uğraşmazsınız.
Eğer typo vs yapmadıysanız helm komutu sonunda,
kube-prometheus-stack has been installed. Check its status by running: 42 kubectl --namespace monitoring get pods -l "release=p8s-stack" 43Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
çıktısı almanız gerekiyor. Eğer almadıysanız veya aldığınız halde bişeyler bozukssa, yazının sonuna bizim daha önce karşılaştığımız hataları ekledim, oraya bakabilirsiniz.
Prometheus ve Alertmanager Kurallarının Tanımlanması
prometheus-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
annotations:
labels:
app: kube-prometheus-stack
release: p8s-stack
name: kubernetesturkey-rules
namespace: monitoring
spec:
groups:
- name: kubernetesturkey-rules
rules:
- alert: HostHighCpuLoad
annotations:
description: |-
CPU load is > 80%
VALUE = {{ $value }}
LABELS: {{ $labels }}
summary: Host high CPU load (instance {{ $labels.instance }})
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
* 100) > 80
for: 5m
labels:
notification: kubernetesturkey
severity: critical
Prometheus rule’u her değiştirdiğimizde, her yeni bir tanımlama yaptığımızda, tek yapmamız gereken kubectl apply -f prometheus-rule.yaml yapıp arkamıza yaslamak.
Prometheus configi valid ise reload ederek uyguluyor, valid değil ise hata logunu basıyor.
Helm’e verdiğimiz values.yaml’da;
alertmanager:
config:
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 24h
receiver: 'default'
routes:
- receiver: 'kubernetesturkey-alerts'
match:
severity: 'critical'
continue: true
- receiver: 'default'
match:
alertname: 'Watchdog'
receivers:
- name: 'kubernetesturkey-alerts'
slack_configs:
- send_resolved: true
title: '[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }}'
text: |-
{{ if gt (len .Alerts.Firing) 0 }}
*Alerts Firing:*
{{ range .Alerts.Firing }}- {{ .Annotations.description }}
{{ .Annotations.message }}
{{ end }}{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
*Alerts Resolved:*
{{ range .Alerts.Resolved }}- {{ .Annotations.description }}
{{ .Annotations.message }}
{{ end }}{{ end }}
icon_emoji: ':alert:'
username: 'kubernetesturkey'
channel: '#kubernetesturkey-alerts'
api_url: 'Slack-web-hook'
- name: 'default'
Bonus
Güncellemek için;
helm upgrade --namespace monitoring p8s-stack prometheus-community/kube-prometheus-stack -f prometheus-stack/values.yaml --version="${chartVersion}"
Bilinen Hatalar
Hata-1
Error: unable to build kubernetes objects from release manifest: error validating “”: error validating data: [ValidationError(Prometheus.spec): unknown field “probeNamespaceSelector” in com.coreos.monitoring.v1.Prometheus.spec, ValidationError(Prometheus.spec): unknown field “probeSelector” in com.coreos.monitoring.v1.Prometheus.spec]
Çözüm-1
kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd podmonitors.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com kubectl delete crd thanosrulers.monitoring.coreos.com kubectl delete crd probes.monitoring.coreos.com`
Hata-2
Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [ValidationError(Prometheus.spec): unknown field "probeNamespaceSelector" in com.coreos.monitoring.v1.Prometheus.spec, ValidationError(Prometheus.spec): unknown field "probeSelector" in com.coreos.monitoring.v1.Prometheus.spec]
Çözüm-2
kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd podmonitors.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com kubectl delete crd thanosrulers.monitoring.coreos.com kubectl delete crd probes.monitoring.coreos.com`
Hata-3
fake kubeproxy fail alert
Çözüm-3
kubectl edit cm/kube-proxy -n kube-system
açılan editörden "metricsBindAddresi" localhost'dan 0.0.0.0'a çekin, kaydedip çıktıktan sonra kube-proxy rollout-restart edin.
...
metricsBindAddress: 0.0.0.0:10249
...
:wq
kubectl rollout restart ds kube-proxy -n kube-system
kubectl rollout status ds kube-proxy -n kube-system
Hata-4
logda many-to-many hatası
Çözüm-4
prometheus-rules.yaml'içerisindeki label kısmını kontrol edin;
....
app: kube-prometheus-stack // gibi
....
Bu makale : kubernetesturkey.com adresinden alıntıdır