近来项目组任务很少,你们都开始了各类方向的学习积累。node
咱们项目虽然都是用k8s进行部署,可是却缺少有效、合理的集群监控手段,恰好借此机会调研了一下集群监控方面的知识。git
Prometheus是一套开源的监控、报警、时间序列数据库的组合。2016年,Prometheus加入了云原生计算基金会,成为Kubernetes以后的第二个托管项目。github
Prometheus已经成为了k8s的一个标准,不少的k8s组件都会提供/metrics
这个url供Prometheus采集监控指标。对于一些硬件层面及没有提供这个url的应用,须要使用一个中间产品来帮助采集,这个产品就叫exporter。docker
官方收录了许多exporter,其中包括Kafka exporter、Ceph exporter、Nginx VTS exporter、MySQL server exporter等。咱们也能够经过官方提供的客户端库本身实现一个。
Prometheus拥有灵活强大的查询语言(PromQL)、很是高效的存储。数据库
Alertmanager处理由诸如Prometheus服务器之类的客户端应用程序发送的警报。它负责将重复数据删除,分组和路由到正确的接收者集成,例如电子邮件,PagerDuty或OpsGenie。它还能够沉默和禁止警报。json
Alertmanager是Prometheus组织下的产品,与Prometheus结合的更好。Prometheus负责监控并生成告警,Alertmanager能对告警进行分组分类、合并发送等操做,让告警邮件更加合理。api
为了快速用起来,这里直接使用开源项目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都包括了,咱们能够在他基础上进行修改。服务器
使用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后便可生效。
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的服务接口,便可在网页访问。
能够在Alerts目录下看到不少告警规则,其中不少是Kube-prometheus自带的,咱们刚才制定的规则也显示在其中。
咱们能够用prometheus自带的图形化界面查看到告警趋势。
能够看到该告警规则始终保持着一个活动的告警。
Prometheus生成的告警杂乱无章,Alertmanager能使告警更合理、友好地发送给相关人员。
推送规则一般包括一些敏感信息,如邮箱帐号密码等,建议使用Secret存储这部分信息。Kube-prometheus将推送规则用Secret存储在alertmanager-secret.yaml文件里。
新建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/kube-prometheus/alertmanager
中按jsonnet语法编写推送规则并从新编译项目并apply便可。
若是配置正确,咱们会在group_wait
时间后收到第一条邮件推送,若是告警有变更,会间隔group_interval
设定的时间向组推送,并每间隔repeat_interval
推送一次,直至解决。
至此,一个最简单的告警推送就完成了。
此次是为了快速用起来而使用了Kube-prometheus项目,虽然方便,可是不少东西并不可控,后续也须要学习原生的版本,掌握更多灵活、强大的功能便于生产环境使用。
同时确切的感受到了Prometheus+Alertmanager的强大,若是是使用k8s进行项目部署,很推荐使用这套组合拳,经过各类exporter能监控几乎全部的微服务组件。