Prometheus监控TLS Kubernetes集群
1 Comment当我们完成Kubernetes集群环境部署后,就需要提取Kubernets集群中POD的日志提取和监控。当集群内的N台服务器在Kubernets的管理下自动创建和销毁POD,但在这种情况下,我们就不方便及时获取所有POD和服务器的运行状态及资源消耗状态,给我们感觉是,驾驶着一辆没有仪表盘的跑车在高速公路上飙车,给人一种心慌的感觉。
在以前的工作中,用过Nagios,Cacti,zabbix等监控工具。但在Kubernets集群中,这些工具并不适用。因此,我们需要引入新的监控工具Prometheus。
Prometheus简介
Prometheus是SoundCloud开源的一款监控软件。它的实现参考了Google内部的监控实现, 与同样源自Google的Kubernetes项目十分搭配。Prometheus集成了数据采集,存储,异常告警多项功能,是一款一体化的完整方案。它针对大规模的集群环境设计了拉取式的数据采集方式、多维度数据存储格式以及服务发现等创新功能。
与传统监控工具相比,Prometheus 可以通过服务发现掌握集群内部已经暴露的监控点,然后主动拉取所有监控数据。通过这样的架构设计,我们仅需要向Kubernetes集群中部署一份Prometheus实例,它就可以通过向apiserver
查询集群状态,然后向所有已经支持Prometheus metrics的kubelet获取所有Pod的运行数据。如果我们想采集底层服务器运行状态,通过DaemonSet在所有服务器上运行配套的node-exporter之后,Prometheus就可以自动采集到新的这部分数据。
这种动态发现的架构,非常适合服务器和程序都不固定的Kubernetes集群环境,同时也大大降低了运维的负担。
Prometheus官网:https://prometheus.io/
Prometheus官方下载地址:https://prometheus.io/download/
Prometheus官方文档地址:https://prometheus.io/docs/introduction/overview/
环境说明
环境:
Prometheus v2.2.0
node-exporter v0.15.2
Kubernetes v1.8.2
Centos 7.4
角色 | IP | 备注 |
---|---|---|
k8s master | 192.168.1.195 | k8s master |
k8s node | 192.168.1.198 | k8s node、Prometheus、node-exporter |
k8s node | 192.168.1.199 | k8s node、Prometheus、node-exporter |
部署node-exporter
node-exporter可以用于监控底层的服务器指标
下面是官方解释:
|
|
node-exporter Github:https://github.com/prometheus/node_exporter
为了能够收集每个节点的信息,这里使用DaemonSet
的形式部署PODS
node-exporter.yaml:
|
|
|
|
|
|
|
|
部署Service Account
Kubernetes在1.8.0之后启用了RBAC特性,因此我们需要先通过RBAC授权,然后Prometheus通过RBAC连接Kubernetes集群,否则被拒绝后,将无法连接到K8s的API-SERVER
参考:https://kubernetes.io/docs/admin/authorization/rbac/
prometheus-service-account.yml:
|
|
|
|
|
|
部署Prometheus alertmanager配置文件
使用ConfigMap的形式来设置Prometheus的配置文件
参考:https://prometheus.io/docs/prometheus/latest/configuration/configuration/
prometheus-alertmanager-config.yml:
|
|
repeat_interval
:指定告警发送间隔时间to: 'user2@example.com,user3@example.com'
指定多个收件人,每个收件人邮箱之间用逗号
隔开
|
|
|
|
- 需要修改
global.smtp*
和receivers.name.email_configs
相关的邮件信息
部署Prometheus的配置文件
prometheus-config.yaml:
|
|
job_name: 'kubernetes-node-exporter'
中替换31672端口为9100,该端口是node-exporter
暴露的NodePort
端口,这里需要根据实际情况填写
在前面node-exporter.yaml中指定了targetPort: 9100
,所以这里的端口需要修改为9100kubernetes.default.svc:443
为k8s api地址,如果安装k8s时不是使用的默认DNS,则需要手动修改- 新增了Prometheus alertmanagers,需要修改
alerting.alertmanagers.static_configs.targets
的IP地址,这时Prometheus和alertmanagers是两个docker容器,IP为运行alertmanagers的宿主机的IP地址 - 新增了Prometheus alertmanagers告警规则,添加
rule_files
(指定报警规则),并增加三条规则(rules.yml) - 这里新增的三条报警规则分别是:节点的文件系统,节点内存,CPU的使用量。如果大于了80%的话就触发label为
team=node
的receiver
(alertmanager 配置文件中配置),可以看到上面的配置就会匹配email
这个receiver
|
|
|
|
部署prometheus
使用Deployment的形式来设置Prometheus
参考:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
创建Node Label:
|
|
prometheus-deploy.yaml:
|
|
|
|
|
|
|
|
访问prometheus
prometheus启动成功后,我们就可以打开prometheus dashboard查看了,访问 http://ip:9090/graph ,点status
–>Targets
可以看到prometheus已经成功访问到k8s api-server并获取到监控指标
访问Alertmanager
alertmanager启动后,我们可以打开alertmanager Dashboard查看,访问 http://ip:9093
当然在prometheus dashboard也可以查看,在status –> Runtime & Build Information 最底部
告警规则
在Prometheus定义的rules生效后,可以在Status –>Rules 这里看到
- 点击的
expr
会直接跳转到Prometheus graph
页面查询,在制定报警规则的时候,可以先在Prometheus中测试表达式
在Prometheus的Alerts这里可以看到触发告警规则的状态
目前有三台主机成功触发规则
一个报警信息在生命周期内有下面3中状态:
inactive
: 表示当前报警信息既不是firing
状态也不是pending
状态pending
: 表示在设置的阈值时间范围内被激活。这时Prometheus处于等待状态,大概等待3分钟左右,整合所有的告警条目,等待集中发送给Alertmanagerfiring
: 表示超过设置的阈值时间被激活。这时Prometheus处于发送告警到Alertmanager阶段,也是最终状态
触发规则后,也可以在Alertmanager Dashboard上看到
最后来一张,我们成功收到Alertmanager的告警邮件截图
查询监控数据
Prometheus提供了API
的方式进行数据查询,同样可以使用query语言
进行复杂的查询任务
点Graph
查询每个POD的CPU使用情况,输入:sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )
更多查询条件参考:
https://prometheus.io/docs/prometheus/latest/querying/basics/
https://prometheus.io/docs/prometheus/latest/querying/api/
https://prometheus.io/docs/prometheus/latest/querying/examples/
Q&A
Question:
如果遇到下面的报错:
Answer:
在prometheus-deploy.yaml
中spec.spec.
下增加如下配置:
|
|
详细配置参考上面prometheus-deploy.yaml配置文件
参考:https://github.com/prometheus/prometheus/issues/2939
Question:
|
|
Answer:
遇到上面的报错,首先先检查下docker容器是否联网,再测试下与smtp服务器是否正常通讯
|
|
在测试过程中发现,腾讯邮箱(个人QQ邮件+企业邮箱),只支持SMTP SSL 465端口,且不支持TLS,smtp_require_tls
这个参数官方默认是true
,这里需要设置为 smtp_require_tls: false
,使用不同邮箱的SMTP 需要具体测试。
Prometheus监控Kubernetes HTTP集群
环境:
Prometheus v1.0.1
node-exporter v0.15.2
Kubernetes v1.8.2
服务器环境如上
|
|
|
|
|
|
|
|
|
|
其他的同上,Prometheus监控Kubernetes HTTP集群配置文件见附件
注:经测试,目前只发现Prometheus v1.0.1
支持,测试其他版本都有报错
参考:
https://blog.qikqiak.com/post/kubernetes-monitor-prometheus-grafana/
https://blog.qikqiak.com/post/update-prometheus-2-in-kubernetes/
https://github.com/cnych/k8s-repo/tree/master/prometheus
https://blog.qikqiak.com/post/alertmanager-of-prometheus-in-practice/
https://blog.csdn.net/qq_21398167/article/details/76008594?locationnum=10&fps=1
https://segmentfault.com/a/1190000008695463
https://prometheus.io/docs/alerting/overview/
附件:
Prometheus监控TLS K8S配置文件.zip
Prometheus监控K8S HTTP配置文件.zip
本文出自”Jack Wang Blog”:http://www.yfshare.vip/2018/03/14/Prometheus监控TLS-Kubernetes集群/