kubernetes

alertmanager & slack 연동 및 경보

mingming_96 2023. 9. 25. 11:53

Alertmangaer

Prometheus Alertmanager는 Prometheus 모니터링 시스템의 일부로 사용되는 오픈 소스 알람 관리자입니다. Alertmanager는 Prometheus 서버로부터 수집된 경고 및 알람을 처리하고 라우팅하며, 이를 통해 시스템 관리자 및 개발자에게 모니터링 이벤트 및 잠재적인 문제에 대한 통지를 관리하는 데 도움을 줍니다.

slack webhook

수신받을 채널을 생성 후 수신 웹훅을 추가합니다. 생성된 URL 을 기록해줍니다.

 

Edit values.yaml

경보 구성 및 실습에 필요한 걊을 수정합니다

vim prometheus-values.yaml

 648     loadBalancerIP: ""
 649     loadBalancerSourceRanges: []
 650     servicePort: 80
 651     sessionAffinity: None
 652     type: LoadBalancer
 
 687 serverFiles:
 688   ## Alerts configuration
 689   ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
 690   alerting_rules.yml:
 691     groups:
 692       - name: Node
 693         rules:
 694           - alert: NodeDown
 695             expr: up{job="kubernetes-nodes"} == 0
 696             for: 1m
 697             labels:
 698               severity: page
 699             annotations:
 700               description: kubernetes node {{ .Labels.instance }} down
 701   #           summary: 'Instance {{ $labels.instance }} down'

prometheus-server 경보 규칙 생성 및 서비스 타입을 로드밸런서로 변경해줍니다. 

 

1215   config:
1216     global:
1217       resolve_timeout: 5m
1218     route:
1219       group_wait: 10s
1220       group_interval: 1m
1221       repeat_interval: 5m
1222       receiver: 'slack-notifier'
1223     receivers:
1224     - name: 'slack-notifier'
1225       slack_configs:
1226       - api_url: 'https://hooks.slack.com/services/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'
1227         channel: '#kubernetes-node-notice'
1228         send_resolved: true
1229         title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
1230         text: >-
1231           *Description:* {{ .CommonAnnotations.description }}
1232   service:
1233     ## If false, no Service will be created for the Prometheus server
1234     ##  
1235     enabled: true
1236 
1237     annotations: {}
1238     labels: {}
1239     clusterIP: ""
1240 
1241     ## List of IP addresses at which the Prometheus server service is available
1242     ## Ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips
1243     ##  
1244     externalIPs: []
1245 
1246     loadBalancerIP: ""
1247     loadBalancerSourceRanges: []
1248     servicePort: 80
1249     sessionAffinity: None
1250     type: LoadBalancer

alertmanager 경보 생성 및 서비스 타입 로드밸런서로 변경

 

변경사항 적용

helm upgrade 명령어를 통해 변경사항을 적용시킵니다.

helm upgrade prometheus prometheus/prometheus -f prometheus-values.yaml

프로메테우스 서버 웹 접속후 alert 탭으로 이동하면 

위와 같은 경보 규칙이 생긴 것을 확인할 수 있습니다.

 

경보발생

노드 하나를 종료해 경보상황을 만들어 줍니다. 노드 종료 후 잠시 기다리면 다음과 같은 경보 메세지를 슬랙채널을 통해 받아 볼 수 있습니다. 

프로메테우스 서버의 경보창에서도 경보상황을 확인할 수 있습니다.

pending 상태 돌입
Firing 상태
alertmanager web ui

다시 노드를 실행시키면 다음과 같이 알림이 오게되고, 경보가 상황이 해소됩니다.

이처럼 특정 상황에 대한 경보규칙과 경보를 생성해 다양한 플랫폼을 통해 알림을 받아볼 수 있습니다. 프로메테우스 기술문서를 통해 상황에 맞는 템플릿을 참고 할 수 있습니다.

 

prometheus-alertmanager configmap

위에서 실습한 것 처럼 values.yaml 파일을 수정해서 배포해도 되지만, 미리 생성해둔 configmap.yaml 파일을 통해서도 경보를 생성할 수 있습니다. 

실제로 values.yaml 파일에 수정한 부분이 alertmanager configmap에 기록되어 있는 것을 확인할 수 있습니다.

kubectl edit configmap prometheus-alertmanager
apiVersion: v1
data:
  alertmanager.yml: |
    global:
      resolve_timeout: 5m
    receivers:
    - name: slack-notifier
      slack_configs:
      - api_url: slack url
        channel: '#kubernetes-node-notice'
        send_resolved: true
        text: '*Description:* {{ .CommonAnnotations.description }}'
        title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
    route:
      group_interval: 1m
      group_wait: 10s
      receiver: slack-notifier
      repeat_interval: 5m
    templates:
    - /etc/alertmanager/*.tmpl
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: prometheus
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-09-18T04:23:46Z"
  labels:
    app.kubernetes.io/instance: prometheus
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/version: v0.26.0
    helm.sh/chart: alertmanager-1.6.0
  name: prometheus-alertmanager
  namespace: default
  resourceVersion: "348163"
  uid: 99f68981-6b5a-4cfc-b02b-a339c587107e