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クラスタにおける、いかなる障害や異常をリアルタイムの通知を受けることが可能となる。 では、始めていきましょう。
目次
- 前提条件
- Prometheus と AlertmanagerのKubernetesクラスタへのインストール
- Prometheus ルールの設定
- Alertmanagerの設定
- Slackとの統合
- セットアップのテスト
- 最後に
前提条件
- 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エンコーディングを使ってエンコードし、格納する。