새소식

AWS/EKS

[PKOS Study 4주차] k8s Monitoring - Alert Manager

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 PKOS 2기 Study 내용 요약

해당 Kubernetes Study 는 '24단계 실습으로 정복하는 쿠버네티스' 책을 기반으로 진행 중입니다.

 

이번 포스팅에서는 프로메테우스에서 장애 메시지 전달을 위해 사용하는 얼럿 매니저(Alert Manager) 에 대해 알아보겠습니다.

 

0. 실습 과제

  1. 프로메테우스 & 얼럿 매니저의 경고 기능 확인
  2. Slack 채널을 통한 경고 메시지 전달

 

0.1. Prometheus Stack 설치

 

kube-prometheus-stack 45.8.1 · prometheus/prometheus-community

kube-prometheus-stack collects Kubernetes manifests, Grafana dashboards, and Prometheus rules combined with documentation and scripts to provide easy to operate end-to-end Kubernetes cluster monitoring with Prometheus using the Prometheus Operator.

artifacthub.io

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

 

상황에 맞게 설정 변경 후 배포

alertmanager:
    type: NodePort

prometheus:
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"

 

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack

 

1. Alert Manager

프로메테우스는 임곗값 설정에 의해 경고 메시지가 발생하면 이를 얼럿 매니저에게 푸시 이벤트로 전달하고,
얼럿매니저는 이를 그룹화, 일시 중지(Silence) 등의 가공 과정을 거쳐 이메일, Slack 등을 통해 사용자에게 전달합니다.

 

출처) https://www.oreilly.com/library/view/prometheus-up/9781492034131/ch18.html

 

 

1.1. 경고 시스템 구성 요건

  1. 사용자가 빠르게 이해할 수 있는 메시지

시스템 경고 메시지만으로 운영자는 장애의 근본 원인을 빠르게 파악할 수 있어야 한다.
ex) 시간에 따른 변화량 그래프

 

  1. 심각도 구분, 경고 주기 설정

너무 잦은 경고 메시지 발송은 담당자에게 피로감을 줌.
정작 필요한 메시지를 놓치는 상황이 발생하므로 심각도발송 주기를 적절하게 관리

 

  1. 효과적인 채널 선택

슬랙, 이메일, 문자 등

 

  1. 정확한 담당자에게 전달

에러 메시지별 구분, 심각도에 따라 전체 시스템 담당자 조회 기능 추가

 

 

1.2. 프로메테우스 경고 기능

프로메테우스 Web UI - Alert

 

  1. Inactive 비활성화

프로메테우스 룰에 등록한 메시지 중 정상적인 상태

 

  1. Pending 지연

설정된 임곗값을 초과해서 경고 상황이 발생했으나, 메시지 전달 전까지 설정한 임곗값 시간을 초과하지 않은 상태
이를 통해, 오탐과 자동 복구된 에러 메시지 처리

 

  1. Firing 경보

임곗값과 임계 시간을 초과해서 경보가 발생한 메시지.
해당 메시지는 얼럿매니저에 전달되어 얼럿매니저를 통해 담당자에게 전달됨

 

 

Watchdog 메시지는 얼럿매니저 정상 작동 여부를 확인하기 위해 발생하는 메시지, 실제 장애와는 관련이 없습니다.

 

1.3. 얼럿매니저 경고 기능

얼럿매니저 Web UI

 

  1. Silence 일시 중지

작업 등의 계획된 서비스 다운으로 경고 메시지를 받고 싶지 않을 때, 임시 중단하도록 설정 가능

 

  1. Status 상태

얼럿매니저 설정 확인, 메시지를 전달 받을 방법 (슬랙, 텔레그램 등) 확인 가능

 

 

2. Alert Manager 활용

2.1. Slack 연동

Alert Manager 는 메시지 전달을 위한 설정을 alertmanager.yaml 에서 관리합니다.
해당 파일은 프로메테우스 헬름 차트의 values.yaml 을 수정하면 됩니다.

 

앞서 프로메테우스 스택으로 설치했기 때문에, Alert Manager 설정 파일 생성 후 헬름 업그레이드로 헬름 차트를 변경하겠습니다.

 

cat <<EOT > ~/alertmanager-slack.yaml
alertmanager:
  config:
    global:
      resolve_timeout: 5m
      slack_api_url: '<SLACK_WEBHOOK_URL>'
    route:
      group_by: ['job']  # namespace
      group_wait: 10s
      group_interval: 1m
      repeat_interval: 5m
      receiver: 'slack-notifications'
      routes:
      - receiver: 'slack-notifications'
        matchers:
          - alertname =~ "InfoInhibitor|Watchdog"
    receivers:
    - name: 'slack-notifications'
      slack_configs:
      - channel: '#k8s-alert'
        send_resolved: true
        title: '[{{.Status | toUpper}}] {{ .CommonLabels.alertname }}'
        text: |
          *Description:* {{ .CommonAnnotations.description }}
EOT

 

헬름 업그레이드

helm upgrade kube-prometheus-stack prometheus-community/kube-prometheus-stack --reuse-values -f alertmanager-slack.yaml --namespace monitoring

 

반영 되면 해당 슬랙 채널에 알림이 전달됩니다.

 

2.2. Silence 기능

시스템 유지 보수 등과 같이 서비스를 계획적으로 중단할 경우, 경고 메시지 전송 기능을 일시 중지할 수 있습니다.

 

2.3. PrometheuseRule 정책 설정

프로메테우스는 CRD 를 통해 규칙을 관리합니다.

kubectl get -n monitoring crd prometheusrules.monitoring.coreos.com

 

  • 해당 CRD 에는 여러 규칙이 있지만 실습을 위해 Node Exporter 의 FileSystem 관련 정책을 변경하겠습니다.
kubectl get prometheusrule.monitoring.coreos.com/kube-prometheus-stack-node-exporter -n monitoring -o yaml > alert-rules.yaml

 

 

여유 공간이 50% 미만이면 경고 발생 규칙

NodeFilesystemAlmostOutOfFiles 규칙을 찾아 다음과 같이 변경합니다.

- alert: NodeFilesystemAlmostOutOfSpace-50%
      annotations:
        description: Filesystem on {{ $labels.device }} at {{ $labels.instance }}
          has only {{ printf "%.2f" $value }}% available space left.
        runbook_url: https://runbooks.prometheus-operator.dev/runbooks/node/nodefilesystemalmostoutofspace
        summary: Filesystem has less than 50% space left.
      expr: |-
        (
          node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""} * 100 < 50
        and
          node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0
        )
      for: 1m
      labels:
        severity: warning

 

 

Worker Node 에 접속하여 임의의 큰 파일을 생성합니다.

df -h

 

 

sudo fallocate /var/80G -1 80g
df -h

 

 

프로메테우스 UI

 

얼럿매니저 UI

 

슬랙 메시지

Contents

포스팅 주소를 복사했습니다