OpenShift のアラート通知の設定

OpenShift のアラート通知の設定

はじめに

この時期にのみ記事を書いている気がしますが、OpenShift Advent Calendar 2024 の 12月5日の記事です。サンタクロースへの手紙をそろそろ書かないと欲しいプレゼントが届かない可能性がでてくる時期になりました。正しく届けないと悲しいクリスマスになるかもしれません。 OpenShift クラスターにおいても、アラートの届け先が大事です。正しく届けないと休みを返上することになるかもしれません。

qiita.com

ここでは OpenShift の Cluster Monitoring における AlertManager の利用について整理します。

OpenShift のモニタリングスタック

下の図は Cluster Monitoring 及び User Workload Monitoring の構成を表したものです。赤の点線で optional と書かれている部分は利用者の設定により追加することが可能なコンポーネントになります。

ここで簡単ですが、Cluster Monitoring と User Workload Monitoring が何かを確認しておきます。

Cluster Monitoring

製品ドキュメントの記述をそのままもってきますと以下のように記載があります。

A set of platform monitoring components are installed in the openshift-monitoring project by default during an OpenShift Container Platform installation. This provides monitoring for core cluster components including Kubernetes services. The default monitoring stack also enables remote health monitoring for clusters.

These components are illustrated in the Installed by default section in the following diagram.

OpenShift インストール時にデフォルトで openshift-monitoring プロジェクトにインストールされるプラットフォームのモニタリングコンポーネントのセット。Kubernetes サービスを含む OpenShift のコアコンポーネントのモニタリングを提供します。デフォルトで用意されているモニタリングスタックはリモートからクラスタの状態をモニタリングする機能も備えています。

User Workload Monitoring

同様に、User Workload Monitoring についてです。

After optionally enabling monitoring for user-defined projects, additional monitoring components are installed in the openshift-user-workload-monitoring project. This provides monitoring for user-defined projects. These components are illustrated in the User section in the following diagram.

ユーザ定義プロジェクト用のモニタリングを有効にしたあと、openshift-user-workload-monitoring プロジェクトに追加のモニタリングコンポーネントがインストールされます。ユーザが定義するプロジェクトのモニタリングを提供します。

文章では触れていませんが、User Workload Monitoring のコンポーネントにも AlertManager が登場します。OpenShift では AlertManager が2つ利用することができます。

ここでは、Cluster Monitoring と User Workload Monitoring の用途を言いやすくするために、管理者用の(Cluster Monitoring)と利用者用の(User Workload Monitoring)という言葉をつかって以降記載していきます。

アラート通知のコントロール

管理者はクラスターの状況を監視しますが、利用者も同様に運用するアプリケーションの監視を行います。アラートの通知を行いたいとか、通知先を個別に管理したいとか要望があるかと思いますが、OpenShift では以下のケースに対応することができます。

  1. 利用者はアラート通知を行いたいが、通知先は管理者により管理される
  2. 利用者はアラート通知を行いたい、かつ通知先も利用者が管理したい
  3. 管理者もカスタムでアラートを追加するため利用者と負荷を分散したい(利用者は通知先の設定を自分で管理しなければならなくなる)

このあと、一つ一つ設定と実機による確認をしていきます。実機確認は OpenShift 4.17 を利用し、管理者用の AlertManager の通知先は Slack としています。利用者用の通知先も同じく Slack を利用します。 センシティブな情報については、マスクを掛けますので試す場合は個々の環境に読み替えてください。

ケース1 利用者はアラートの設定だけ行いたい

OpenShift では利用者用のMonitoringを有効にすることで、利用者によるアラート設定が行えます。この場合は通常 AlertManager は管理者用のものだけになるため、アラートの通知先は管理者によってのみ管理されます。検証に使うアラートは alert-sample プロジェクトに ExampleUserAlert という名前のアラートを定義して確認します。 管理者用と利用者用の Monitoring の設定は次のようになります。

管理者用の Monitoring の設定

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-monitoring-config
  namespace: openshift-monitoring
data:
  config.yaml: |
    enableUserWorkload: true

利用者用の Monitoring の設定はアラート通知については不要です。

この設定で、利用者がアラートを設定しアラートが通知されると管理者用の AlertManager に通知が届きます。 雑ですが、以下のスクリプトで状況を確認していきます。

echo "User: alerts"
oc exec -it alertmanager-user-workload-0 -n openshift-user-workload-monitoring -- amtool alert query --alertmanager.url http://localhost:9093

echo "Cluster: alerts"
oc exec -it alertmanager-main-1 -n openshift-monitoring -- amtool alert query --alertmanager.url http://localhost:9093

echo "User workload: alertmanager.yaml"
oc exec -it alertmanager-user-workload-0 -n openshift-user-workload-monitoring -- cat /etc/alertmanager/config_out/alertmanager.env.yaml; echo ""

echo "Cluster: alertmanager.yaml"
oc exec -it alertmanager-main-1 -n openshift-monitoring -- cat /etc/alertmanager/config_out/alertmanager.env.yaml; echo ""

確認結果は以下の通りとなります。管理者用の AlertManager しかないこともありますが、管理者用の AlertManager に通知が上がっていることが確認できます。そして、通知先は管理者が設定したSlackのみが指定されています。

User: alerts
Error from server (NotFound): pods "alertmanager-user-workload-0" not found

Cluster: alerts
Alertname                            Starts At                Summary                                                                                                State
Watchdog                             2024-12-05 23:06:52 UTC  An alert that should always be firing to certify that Alertmanager is working properly.                active
UpdateAvailable                      2024-12-05 23:07:36 UTC  Your upstream update recommendation service recommends you update your cluster.                        active
PrometheusOperatorRejectedResources  2024-12-05 23:12:32 UTC  Resources rejected by Prometheus operator                                                              active
InsightsRecommendationActive         2024-12-05 23:15:03 UTC  An Insights recommendation is active for this cluster.                                                 active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
ClusterNotUpgradeable                2024-12-06 00:07:40 UTC  One or more cluster operators have been blocking minor version cluster upgrades for at least an hour.  active
PrometheusDuplicateTimestamps        2024-12-06 00:07:55 UTC  Prometheus is dropping samples with duplicate timestamps.                                              active
PrometheusDuplicateTimestamps        2024-12-06 00:07:55 UTC  Prometheus is dropping samples with duplicate timestamps.                                              active
PodDisruptionBudgetAtLimit           2024-12-06 00:09:08 UTC  The pod disruption budget is preventing further disruption to pods.                                    active
ExampleUserAlert                     2024-12-06 12:19:23 UTC  This is sample summary                                                                                 active

User workload: alertmanager.yaml
Error from server (NotFound): pods "alertmanager-user-workload-0" not found

Cluster: alertmanager.yaml
inhibit_rules:
  - equal:
      - namespace
      - alertname
    source_matchers:
      - severity = critical
    target_matchers:
      - severity =~ warning|info
  - equal:
      - namespace
      - alertname
    source_matchers:
      - severity = warning
    target_matchers:
      - severity = info
receivers:
  - name: Critical
  - name: Default
    slack_configs:
      - channel: '#openshift-on-kvm'
        api_url: >-
          https://hooks.slack.com/services/XXXXXX
  - name: Watchdog
route:
  group_by:
    - namespace
  group_interval: 5m
  group_wait: 30s
  receiver: Default
  repeat_interval: 12h
  routes:
    - matchers:
        - alertname = Watchdog
      receiver: Watchdog
    - matchers:
        - severity = critical
      receiver: Critical

ケース2 利用者はアラートの設定も通知先の設定も行いたい

利用者がアラートの通知先を設定するには AlertmanagerConfig リソースを設定しその設定を管理者用の AlertManager に設定する必要があります。利用者が作成する AlertManagerConfig リソースは、Namespace スコープのリソースとなるため、Namespace/Project ごとに設定が必要となります。

設定は次のとおりとなります。

管理者用の Monitoring の設定

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-monitoring-config
  namespace: openshift-monitoring
data:
  config.yaml: |
    enableUserWorkload: true 
    alertmanagerMain:
      enableUserAlertmanagerConfig: true

利用者用の Monitoring の設定はアラート通知については不要です。

この設定を実施した状態で、AlertmanagerConfig を設定します。通知先である Slack の URL は webhook Secret の url Key として定義しています。

apiVersion: monitoring.coreos.com/v1beta1
kind: AlertmanagerConfig
metadata:
  name: slack-routing
spec:
  route:
    receiver: sample
  receivers:
  - name: sample
    slackConfigs:
     - channel: '#openshift-on-kvm'
       apiURL:
         name: webhook
         key: url

サンプルのアラートを設定してしばらくたったあとの確認結果は次のとおりとなります。アラートは管理者用の AlertManager に通知され、かつ、alert-sample プロジェクト用の通知先が設定されているのが確認できます。

User: alerts
Error from server (NotFound): pods "alertmanager-user-workload-0" not found

Cluster: alerts
Alertname                            Starts At                Summary                                                                                                State
Watchdog                             2024-12-05 23:06:52 UTC  An alert that should always be firing to certify that Alertmanager is working properly.                active
UpdateAvailable                      2024-12-05 23:07:36 UTC  Your upstream update recommendation service recommends you update your cluster.                        active
PrometheusOperatorRejectedResources  2024-12-05 23:12:32 UTC  Resources rejected by Prometheus operator                                                              active
InsightsRecommendationActive         2024-12-05 23:15:03 UTC  An Insights recommendation is active for this cluster.                                                 active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
ClusterNotUpgradeable                2024-12-06 00:07:40 UTC  One or more cluster operators have been blocking minor version cluster upgrades for at least an hour.  active
PrometheusDuplicateTimestamps        2024-12-06 00:07:55 UTC  Prometheus is dropping samples with duplicate timestamps.                                              active
PrometheusDuplicateTimestamps        2024-12-06 00:07:55 UTC  Prometheus is dropping samples with duplicate timestamps.                                              active
PodDisruptionBudgetAtLimit           2024-12-06 00:09:08 UTC  The pod disruption budget is preventing further disruption to pods.                                    active
ExampleUserAlert                     2024-12-06 12:19:23 UTC  This is sample summary                                                                                 active

User workload: alertmanager.yaml
Error from server (NotFound): pods "alertmanager-user-workload-0" not found


Cluster: alertmanager.yaml
route:
  receiver: Default
  group_by:
  - namespace
  routes:
  - receiver: alert-sample/slack-routing/sample
    matchers:
    - namespace="alert-sample"
    continue: true
  - receiver: Watchdog
    matchers:
    - alertname = Watchdog
  - receiver: Critical
    matchers:
    - severity = critical
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
inhibit_rules:
- target_matchers:
  - severity =~ warning|info
  source_matchers:
  - severity = critical
  equal:
  - namespace
  - alertname
- target_matchers:
  - severity = info
  source_matchers:
  - severity = warning
  equal:
  - namespace
  - alertname
receivers:
- name: Critical
- name: Default
  slack_configs:
  - api_url: https://hooks.slack.com/services/XXXXX
    channel: '#openshift-on-kvm'
- name: Watchdog
- name: alert-sample/slack-routing/sample
  slack_configs:
  - api_url: https://hooks.slack.com/services/YYYYYY
    channel: '#openshift-on-kvm'
templates: []

AlertManager のレシーバーの名前が alert-sample/slack-routing/sample と長いですが、Namespace が alert-sample の場合はこちらに通知されます。

ケース3 管理者も多くのアラート通知を行うので、利用者の負荷と分散したい場合

こちらは利用者の要望ではなく、管理者側の要望で、利用者のアラート通知と管理者のアラート通知の負荷を分散するために、個別に AlertManager を利用することを考えます。

設定は次のとおりとなり、利用者用の Monitoring に Alertmanager の有効化と、AlertmanagerConfig の有効化が設定されます。

管理者用の Monitoring の設定

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-monitoring-config
  namespace: openshift-monitoring
data:
  config.yaml: |
    enableUserWorkload: true

利用者用の Monitoring の設定

apiVersion: v1
kind: ConfigMap
metadata:
  name: user-workload-monitoring-config
  namespace: openshift-user-workload-monitoring
data:
  config.yaml: |
    alertmanager:
      enabled: true
      enableAlertmanagerConfig: true      

この設定を行った状態で、AlertmanagerConfig を設定します。設定内容は前回と同様に次のとおりです

apiVersion: monitoring.coreos.com/v1beta1
kind: AlertmanagerConfig
metadata:
  name: slack-routing
spec:
  route:
    receiver: sample
  receivers:
  - name: sample
    slackConfigs:
     - channel: '#openshift-on-kvm'
       apiURL:
         name: webhook
         key: url

サンプルのアラートを設定してしばらくたったあとの確認結果は次のとおりとなります。アラートは利用者用の AlertManager に通知され、かつ、alert-sample プロジェクト用の通知先も利用者用のAlertManager に設定されているのが確認できます。

User: alerts
Alertname         Starts At                Summary                 State
ExampleUserAlert  2024-12-06 12:47:43 UTC  This is sample summary  active

Cluster: alerts
Alertname                            Starts At                Summary                                                                                                State
Watchdog                             2024-12-05 23:06:52 UTC  An alert that should always be firing to certify that Alertmanager is working properly.                active
UpdateAvailable                      2024-12-05 23:07:36 UTC  Your upstream update recommendation service recommends you update your cluster.                        active
PrometheusOperatorRejectedResources  2024-12-05 23:12:32 UTC  Resources rejected by Prometheus operator                                                              active
InsightsRecommendationActive         2024-12-05 23:15:03 UTC  An Insights recommendation is active for this cluster.                                                 active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetMisScheduled            2024-12-05 23:22:49 UTC  DaemonSet pods are misscheduled.                                                                       active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
KubeDaemonSetRolloutStuck            2024-12-05 23:37:49 UTC  DaemonSet rollout is stuck.                                                                            active
ClusterNotUpgradeable                2024-12-06 00:07:40 UTC  One or more cluster operators have been blocking minor version cluster upgrades for at least an hour.  active
PrometheusDuplicateTimestamps        2024-12-06 00:07:55 UTC  Prometheus is dropping samples with duplicate timestamps.                                              active
PrometheusDuplicateTimestamps        2024-12-06 00:07:55 UTC  Prometheus is dropping samples with duplicate timestamps.                                              active
PodDisruptionBudgetAtLimit           2024-12-06 00:09:08 UTC  The pod disruption budget is preventing further disruption to pods.                                    active

User workload: alertmanager.yaml
route:
  receiver: Default
  group_by:
  - namespace
  routes:
  - receiver: alert-sample/slack-routing/sample
    matchers:
    - namespace="alert-sample"
    continue: true
receivers:
- name: Default
- name: alert-sample/slack-routing/sample
  slack_configs:
  - api_url: https://hooks.slack.com/services/YYYYY
    channel: '#openshift-on-kvm'
templates: []


Cluster: alertmanager.yaml
inhibit_rules:
  - equal:
      - namespace
      - alertname
    source_matchers:
      - severity = critical
    target_matchers:
      - severity =~ warning|info
  - equal:
      - namespace
      - alertname
    source_matchers:
      - severity = warning
    target_matchers:
      - severity = info
receivers:
  - name: Critical
  - name: Default
    slack_configs:
      - channel: '#openshift-on-kvm'
        api_url: >-
          https://hooks.slack.com/services/XXXXX
  - name: Watchdog
route:
  group_by:
    - namespace
  group_interval: 5m
  group_wait: 30s
  receiver: Default
  repeat_interval: 12h
  routes:
    - matchers:
        - alertname = Watchdog
      receiver: Watchdog
    - matchers:
        - severity = critical
      receiver: Critical

まとめ

アラートの通知に関して、管理者用と利用者用の設定を変更することで、利用者に通知先の設定を移譲したりと様々な設定ができることが確認できました。これで安心してアラート設計が行えると思います。 では、最後に ChatGPT になぞかけをひとつ作ってもらいましたので、最後の締めとして残します。


サンタクロースへの手紙とかけて、アラートの通知先と解きます。 その心は?

どちらも「届ける相手」が重要です! 🎅📩


おつかれさまでした。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。