前提:k8s集群中已正確部署了prometheus和alertmanager。
在prometheus中已經預先定義了很多告警項。當然,我們也可以自定義告警內容。本文以自定義容器的內存和CPU用量告警為例。
一、創建Prometheusrule
Prometheusrule是Prometheus在部署時創建的一個crd。它定義了Prometheus中的一些數據指標(即以record結尾的)和告警項(即以alert結尾的)。通過kubectl get prometheusrule可以看到所有Prometheus部署時創建的Prometheusrule。
我們自定義告警項時,只需要創建一個新的名字以alert結尾的Prometheusrule即可。
編寫自定義Prometheusrule的yaml文件如下:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: prometheus-rules
cato: node
release: prometheus-operator
name: test.alert
namespace: kube-system
spec:
groups:
- name: test.alert.rules
rules:
- alert: CPUUsageHigh
annotations:
description: 'node: {{ $labels.node }}, namespace: {{ $labels.namespace }},
pod: {{ $labels.pod_name }}, container: {{ $labels.container_name }}, value:
{{ $value }}'
summary: Container CPU Usage > 0.8 for 2m
expr: ke:container:cpu_util{namespace="test"} > 0.8
for: 2m
labels:
severity: warning
- alert: MemUsageHigh
annotations:
description: 'node: {{ $labels.node }}, namespace: {{ $labels.namespace }},
pod: {{ $labels.pod_name }}, container: {{ $labels.container_name }}, value:
{{ $value }}'
summary: Container Mem Usage > 0.8 for 2m
expr: ke:container:mem_util{namespace="test"} > 0.8
for: 2m
labels:
severity: warning
這里有幾點需要注意:
1.這個rule的label,需要與你的Prometheus的ruleSelector字段相一致。
Prometheus在部署時,會創建一個名為Prometheus的crd。通過kubectl get prometheus -n xxx查出集群中的Prometheus的名字,再通過kubectl get prometheus -n xxx [集群中Prometheus的名字] -o yaml查找其ruleSelector字段。將這一字段的值原封不動地填寫至yaml文件中的labels字段中。
2.rules.expr字段定義了指標的表達式。后面的大括號里面規定了告警的監測范圍僅限與test這個namespace下。如果需要添加其他的條件,可用逗號隔開。
編寫完后,通過kubectl create -f prometheusrule.yaml創建。
二、測試驗證
驗證時,為了快速檢驗出成果,可以將ke:container:mem_util{namespace="test"} > 0.8改為 > 0.0001。
創建后,進入Prometheus的pod,查看/etc/prometheus/rules/prometheus-rulefiles-0下,過一段時間就可以看到test.alert.yaml文件出現了。
去到Prometheus的portal頁面,點擊Alert,查看自定義的兩個告警指標是否出現,且是否有active狀態的告警出現。
