Kubernetes  üzerine Prometheus Stack Kurulumu ve Ayarlanması

Kubernetes üzerine Prometheus Stack Kurulumu ve Ayarlanması

İster developer olun ister sistemci ister devopscu monitoring hayatımızın olmassa olmazı. 3-5 ay önce k8s clusterlarımızın ssl expire tarihlerini kontrol ediyorduk, tabi o zamanlar bunu monitor ettimiyorduk, etmek de açıkcası pek aklımıza gelmemişti. Sonra updateler 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 versinuydu.

Sorunlar

  • K8s control planeninde 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

....

Yorum Yapın