helm을 먼저 설치
https://sh970901.tistory.com/150
Helm, Helm chart
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션을 관리하기 위한 강력한 오케스트레이션 도구로 널리 사용되고 있다. 하지만 쿠버네티스의 기본적인 오브젝트(예: Deployment, Service, ConfigMap 등
sh970901.tistory.com
1. helm 설치
wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz
tar xvfz helm-v3.9.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
helm version
2. prometheus, grafana 패키지로 만들어진 helm repo를 추가한다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
3. kube-prometheus-statck을 다운로드한다. 개인적으로 해당 repo가 가장 구축하기 편리했다.
helm pull prometheus-community/kube-prometheus-stack
tar xfz kube-prometheus-stack-48.3.3.tgz
cd kube-prometheus-stack/
4. 해당 환경에 맞게 values.yaml 파일을 수정하자.
필자는 패스워드 변경하였고 외부 접근을 위해 svc 타입을 NodePort, 모니터링 관련 노드를 분리하기 위해 nodeSelector를 수정하였다.
vim values.yaml
## 원하는 설정 값 변경
nodeSelector:
nodetype: monitor
adminPassword: admin1234!
5. prometheus, grafana 설치
helm install prometheus . -n <네임스페이스명> -f values.yaml
helm list -n <네임스페이스명>
6. 대시보드 생성
필요한 대시보드의 json을 import 하여 사용하자.
사용 시 메트릭이 나오지 않는 것들이 있는데, 해당 지표의 promql을 보면 pod를 pod_name으로 조회하거나 하는 등 맞지 않는 경우가 있으니 prometheus 버전에 맞게 수정하여 사용하면 된다.
https://grafana.com/grafana/dashboards/
Grafana dashboards | Grafana Labs
No results found. Please clear one or more filters.
grafana.com
values.yaml 파일에서 프로메테우스, 그라파나, 알럿매니저 등에 대한 영속적으로 데이터를 저장하기 위해서 volumeClaimTemplate을 활성화하여 저장하도록 한다.
예시)
storageSpec:
## Using PersistentVolumeClaim
##
volumeClaimTemplate:
spec:
storageClassName: gp2
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
prometheus spec에서 prometheus rule selector 부분을 확인해서 만약 rule selector가 활성화되어 있는 경우에는 그에 맞는 label을 추가해야 한다.
helm values에서 확인할 때는 prometheus.prometheusSpec 의 ruleNamespaceSelector 와 ruleSelectorNilUsesHelmValues , ruleSelector 을 보면 된다.
kube-prometheus-stack에서 default values에는 helm values를 기반으로 생성되는 라벨을 포함해야만 prometheusRule이 prometheus에 적용된다.
따라서, 라벨이나 네임스페이스 상관 없이 모든 prometheus rule을 적용하도록 하려면 helm value에 아래 내용이 추가되어야 한다.
prometheus:
prometheusSpec:
ruleSelectorNilUsesHelmValues: false
rule selector 적용 여부는 prometheus라는 crd를 기반으로 생성된 custom resource에서도 확인 할 수 있다.
아래 코드처럼 PrometheusRule 을 정의한 파일을 선언하여 적용할 수 있다.
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: kube-prometheus-stack
release: prometheus-grafana
name: prometheus-alert-rule
namespace: monitoring
spec:
groups:
- name: network
rules:
- alert: IstioHighLatency
expr: histogram_quantile(0.95, sum(rate(istio_request_duration_milliseconds_bucket{reporter="destination"}[5m])) by (le, destination_service)) > 1000
for: 2m
labels:
severity: warning
annotations:
summary: "서비스 {{ $labels.destination_service }} 응답 지연 발생"
description: "95%의 요청이 1초를 초과했습니다."
이렇게 prometheus에서 수집된 데이터를 대상으로 useMethod를 활용해 알럿을 생성할 수 있다. 예시는 istio 관련 메트릭이기에 상황에 맞게 메소드를 수정하여 적용하면 된다.
알럿을 어디에 보낼지 적용하는 것은 어렵지 않다. 가장 예시가 많은 슬랙으로 예시를 들자.
values.yaml 파일에 slack webhook url을 지정해주고 메시지 본문에 템플릿을 만든 예시이다.
config:
global:
resolve_timeout: 5m
slack_api_url: 'https://hooks.slack.com/services/RAD131311/14RAD/DqwdqwdqdM0xkBDfq'
route:
group_by: ['namespace']
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receiver: 'slack-notifications'
routes:
- receiver: 'null'
matchers:
- alertname = "Watchdog"
receivers:
- name: 'null'
- name: 'slack-notifications'
slack_configs:
- channel: '#monitor'
username: 'prometheus'
send_resolved: true
icon_url: https://avatars3.githubusercontent.com/u/3380462
title: |-
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
text: >-
{{ range .Alerts -}}
*Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
*Description:* {{ .Annotations.description }}
*Details:*
{{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
{{ end }}
{{ end }}
templates:
- '/etc/alertmanager/config/*.tmpl'
default로 적용될 receivers를 지정할 수 있고 routes에 조건 별로 receivers를 지정할 수 있는 것으로 보인다.
이외 아이콘이나 메시지 본문을 지정할 수 있으니 필요시 참고 하도록하자.
필자의 경우 하기 그라파나 블로그를 참고하였다.
Step-by-step guide to setting up Prometheus Alertmanager with Slack, PagerDuty, and Gmail | Grafana Labs
Grafana Labs Team · 24 Feb 2025 · 11 min read Grafana Loki 101: How to ingest logs with Alloy or the OpenTelemetry Collector
grafana.com
'IT' 카테고리의 다른 글
쿠버네티스[EKS] argocd 설치 및 AWS ALB 외부 노출, Slack 설정 (0) | 2024.10.09 |
---|---|
쿠버네티스[EKS] EFK (Elastic, Fluent-bit, Kibana) helm 설치 (1) | 2024.10.09 |
Helm, Helm chart (0) | 2024.08.26 |
Pinpoint-docker 설치하고 적용하기 [ agent 분리 ] (0) | 2024.08.25 |
ElasticSearch&Kibana v8.15 docker 설치 & 토큰 발급 (0) | 2024.08.24 |