kubernetesv1.16監控系列——AlertManager 相關的配置

配置 PrometheusRule

現在我們知道怎麼自定義一個 ServiceMonitor 對象了,但是如果需要自定義一個報警規則的話呢?比如現在我們去查看 Prometheus Dashboard 的 Alert 頁面下面就已經有一些報警規則了,還有一些是已經觸發規則的了:


kubernetesv1.16監控系列——AlertManager 相關的配置

但是這些報警信息是哪裡來的呢?他們應該用怎樣的方式通知我們呢?我們知道之前我們使用自定義的方式可以在 Prometheus 的配置文件之中指定 AlertManager 實例和 報警的 rules 文件,現在我們通過 kube-prometheus部署的呢?我們可以在 Prometheus Dashboard 的 Config 頁面下面查看關於 AlertManager 的配置:

<code>alerting:
alert_relabel_configs:
- separator: ;
regex: prometheus_replica
replacement: $1
action: labeldrop
alertmanagers:
- kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- monitoring
scheme: http
path_prefix: /
timeout: 10s
api_version: v1
relabel_configs:
- source_labels: [__meta_kubernetes_service_name]
separator: ;
regex: alertmanager-main
replacement: $1
action: keep
- source_labels: [__meta_kubernetes_endpoint_port_name]
separator: ;
regex: web
replacement: $1
action: keep
rule_files:
- /etc/prometheus/rules/prometheus-k8s-rulefiles-0/*.yaml/<code>

上面 alertmanagers 實例的配置我們可以看到是通過角色為 endpoints 的 kubernetes 的服務發現機制獲取的,匹配的是服務名為 alertmanager-main,端口名為 web 的 Service 服務,我們查看下 alertmanager-main 這個 Service:

<code>kubectl describe svc alertmanager-main -n monitoring
Name: alertmanager-main
Namespace: monitoring
Labels: alertmanager=main
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"alertmanager":"main"},"name":"alertmanager-main","namespace":"...
Selector: alertmanager=main,app=alertmanager
Type: NodePort
IP: 10.16.101.12
Port: web 9093/TCP
TargetPort: web/TCP
NodePort: web 30093/TCP
Endpoints: 10.30.1.20:9093,10.30.2.25:9093,10.30.3.23:9093
Session Affinity: ClientIP
External Traffic Policy: Cluster
Events: <none>/<code>

可以看到服務名正是 alertmanager-main,Port 定義的名稱也是 web,符合上面的規則,所以 Prometheus 和 AlertManager 組件就正確關聯上了。而對應的報警規則文件位於:/etc/prometheus/rules/prometheus-k8s-rulefiles-0/目錄下面所有的 YAML 文件。這個 YAML 文件實際上就是我們之前創建的一個 PrometheusRule 文件包含的:

<code>apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: k8s
role: alert-rules
name: prometheus-k8s-rules
namespace: monitoring
spec:
groups:
- name: node-exporter.rules
rules:
- expr: |
count without (cpu) (
count without (mode) (
node_cpu_seconds_total{job="node-exporter"}
)
)
record: instance:node_num_cpu:sum/<code>

我們這裡的 PrometheusRule 的 name 為 prometheus-k8s-rules,namespace 為 monitoring,我們可以猜想到我們創建一個 PrometheusRule 資源對象後,會自動在上面的 prometheus-k8s-rulefiles-0 目錄下面生成一個對應的<namespace>-<name>.yaml文件,所以如果以後我們需要自定義一個報警選項的話,只需要定義一個 PrometheusRule 資源對象即可。至於為什麼 Prometheus 能夠識別這個 PrometheusRule 資源對象呢?這就需要查看我們創建的 prometheus 這個資源對象了,裡面有非常重要的一個屬性 ruleSelector,用來匹配 rule 規則的過濾器,要求匹配具有 prometheus=k8s 和 role=alert-rules 標籤的 PrometheusRule 資源對象,現在明白了吧?/<name>/<namespace>

<code>ruleSelector:
matchLabels:
prometheus: k8s
role: alert-rules/<code>

所以我們要想自定義一個報警規則,只需要創建一個具有 prometheus=k8s 和 role=alert-rules 標籤的 PrometheusRule 對象就行了,比如現在我們添加一個 etcd 是否可用的報警,我們知道 etcd 整個集群有一半以上的節點可用的話集群就是可用的,所以我們判斷如果不可用的 etcd 數量超過了一半那麼就觸發報警,創建文件 prometheus-etcdRules.yaml:

<code>apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: k8s
role: alert-rules
name: etcd-rules
namespace: monitoring
spec:
groups:
- name: etcd
rules:
- alert: EtcdClusterUnavailable
annotations:
summary: etcd cluster small
description: If one more etcd peer goes down the cluster will be unavailable
expr: |
count(up{job="etcd"} == 0) > (count(up{job="etcd"}) / 2 - 1)
for: 3m
labels:
severity: critical/<code>

注:label 標籤一定至少要有 prometheus=k8s 和 role=alert-rules,創建完成後,隔一會兒再去容器中查看下 rules 文件夾:

<code> kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoring
Defaulting container name to prometheus.
Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod.
/prometheus $ ls /etc/prometheus/rules/prometheus-k8s-rulefiles-0/

monitoring-etcd-rules.yaml monitoring-prometheus-k8s-rules.yaml/<code>


kubernetesv1.16監控系列——AlertManager 相關的配置

配置報警

我們知道了如何去添加一個報警規則配置項,但是這些報警信息用怎樣的方式去發送呢?前面的課程中我們知道我們可以通過 AlertManager 的配置文件去配置各種報警接收器,現在我們是通過 Operator 提供的 alertmanager 資源對象創建的組件,應該怎樣去修改配置呢?

我們之前已經將 alertmanager-main 這個 Service 改為 NodePort 類型的 Service,可以直接在頁面上的 status 路徑下面查看 AlertManager 的配置信息:


kubernetesv1.16監控系列——AlertManager 相關的配置

這些配置信息實際上是來自於我們之前在prometheus-operator/contrib/kube-prometheus/manifests目錄下面創建的 alertmanager-secret.yaml 文件:

<code>apiVersion: v1
data: {}
kind: Secret
metadata:
name: alertmanager-main
namespace: monitoring
stringData:
alertmanager.yaml: |-
"global":
"resolve_timeout": "5m"
"inhibit_rules":
- "equal":
- "namespace"
- "alertname"
"source_match":
"severity": "critical"
"target_match_re":
"severity": "warning|info"
- "equal":
- "namespace"
- "alertname"
"source_match":
"severity": "warning"
"target_match_re":
"severity": "info"
"receivers":
- "name": "Default"
- "name": "Watchdog"
- "name": "Critical"
"route":
"group_by":
- "namespace"
"group_interval": "5m"
"group_wait": "30s"
"receiver": "Default"
"repeat_interval": "12h"
"routes":
- "match":
"alertname": "Watchdog"
"receiver": "Watchdog"
- "match":
"severity": "critical"
"receiver": "Critical"
type: Opaque/<code>

我們可以看到內容和上面查看的配置信息是一致的,所以如果我們想要添加自己的接收器,或者模板消息,我們就可以更改這個文件。


分享到:


相關文章: