利用Prometheus-Operator来监控k8s集群并进行告警

prometheus-operator告警场景

环境准备

准备环境k8s1.12+以上,k8s的部署就不过多介绍,有kube-admin,也有二进制部署,当然也可以参考我的k8s集群部署

基本上环境准备好了就如我的集群如下

各组件已经成功安装。

安装Prometheus-Operator

Prometheus-Operator原理介绍:参考我的Prometheus-Operator监控k8s

此处演示的Prometheus-Operator场景的安装yaml,下载地址:https://github.com/huisebug/Prometheus-Operator-Rules.git

manifests目录介绍

1
kubectl apply -f manifests/

多次执行上面的初始化安装确保prometheus-operator可用

注:上面的yaml是官方4月份发布的版本,经过多次测试可以适用于多个集群,其中修改了一些镜像地址为国内可快速拉取的地址和移除了prometheus-adapter的部署。

new目录介绍

alertmanager-alertmanager.yaml:增加告警模板自定义位置的配置

alertmanager-secret.yaml:alertmanager服务的配置文件,包含企业微告警,印制告警,告警模板,告警间隔时间。

alertmanager-temp-configmap.yaml:告警模板

auth:访问prometheus、alertmanager、grafana的http认证文件

ingress.yaml:访问prometheus、alertmanager、grafana的域名配置,并增加http密码校验

prometheus-prometheus.yaml:增加prometheus数据保留时间,抓取metrics的间隔时间

state-rules.yaml:告警规则,也是本文章的主要介绍内容。

执行安装

将auth认证文件传递到secret

1
kubectl -n monitoring create secret generic basic-auth --from-file=. /new/auth

应用更改后的配置

1
kubectl apply -f new/

告警模板

在之前的文章中写过自定义告警模板,后续进行了模板的不断完善,告警信息我认为不必要的信息没必要展示,精确告警,新的告警模板如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{{- define "__text_alert_list" -}}
{{- range .Alerts.Firing -}}
错误告警:
告警消息: {{ .Annotations.message }}
告警级别: {{ .Labels.severity }}
告警alert: {{ .Labels.alertname }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}
{{- range .Alerts.Resolved -}}
服务已恢复:
原告警消息: {{ .Annotations.message }}
恢复时间: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}
{{- end }}

{{- define "wechat.default.message" -}}
{{- if gt (len .Alerts.Firing) 0 -}}
{{ template "__text_alert_list" . }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ template "__text_alert_list" . }}
{{- end }}
{{- end }}

将告警信息精简为从声明annotations中取值自定义的键值对,键名为messages一条即可,根据不同的rules定义每一个rule的messages告警内容

Rules

已监听job状态

1
2
3
4
5
6
7
8
9
- name: up
rules:
- alert: 已监听job状态
expr: up == 0
for: 30s
labels:
severity: Erroring
annotations:
message: "{{$labels.job}}服务所在实例{{$labels.instance}}关闭"

监控prometheus的target下的所有服务

pod等待状态错误原因

1
2
3
4
5
6
7
8
9
10
- name: kube_pod_container_status_waiting_reason
rules:
- alert: pod等待状态错误原因
expr: kube_pod_container_status_waiting_reason{reason=~"ErrImagePull|CrashLoopBackOff|ImagePullBackOff"} > 0
for: 30s
labels:
severity: critical
reason: waiting
annotations:
message: "{{$labels.namespace}}.{{$labels.pod}}等待错误原因:{{$labels.reason}}"

监控pod非running状态的原因进行告警

pod容器内存不足

1
2
3
4
5
6
7
8
9
10
- name: kube_pod_container_status_last_terminated_reason
rules:
- alert: pod容器内存不足
expr: kube_pod_container_status_last_terminated_reason{reason=~"OOMKilled"} > 0
for: 3s
labels:
severity: critical
reason: terminated
annotations:
message: "{{$labels.namespace}}.{{$labels.pod}}容器内存不足"

如果pod设置了resource内存限制,当pod超过内存被kill的时候进行告警,提醒使用者是否该调整该pod的resource

pod状态有变动

1
2
3
4
5
6
7
8
9
10
- name: kube_pod_container_status_ready
rules:
- alert: pod状态有变动
expr: kube_pod_container_status_ready != 1
for: 0s
labels:
severity: critical
reason: waiting
annotations:
message: "{{$labels.namespace}}.{{$labels.pod}}容器{{$labels.container}}状态有变动"