PrometheusによるKubernetes監視と通知 - oomichi/try-kubernetes GitHub Wiki

Monitoring Kubernetes with Prometheus and Alertmanager: Setting up alearts with Slack integration の意訳

このチュートリアルでは、異常を Slack チャネルに通知するために PrometheusルールとAlertmanagerをどのように設定するのかを学ぶ。 Prometheus は Kubernetes エコシステムにおいて有名な監視と異常検知ソリューションである。 Alertmanagerは異常通知を管理する。Slack と統合することで、Kubernetesクラスタにおける、いかなる障害や異常をリアルタイムの通知を受けることが可能となる。 では、始めていきましょう。

目次

  1. 前提条件
  2. Prometheus と AlertmanagerのKubernetesクラスタへのインストール
  3. Prometheus ルールの設定
  4. Alertmanagerの設定
  5. Slackとの統合
  6. セットアップのテスト
  7. 最後に

前提条件

  • Kubernetesクラスタへのアクセス
  • Prometheus と AlertmanagerのKubernetesクラスタへのインストール
  • Kubernetesに関する基本知識

Prometheus と AlertmanagerのKubernetesクラスタへのインストール

(oomichi 追記)

$ kubectl create ns prometheus-test
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm -n prometheus-test install prom-test prometheus-community/kube-prometheus-stack

関連Podが正常動作していることを確認する。

$ kubectl --namespace prometheus-test get pods
NAME                                                     READY   STATUS    RESTARTS   AGE
alertmanager-prom-test-kube-promethe-alertmanager-0   2/2     Running   0          12s
prom-test-grafana-877b495f-tzrgs                      3/3     Running   0          47m
prom-test-kube-promethe-operator-6d58f75d78-4pdgg     1/1     Running   0          47m
prom-test-kube-state-metrics-66bf8d7948-ck29p         1/1     Running   0          47m
prom-test-prometheus-node-exporter-g5fw5              1/1     Running   0          47m
prom-test-prometheus-node-exporter-rr4fb              1/1     Running   0          47m
prometheus-prom-test-kube-promethe-prometheus-0       1/2     Running   0          15s

prometheusリソースのruleSelector を確認する。 helm でリリース名として指定した値が matchLabels に指定されていることが分かる。

kubectl -n prometheus-test get prometheus prom-test-kube-promethe-prometheus -o yaml
...
  ruleSelector:
    matchLabels:
      release: prom-test
...

Prometheus ルールの設定

Prometheusルールは、Prometheusによって収集されたメトリックスを基にアラートを生成する条件を定義する。 この例では、PrometheusRuleリソースを作成している。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: z4ck404-alerts
  namespace: monitoring
spec:
  groups:
  - name: blackbox.alerts
    rules:
    - alert: backbox probe check failed! 
      expr: |
        probe_success != 1
      for: 2m
      labels:
        severity: warning
        namespace: monitoring
      annotations:
        summary:  BlackBox prob check failed. Service might be down
        description: 'Target {{`{{`}} printf "%v" $labels.target {{`}}`}} probe is down.'

これは下記のような例だ。

  • spec セクションにおいて、rule groupsを含んでいる。これはルールのリストを含んでいる。
  • blackbox.alerts という名のルールを定義している。probe_successが1かどうかをチェックしている。
  • アラート時間として2分を指定し、そのアラートのためにlabelsとannnotationsを定義している。

Alertmanagerの設定

Alertmanagerは異なるReceiversへのアラートのルーティングと送信を処理する。 このステップでは、Alertmanagerを設定するために AlertmanagerConfigリソースを作成する。

apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
  name: z4ck404-alertmanagerconfig
spec:
  route:
    groupBy: ['alertname', 'job']
    groupWait: 10s
    groupInterval: 5m
    repeatInterval: 12h
    continue: true
    matchers:
      - name: severity
        matchType: "="
        value: "warning"
    receiver: slack
  receivers:
    - name: slack
      slackConfigs:
        - channel: "#alerts"
          apiURL:
            key: slack_webhook
            name: alertmanager-slack-notification
          sendResolved: true
          title: >-
            {{`{{`}} if eq .Status "firing" {{`}}`}}:fire: *FIRING* {{`{{`}} else {{`}}`}}:ok_hand: *RESOLVED* {{`{{`}} end {{`}}`}}
          text: >-
            {{`{{`}} range .Alerts {{`}}`}}
                {{`{{`}} if .Annotations.summary {{`}}`}}*Alert:* {{`{{`}} .Annotations.summary {{`}}`}} - `{{`{{`}} .Labels.severity {{`}}`}}`{{`{{`}} end {{`}}`}}
                {{`{{`}} if .Annotations.description {{`}}`}}*Description:* {{`{{`}} .Annotations.description {{`}}`}}{{`{{`}} end {{`}}`}}
                *Details:*
                {{`{{`}} range .Labels.SortedPairs {{`}}`}} • *{{`{{`}} .Name {{`}}`}}:* `{{`{{`}} .Value {{`}}`}}`
                {{`{{`}} end {{`}}`}}
            {{`{{`}} end {{`}}`}}
          footer: "z4ck404-alertmanager"

これは下記のような例だ。

  • specセクションにおいて、アラートのためのrouting rulesを定義した。
  • groupBy フィールドによって、通知におけるアラートのグループ化をどのように行うのかを決める。
  • groupWait, groupInterval, repeatInterval において、タイミングに関連した設定を行う。
  • matchers セクションはLabelの値をベースにアラートをフィルタリングする。
  • receiverフィールドにおいて、該当するアラートのために使う receiverを指定する。
  • receivers配下にて、slackというreceiverを定義している。これはSlack固有の設定だ。

Slackとの統合

Slackチャネルでアラートを受信するため、正しいSlack webhoook URLをAlertmanagerを設定する。 そのwebhook URLを格納する Secretリソースを作成する。

apiVersion: v1
kind: Secret
metadata:
  name: alertmanager-slack-notification
type: Opaque
data:
  slack_webhook: "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"

これは下記のような例だ。

  • dataセクションに、Slack webhook URLをBase64エンコーディングを使ってエンコードし、格納する。

セットアップのテスト

最後に