🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] Prometheus 警报分为两部分。 - `Prometheus server` 中的警报规则向 `Alertmanager` 发送警报 - `Alertmanager` 然后管理这些警报,包括静音、抑制、聚合和通过电子邮件、钉钉、微信和 `webhook` 等方法发送通知。 # 安装Alertmanager 安装alertmanager的yaml文件 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: alertmanager-config namespace: kube-mon data: # 最简单的配置。 # 必须要有route和receivers的配置 alertmanager.yml: |- global: resolve_timeout: 3m route: receiver: email receivers: - name: email --- apiVersion: apps/v1 kind: Deployment metadata: name: alertmanager namespace: kube-mon spec: replicas: 1 selector: matchLabels: app: alertmanager template: metadata: labels: app: alertmanager spec: containers: - name: alertmanager image: prom/alertmanager:v0.23.0 args: - --config.file=/etc/alertmanager/alertmanager.yml - --cluster.advertise-address=0.0.0.0:9093 resources: requests: cpu: 50m memory: 100Mi limits: cpu: 100m memory: 256Mi ports: - name: http containerPort: 9093 volumeMounts: - name: config mountPath: /etc/alertmanager volumes: - name: config configMap: name: alertmanager-config --- apiVersion: v1 kind: Service metadata: name: alertmanager namespace: kube-mon spec: type: ClusterIP selector: app: alertmanager ports: - name: http port: 9093 ``` 安装alertmanager服务 ```shell kubectl apply -f alertmanager-deploy.yml configmap/alertmanager-config create deployment.apps/alertmanager create service/alertmanager create kubectl -n kube-mon get pod -l app=alertmanager NAME READY STATUS RESTARTS AGE alertmanager-55785ddf67-kdrgt 1/1 Running 0 73s ``` # 自定义告警模板 **自定义告警模板** ```yaml # 查看文件 $ cat monitor/alertmanager/template.yml apiVersion: v1 kind: ConfigMap metadata: name: alert-template namespace: kube-mon data: email.tmpl: | {{ define "email.to.html" }} {{- if gt (len .Alerts.Firing) 0 -}} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警级别: {{ .Labels.severity }} <br> 告警类型: {{ .Labels.alertname }} <br> 告警主机: {{ .Labels.instance }} <br> 告警主题: {{ .Annotations.summary }} <br> 告警详情: {{ .Annotations.description }} <br> 触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br> =========end==========<br> {{ end }}{{ end -}} {{- if gt (len .Alerts.Resolved) 0 -}} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警级别: {{ .Labels.severity }} <br> 告警类型: {{ .Labels.alertname }} <br> 告警主机: {{ .Labels.instance }} <br> 告警主题: {{ .Annotations.summary }} <br> 告警详情: {{ .Annotations.description }} <br> 触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br> 恢复时间: {{ .EndsAt.Format "2006-01-02 15:04:05" }} <br> =========end==========<br> {{ end }}{{ end -}} {{- end }} # 执行文件 $ kubectl apply -f monitor/alertmanager/template.yml ``` **alertmanager配置自定义模板** ```yaml # 挂载自定告警模板 $ kubectl -n kube-mon edit deploy alertmanager - mountPath: /etc/alertmanager/templates name: templates - configMap: name: alert-template name: templates # alertmanager配置添加自定义告警模板路径,与global是同级 $ kubectl -n kube-mon edit configmap alertmanager-config templates: - '/etc/alertmanager/templates/*.tmpl' ``` # 配置告警通知 设置警报和通知的主要步骤是: 1. 配置 Prometheus 与 Alertmanager 对话 (在Prometheus配置) 2. 在 Prometheus 中创建警报规则 (在Prometheus配置) 3. 配置Alertmanager 配置之前需要知道知道一些配置的意义,否则很容易发生邮件、短信轰炸。 ## 邮件告警 1、配置 Prometheus 与 Alertmanager 对话 (在Prometheus配置) ```yaml alerting: alertmanagers: - static_configs: - targets: ["alertmanager:9093"] ``` 2、在 Prometheus 中创建警报规则 (在Prometheus配置) 1. 在Prometheus配置告警规则文件 2. 新增告警规则文件 3. 将configmap挂载到Prometheus 在Prometheus配置告警规则文件 (在Prometheus配置) ```yaml rule_files: - /etc/prometheus/rules/*.yaml ``` 新增告警规则文件 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: rules-files-sd-config namespace: kube-mon data: rules.yaml: | groups: - name: hosts rules: - alert: NodeMemoryUsage expr: (node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 80 for: 10m labels: team: hosts annotations: summary: "{{$labels.instance}}: High Memory usage detected" description: "{{$labels.instance}}: Memory usage is above 80% (current value is: {{ $value }}" ``` > labels:是 alertmanager 的分组的(group_by)标签。 将configmap挂载到Prometheus ```shell $ kubectl -n kube-mon edit deploy prometheus # 在 spec.template.spec.containers.volumeMounts 添加下面几行 - mountPath: /etc/prometheus/targets name: rules-files-sd-config # 在 spec.template.spec.volumes 添加下面几行 - configMap: name: rules-files-sd-config name: rules-files-sd-config ``` 3、配置Alertmanager ```yaml apiVersion: v1 kind: ConfigMap metadata: name: alertmanager-config namespace: kube-mon data: alertmanager.yml: |- global: resolve_timeout: 3m # 邮件配置 smtp_from: 'ecloudz@126.com' smtp_smarthost: 'smtp.126.com:25' smtp_auth_username: 'ecloudz@126.com' # 邮箱的授权码 smtp_auth_password: 'xxxx' route: # 默认告警媒介 receiver: default # 当一个新的报警分组被创建后,需要等待至少 group_wait 时间来初始化通知 # 这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。 group_wait: 30s # 相同的group之间发送告警通知的时间间隔 group_interval: 5m # 已经成功发送警报,再次发送通知之前等待多长时间 repeat_interval: 2h # 分组,对应Prometheus的告警规则的labels group_by: ["cluster", "team"] # 子路由 routes: - receiver: email matchers: - team = hosts # 告警媒介方式 receivers: - name: default - name: email email_configs: - to: "jiaxzeng@126.com" send_resolved: true ``` 4、Prometheus和alertmanager重新加载配置 ```shell curl -X POST `kubectl -n kube-mon get endpoints prometheus -o jsonpath={.subsets[0].addresses[0].ip}`:9090/prometheus/-/reload curl -X POST "http://`kubectl -n kube-mon get endpoints alertmanager -o jsonpath={.subsets[0].addresses[0].ip}`:9093/-/reload" ``` ## 钉钉告警 ## 企业微信告警 总体也是分为三步,前面两步和邮箱告警一致,这个只说alertmanager配置的差异 configmap的alertmanager配置文件中添加下面内容 ```yaml # 在配置文件 receivers 告警媒介添加企业微信告警 - name: wechat wechat_configs: - corp_id: ww31554c46xxxx # 企业微信中,企业ID to_party: 2 # 企业微信中,部门ID agent_id: 1000002 # 企业微信中,应用的AgentId api_secret: LNqXxz8U5DBGHem3mMB5aQQHqw8aAW2_xxxxx # 企业微信中,应用的Secret send_resolved: true # 在配置文件 routes 子路由添加告警媒介方式 - receiver: wechat matchers: - team = kubernetes ``` 重新加载alertmanager ```shell $ curl -X POST `kubectl -n kube-mon get endpoints alertmanager -ojsonpath={.subsets[0].addresses[0].ip}`:9093/-/reload ``` # 自定义告警模板 ## 邮箱告警 创建邮件告警模板的yaml文件 ```yaml apiVersion: v1 kind: ConfigMap metadata: name: alert-template namespace: kube-mon data: email.tmpl: | {{ define "email.to.html" }} {{- if gt (len .Alerts.Firing) 0 -}} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警级别: {{ .Labels.severity }} <br> 告警类型: {{ .Labels.alertname }} <br> 告警主机: {{ .Labels.instance }} <br> 告警主题: {{ .Annotations.summary }} <br> 告警详情: {{ .Annotations.description }} <br> 触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br> =========end==========<br> {{ end }}{{ end -}} {{- if gt (len .Alerts.Resolved) 0 -}} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警级别: {{ .Labels.severity }} <br> 告警类型: {{ .Labels.alertname }} <br> 告警主机: {{ .Labels.instance }} <br> 告警主题: {{ .Annotations.summary }} <br> 告警详情: {{ .Annotations.description }} <br> 触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br> 恢复时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br> =========end==========<br> {{ end }}{{ end -}} {{- end }} ``` 将 configmap 挂载到 alertmanager 容器中 ```yaml # deploy.spec.templates.volumes 添加下面三行 - name: templates configMap: name: alert-template # deploy.spec.template.spec.containers.volumeMounts 添加下面两行 - name: templates mountPath: /etc/alertmanager/templates ``` 配置生效 ```shell $ kubectl apply -f monitor/alertmanager/template.yml $ kubectl apply -f monitor/alertmanager/deploy.yml ``` ## 钉钉告警 ## 企业微信告警 ```yaml # 在对应configmap的 data 添加模板 wechat.tmpl: | {{ define "wechat.default.message" }} {{- if gt (len .Alerts.Firing) 0 -}} {{- range $index, $alert := .Alerts -}} {{- if eq $index 0 }} ==========异常告警========== 告警类型: {{ $alert.Labels.alertname }} 告警级别: {{ $alert.Labels.severity }} 告警详情: {{$alert.Annotations.summary}}; {{$alert.Annotations.description }} 故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} {{- if gt (len $alert.Labels.instance) 0 }} 实例信息: {{ $alert.Labels.instance }} {{- end }} {{- if gt (len $alert.Labels.namespace) 0 }} 命名空间: {{ $alert.Labels.namespace }} {{- end }} {{- if gt (len $alert.Labels.node) 0 }} 节点信息: {{ $alert.Labels.node }} {{- end }} {{- if gt (len $alert.Labels.pod) 0 }} 实例名称: {{ $alert.Labels.pod }} {{- end }} ============END============ {{- end }} {{- end }} {{- end }} {{- if gt (len .Alerts.Resolved) 0 -}} {{- range $index, $alert := .Alerts -}} {{- if eq $index 0 }} ==========异常恢复========== 告警类型: {{ $alert.Labels.alertname }} 告警级别: {{ $alert.Labels.severity }} 告警详情: {{$alert.Annotations.summary}};{{ $alert.Annotations.description }} 故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} 恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} {{- if gt (len $alert.Labels.instance) 0 }} 实例信息: {{ $alert.Labels.instance }} {{- end }} {{- if gt (len $alert.Labels.namespace) 0 }} 命名空间: {{ $alert.Labels.namespace }} {{- end }} {{- if gt (len $alert.Labels.node) 0 }} 节点信息: {{ $alert.Labels.node }} {{- end }} {{- if gt (len $alert.Labels.pod) 0 }} 实例名称: {{ $alert.Labels.pod }} {{- end }} ============END============ {{- end }} {{- end }} {{- end }} {{- end }} ``` > 注意:如果有多个告警模板的话,可以放在一个configmap。 > 上面的 `define` 不能替换,保持默认不变即可。