본문 바로가기

Observability/Prometheus

[Prometheus]Install prometheus for kubernetes monitoring with helm chart

Concept

Prometheus is an open-source systems monitoring and alerting toolkit originally and Most services have an Exporter

Prometheus Exporter List 참고 link


Prometheus architecture

Overview | Prometheus

Prometheus server

시계열 데이터를 수집해서 저장

Client libarary

어플리케이션을 개발할 때 프로메테우스에서 데이터를 수집하도록 만드는 라이브러리

Push gateway

클라이언트에서 직접 프로메테우스로 데이터를 보낼 때 받는 역할

Exporter

프로메테우스 클라이언트 라이브러리를 내장해 만들지 않은 어플리케이션에서 데이터를 수집.
100개가 넘는 다양한 익스포터가 있으므로 거의 모든 어플리케이션에서 데이터를 수집할 수 있다.

Alert manager

알람을 보낼 때 중복 처리, 그룹화 등을 알람을 어디로 보낼지 관리한다.


Helm chart download

Helm Chart를 이용하여 prometheus, alertmanager, grafana를 쉽게 설치 할 수 있다.

Helm chart 사용 방법
2022.05.24 - [Container/Kubernetes] - [Kubernetes]Understand how to use helm chart in Kubernetes

아래 내용은 chart name "kube-prometheus-stack" 을 사용하여 설치 과정을 진행하지만 각 각의 Chart를 따로 설치하여도 문제 없이 사용할 수 있다.

## add repo
helm repo add prometheus-community <https://prometheus-community.github.io/helm-charts>

## download chart and unzip
helm fetch prometheus-community/kube-prometheus-stack
tar zxvf kube-prometheus-stack-35.3.1.tgz

Edit values.yaml

# rule
92 additionalPrometheusRulesMap: ## customrule 작성, 아래 예시 참고

# alertmanager
260   ingress:
261     enabled: true
267     annotations:
268       kubernetes.io/ingress.class: alb
269       alb.ingress.kubernetes.io/scheme: internet-facing
270       alb.ingress.kubernetes.io/target-type: ip
271       alb.ingress.kubernetes.io/success-codes: 200,301,302

# grafana
758   persistence: # helm chart에는 없는 부분이라 직접 입력해준다.
759     type: pvc
760     enabled: true
761     storageClassName: default
762     accessModes:
763       - ReadWriteOnce
764     size: 10Gi
781   defaultDashboardsTimezone: kst
783   adminPassword: devops@grepp.co
790   ingress:
793     enabled: true
802     annotations
803     kubernetes.io/ingress.class: alb
804       alb.ingress.kubernetes.io/scheme: internet-facing
805       alb.ingress.kubernetes.io/target-type: ip
806       alb.ingress.kubernetes.io/success-codes: 200,301,302

# prometheus
2497   ingress:
2498     enabled: true
2504     annotations:
2505       kubernetes.io/ingress.class: alb
2506       alb.ingress.kubernetes.io/scheme: internet-facing
2507       alb.ingress.kubernetes.io/target-type: ip
2508       alb.ingress.kubernetes.io/success-codes: 200,301,302
2509     paths:
2510      - "/*"
2981     resources:
2982       requests:
2983         memory: 1000Mi
2988     storageSpec:
2989       volumeClaimTemplate:
2990         spec:
2991           storageClassName: default
2992           accessModes: ["ReadWriteOnce"]
2993           resources:
2994             requests:
2995               storage: 20Gi


3023
additionalScrapeConfigs: #[] ## 추가로 Targets(exporter)를 연결, 아래 예시 참고
    - job_name: stackdriver
      static_configs:
      - targets:
        - 34.64.95.152:9255
    - job_name: cloudwatch
      static_configs:
      - targets:
        - p-1-prometheus-cloudwatch-exporter.monitoring.svc.cluster.local:9106
  • additionalPrometheusRulesMap: 기본으로 제공되는 rule이외에 custom rule을 등록하기 위함.
  • alertmanager.service.type, grafana.service.type, prometheus.service.type : alertmanager, grafana, prometheus의 WEB UI로 접속하기 위한 옵션. 여기서는 LoadBalancer를 사용했지만 Ingress를 등록하거나 NodePort로 서비스를 노출하여 사용할 수도 있다.
  • prometheusSpec.retention: 데이터 보관 주기 설정
  • additionalScrapeConfigs: 추가로 Target(exporter)를 연결하기 위한 설정.
scrape_config doc 참고
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config

Stackdriver exporter 설치 방법
2022.05.29 - [Monitoring/Prometheus] - [Prometheus](GCP)Install stackdriver-exporter with helm chart

Cloudwatch exporter 설치 방법

2022.07.11 - [Monitoring/Prometheus] - [Prometheus](AWS)Install Cloudwatch-exporter with helm chart

additionalPrometheusRulesMap - Example

자세한 내용은 위의 해당하는 exporter 링크 참고

additionalPrometheusRulesMap: #{}
  rule-name:
    groups:
    - name: "GCP-monitoring.rules"
      rules:
        - alert: GCE CPU over 80 %
          labels:
            severity: warning #critical
          for: 3m
          expr: sum by (instance, instance_name, project_id, zone)(stackdriver_gce_instance_compute_googleapis_com_instance_cpu_utilization) / sum by (instance, instance_name, project_id, zone)(stackdriver_gce_instance_compute_googleapis_com_instance_cpu_reserved_cores) * 100 > 80
          annotations:
            message: GCE CPU over 80 % for 1 min
        - alert: LB Health Check failure
          labels:
            severity: warning #critical
          for: 1m
          expr: sum(stackdriver_pubsub_topic_pubsub_googleapis_com_topic_message_sizes_count) > 0
          annotations:
            message: LB Health Check failure
        - alert: GKE MEM over 85 %
          labels:
            severity: warning #critical
          for: 3m
          expr: round(sum by(cluster_name, instance, location, node_name, project_id)(stackdriver_k_8_s_node_kubernetes_io_node_memory_used_bytes) / sum by(cluster_name, instance, location, node_name, project_id)(stackdriver_k_8_s_node_kubernetes_io_node_memory_total_bytes) * 100, 0.01) > 85
          annotations:
            message: GKE MEM over 85 % for 1min

additionalScrapeConfigs - Example

additionalScrapeConfigs: #[]
    - job_name: stackdriver
      static_configs:
      - targets:
        - 10.148.13.40:9255
		- job_name: cloudwatch
      static_configs:
      - targets:
        - p-1-prometheus-cloudwatch-exporter.monitoring.svc.cluster.local:9106

Deploy prometheus helm chart

kubectl create ns monitoring
helm install prometheus . -n monitoring

## values.yaml 수정사항이 있는 경우 아래 명령어로 업그레이드
helm upgrade prometheus -f ./values.yaml . -n monitoring

  • helm chart를 설치하면 additionalScrapeConfigs 에서 설정했던 job_name 을 Targets에서 확인할 수 있다.
    • stackdriver exporter뿐만 아니라 여러 exporter가 존재하며 필요에 맞게 설정하여 사용할 수 있다.

 

prometheus exporter doc
https://prometheus.io/docs/instrumenting/exporters/