複数routes、複数receiversなAlertmanagerConfigの書き方

ググってもパッと出てこなかったのでメモ。
結論から書くとこんな感じです。
ほとんどご自身の環境に書き換えてもらわないと使えませんが、
誰かの参考になれば幸いです。

結論

 1apiVersion: monitoring.coreos.com/v1alpha1
 2kind: AlertmanagerConfig
 3metadata:
 4  name: alertmanagerconfig
 5  namespace: payara
 6spec:
 7  receivers:
 8  - name: webhook-critical
 9    webhookConfigs:
10    - sendResolved: true
11      url: http://192.168.0.60:8084/4b1e5d0c-e59b-4688-8e42-31f536364c6d
12  - name: webhook-warning
13    webhookConfigs:
14    - sendResolved: true
15      url: http://192.168.0.60:8084/dd947e3b-d2b5-4ad2-b150-84123a394486
16  - name: webhook-default
17    webhookConfigs:
18    - sendResolved: true
19      url: http://192.168.0.60:8084/0300020f-bfe0-4c7a-872c-0ccc070f244e
20  route:
21    groupInterval: 5m
22    groupWait: 30s
23    receiver: webhook-default
24    repeatInterval: 5m
25    routes:
26    - matchers:
27      - name: severity
28        value: critical
29      - name: namespace
30        value: payara
31      receiver: webhook-critical
32    - matchers:
33      - name: severity
34        value: warning
35      - name: namespace
36        value: payara
37      receiver: webhook-warning

以下のprometheusルールでテストしました。

 1apiVersion: monitoring.coreos.com/v1
 2kind: PrometheusRule
 3metadata:
 4  name: payara-rule
 5  namespace: payara
 6spec:
 7  groups:
 8    - name: payara
 9      rules:
10        - alert: payara-cpu-utilization-critical
11          annotations:
12            description: Payara's CPU usage is over 90%
13          expr: >-
14            sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace="payara",container="payara"}) by (pod) / 
15            sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace="payara",container="payara"}) by (pod)
16            > 0.9
17          for: 0s
18          labels:
19            severity: critical
20            namespace: payara
21        - alert: payara-cpu-utilization-warning
22          annotations:
23            description: Payara's CPU usage is over 80%
24          expr: >-
25            sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace="payara",container="payara"}) by (pod) / 
26            sum(cluster:namespace:pod_cpu:active:kube_pod_container_resource_limits{namespace="payara",container="payara"}) by (pod)
27            > 0.8
28          for: 0s
29          labels:
30            severity: warning
31            namespace: payara

事前準備

こちら で構築したRKE2クラスターに Rancher Monitoring をインストールします。

root@k8s1:~# helm list -n cattle-monitoring-system
NAME                  	NAMESPACE               	REVISION	UPDATED                                	STATUS  	CHART                                   	APP VERSION
rancher-monitoring    	cattle-monitoring-system	1       	2024-02-21 10:29:09.154807489 +0000 UTC	deployed	rancher-monitoring-103.0.3+up45.31.1    	v0.65.1    
rancher-monitoring-crd	cattle-monitoring-system	1       	2024-02-21 10:27:29.246121896 +0000 UTC	deployed	rancher-monitoring-crd-103.0.3+up45.31.1

今回はwebhookで通知テストすることにしたので、webhook.site を利用しました。
arm64イメージはないっぽいのでVMにdocker-composeで自前で構築しました。
以下の部分です。

11url: http://192.168.0.60:8084/4b1e5d0c-e59b-4688-8e42-31f536364c6d

また、監視対象としてpayaraをdeploymentで2つ起動しました。
resourceのrequestとlimitは適当です。

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: payara
  name: payara
  namespace: payara
spec:
  replicas: 2
  selector:
    matchLabels:
      app: payara
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: payara
    spec:
      containers:
      - image: payara/server-full:6.2024.2-jdk21
        name: payara
        resources:
          requests:
            memory: "1024Mi"
            cpu: "1000m"
          limits:
            memory: "1024Mi"
            cpu: "1000m"

準備ができたらGrafanaで以下のようにCPU Limits %が取得できていると思います。
(Rancher MonitoringならGrafanaやダッシュボードはすでにあるはず)

rancher_alertmanagerconfig_01.png

今回はこのCPU使用率でアラート発報します。

yaml解説

Rancher GUIのalertmanagerconfig設定画面には以下のメッセージが表示されており、
複数routeの設定は現状できないため、kubectlでyamlをapplyしてください。

This form supports configuring one route that directs traffic to a receiver. Alerts can be directed to more receiver(s) by configuring child routes in YAML.

今回は、
Payara PodのCPU使用率が90%以上でcriticalアラート、
80%以上でwarningアラートするルールにして、
それぞれ別のURLにwebhook通知する流れとしました。

prometheusRule:

  • prometheusRuleの検知式は、Grafanaダッシュボードの設定を拝借しました。

  • 注意点としてnamespaceのラベルがないと通知されません。

18          labels:
19            severity: critical
20            namespace: payara

おそらくこちらのissue だと思います。
ただ書いてあるとおり、rancher monitoringインストール時に、
alertmanagerに以下の設定を入れると不要になると思います。

alertmanager:
  alertmanagerSpec:
    alertmanagerConfigMatcherStrategy:
      type: None

AlertmanagerConfig:

  • デフォルトのreceiverを設定しないとうまく通知できませんでした。
23    receiver: webhook-default
  • こちらにもnamespaceのラベル情報が必要です。
25    routes:
26    - matchers:
27      - name: severity
28        value: critical
29      - name: namespace
30        value: payara

発報テスト

一旦しきい値を0にしてfiringさせます。
これ強制的に発報することできないかな?

rancher_alertmanagerconfig_02.png

こんな感じに通知が届きました。

rancher_alertmanagerconfig_03.png

ひとまず良さそうですが、関係ない他のルールがfiringすると
デフォルト通知先に通知来ちゃいます。
これ通知しないようにできないかな?