Prometheus+Alertmanager告警及推送

近来项目组任务不多,大家都开始了各种方向的学习积累。

我们项目虽然都是用k8s进行部署,但是却缺乏有效、合理的集群监控手段,刚好借此机会调研了一下集群监控方面的知识。

什么是Prometheus

Prometheus是一套开源的监控、报警、时间序列数据库的组合。2016年,Prometheus加入了云原生计算基金会,成为Kubernetes之后的第二个托管项目。

为什么使用Prometheus

Prometheus已经成为了k8s的一个标准,很多的k8s组件都会提供/metrics这个url供Prometheus采集监控指标。对于一些硬件层面及没有提供这个url的应用,需要使用一个中间产品来帮助采集,这个产品就叫exporter。

官方收录了许多exporter,其中包括Kafka exporter、Ceph exporter、Nginx VTS exporter、MySQL server exporter等。我们也可以通过官方提供的客户端库自己实现一个。
Prometheus拥有灵活强大的查询语言(PromQL)、非常高效的存储。

什么是Alertmanager

Alertmanager处理由诸如Prometheus服务器之类的客户端应用程序发送的警报。它负责将重复数据删除,分组和路由到正确的接收者集成,例如电子邮件,PagerDuty或OpsGenie。它还可以沉默和禁止警报。

为什么使用Alertmanager

Alertmanager是Prometheus组织下的产品,与Prometheus结合的更好。Prometheus负责监控并生成告警,Alertmanager能对告警进行分组分类、合并发送等操作,让告警邮件更加合理。

使用Kube-prometheus安装

为了快速用起来,这里直接使用开源项目Kube-prometheus进行部署。

git clone https://github.com/coreos/kube-prometheus.git 
kubectl apply -f manifests/setup
kubectl apply -f manifests/

该项目将Grafana、Prometheus、Alertmanager、node-exporter都包括了,我们可以在他基础上进行修改。

让Prometheus生成告警

添加告警规则

编写yaml

使用spec.groups.rules.alert即可定义告警规则。annotations.message是告警信息,expr是告警监控的表达式,我们可以使用PromQL结合各种exporter提供的方法来制定规则,这里我们制定一个始终存在的告警规则来用做演示。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: k8s
    role: alert-rules
  name: prometheus-k8s-rules
  namespace: monitoring
spec:
  groups:
    - name: test.rules
      rules:
      - alert: Test
        annotations:
          message: |
            Just test.
        expr: vector(1)
        labels:
          severity: none

apply后即可生效。

编写jsonnet

Kube-prometheus提供的yaml都是由jsonnet生成的,我们也可以使用它的思想来编写jsonnet然后转为yaml文件。

在目录jsonnet/kube-prometheus/alerts下按jsonnet语法编写告警规则。

执行docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci jb update拉取并更新jsonnet环境。

quay.io/coreos/jsonnet-ci镜像较大,需要较长时间。

在Kube-prometheus项目根目录下执行docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci ./build.sh example.jsonnet将jsonnet项目输出为yaml文件。

执行完后,manifests目录下的文件就都重新生成了,重新apply后即可生效。

查看告警

暴露prometheus的服务接口,即可在网页访问。

Prometheus+Alertmanager告警及推送_第1张图片

可以在Alerts目录下看到很多告警规则,其中很多是Kube-prometheus自带的,我们刚才制定的规则也显示在其中。

我们可以用prometheus自带的图形化界面查看到告警趋势。

Prometheus+Alertmanager告警及推送_第2张图片

可以看到该告警规则始终保持着一个活动的告警。

让Alertmanager推送告警

Prometheus生成的告警杂乱无章,Alertmanager能使告警更合理、友好地发送给相关人员。

添加推送规则

推送规则通常包括一些敏感信息,如邮箱账号密码等,建议使用Secret存储这部分信息。Kube-prometheus将推送规则用Secret存储在alertmanager-secret.yaml文件里。

生成Secret

新建alertmanager.yaml文件。在global中定义发件人,smtp_smarthost表示使用的发件SMTP服务地址,这里使用腾讯企业邮箱。在receivers中定义接受方,在route中定义没有被路由命中的告警的默认推送信息,在route.routes中定义具体的告警路由,可以覆盖全局定义。更多详细配置请参考官方文档

如果邮箱开启了安全登录,smtp_auth_password应填授权码而不是账户密码
global:
  resolve_timeout: 5m
  smtp_auth_password: {yourpassword}
  smtp_auth_username: {youremail}
  smtp_from: {youremail}
  smtp_require_tls: false
  smtp_smarthost: smtp.exmail.qq.com:465
receivers:
- email_configs:
  - send_resolved: true
    to: {someone's email}
  name: example
route:
  group_by: ['namespace']
  group_interval: 5m
  group_wait: 30s
  receiver: example
  repeat_interval: 12h
  routes:
  - match:
      alertname: Test
    receiver: example

删除原Secret:kubectl delete -f alertmanager-secret.yaml

生成新Secret:kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring

编写jsonnet

jsonnet/kube-prometheus/alertmanager中按jsonnet语法编写推送规则并重新编译项目并apply即可。

接收告警

如果配置正确,我们会在group_wait时间后收到第一条邮件推送,如果告警有变动,会间隔group_interval设定的时间向组推送,并每间隔repeat_interval推送一次,直至解决。

Prometheus+Alertmanager告警及推送_第3张图片

至此,一个最简单的告警推送就完成了。

总结

这次是为了快速用起来而使用了Kube-prometheus项目,虽然方便,但是很多东西并不可控,后续也需要学习原生的版本,掌握更多灵活、强大的功能便于生产环境使用。

同时确切的感觉到了Prometheus+Alertmanager的强大,如果是使用k8s进行项目部署,很推荐使用这套组合拳,通过各种exporter能监控几乎所有的微服务组件。

你可能感兴趣的:(kubernetes,prometheus)