一、prometheus特性
1.1 prometheus的核心组件
核心组件主要包括:
①prometheus(prometheus-server):prometheus的核心部分,负责实现监控数据得获取,存储及查询(从各个metric源“pull”数据)。
②pushgateway:对于短期运行的进程,prometheus拉取metric的时间间隔大于该短期进程时间,可能导致数据未被检测到,对于此类型metric数据,设置该组件,短期进程将metric数据直接push到pushgateway内部,然后prometheus直接从中”pull“就可;长期进程直接被prometheus-server“pull”获取。
③metric指标获取组件(prometheus生态组件包括:Nodexporter、Kube-state-metrics、CADvisor)Kubernetes 云原生集群监控主要涉及到如下三类指标:node 物理节点指标、pod & container 容器资源指标和Kubernetes 云原生集群资源指标。针对这三类指标都有比较成熟的方案(如图1):
图 1 prometheus架构图
CADvisor:让容器用户了解容器的资源的使用情况和性能特征。用于收集、聚合、处理和导出有关正在运行的容器的信息。它为每个容器保存资源隔离参数、历史资源使用情况、完整历史资源使用直方图和网络统计信息====简而言之:就是对容器进行实时监控和性能数据采集,包括CPU、内存、网络、文件系统等资源的使用情况(默认集成于kubelet中)。
Nodeexporter:是官方提供的agent,用于手机主机的硬件和操作系统指标。(可以添加各种类型的exporter集成于prometheus中,完成更多指标的收集)
Kube-state-metrics:该组件通过监听kubernetes API服务器来生成不同资源的状态的metric数据(比如deployment、service、pod等kubernetes集群资源的metric),默认指标在侦听端口的 HTTP 端点上导出。
④altermanager:负责接收并处理来自prometheus server(也可以是其它的客户端程序)的告警信息,同时对这些信息进行分组并且路由到正确的通知方(支持钉钉报警)。
⑤图形化展示界面(一般为grafana):通过https协议访问prometheus(内部封装了PromQL语句),从而将获取的metric加工为图形进行展示。
1.2 prometheus的api接口
对于kubernetes集群,通常采用prometheus结合可视化界面进行动态监控,如图2所示,prometheus主要通过metrics获取监控数据:
在自己的环境中部署prometheus组件:自行查找资料部署,这里不作赘述;
通过:http://prometheusURL:9090/metrics获取拉取的metrics名称(如图3);http://prometheusURL:9090/graph打开搜搜面板(如图4);其中9090是默认服务端口,可通过yaml文件修改;
图 2 metrics源
图 3采集指标
图 4 prometheus搜索界面
#记得设置使用本地时间,prometheus源码中everything is utc时间,官方考虑到这点,外部client端提供了“”use local time”选项; |
1.3 prometheus的配置文件
Prometheus配置文件只有一个,那就是prometheus.yaml,里面包含了:
配置名称 | 描述 |
global | 包含全局默认配置,如抓取监控数据的间隔、抓取业务数据接口的超时时间、告警规则执行周期等; 该配置文件包含全局默认配置,如抓取监控数据间隔、抓取业务数据接口的超时时间、告警规则执行周期等。 |
alerting | altermanager是一个独立的组件,用于处理和发送告警信息。通过配置该文件,prometheus可以将告警信息发送给altermanager尽心处理。 |
rule_files | 告警规则文件包含用于触发告警条件的条件和操作。这些规则文件可以基于聚合的数据进行定义,以便进行更复杂的告警逻辑。 |
scrape_configs | 该配置文件用于指定要采集的目标列表和采集规则。它包含每个目标的服务地址、端口、请求超时等信息,以及如何从目标中抓取数据和数据处理规则等。 |
remote_write和remote_read | 这两个配置文件用于将数据投递到远程地址或者从远程地址读取数据。这使得prometheus可以与其他系统进行集成,实现更强大的数据分析和处理能力。例如可以将采集到的监控数据远程写入到其他的存储系统,或者从远程地址读取数据进一步的分析和处理。 |
二、API调用prometheus
Prometheus中稳定的HTTP API可以通过/api/v1访问.
URL请求参数:
query=:PromQL表达式。
time=<rfc3339 | unix_timestamp>:用于指定用于计算PromQL的时间戳。可选参数,默认情况下使用当前系统时间。
timeout=:超时设置。可选参数,默认情况下使用-query,timeout的全局设置。
#查看当前容器最近一分钟的cpu使用情况(已测试,单位是core) #end=`date +"%s"` #start=$((${endTime}-301)) #可以将下面的container、start、end值换为变量; [root@master2 ~]# curl -G -ss "http://promurl:9090/api/v1/query_range" --data-urlencode "query=rate(container_cpu_usage_seconds_total{container='examine'}[1m])" --data-urlencode "start=1733140543" --data-urlencode "end=1733140833" --data-urlencode "step=1" | awk -F'"' '{print $(NF-1)}' | awk -F'"' '{print $(NF-1)}'` 0.5369829449401897 #查看当前容器的内存使用情况(已测试) [root@master2 ~]# curl -G -ss "http:// promurl:9090/api/v1/query_range" --data-urlencode "query=(container_memory_working_set_bytes{container='examine'})" --data-urlencode "start=1733140543" --data-urlencode "end=1733140833" --data-urlencode "step=15" | awk -F'"' '{print $(NF-1)}'` 8224768 #计算使用cpu、内存使用百分比(此部分未测试,结合其他博客内容,理论阐述) cpu:rate(container_cpu_usage_seconds_total{container='examine'}[1m])/sum(container_spec_cpu_quota{container='examine',image!=""}/100000) 内存:(container_memory_working_set_bytes{container='examine'}/sum(container_spec_memory_limit_bytes{ container='examine',image!=""})) #查看容器启动时间 #编写脚本获取pod的节点名称和容器id; docker inspect CONTAINERID | grep StartedAt | awk -F'"' '{print $4}'` |
三、参考文献
Baeldung中文网:如何使用Prometheus获取Kubernetes容器的CPU和内存使用情况 | Baeldung中文网
个人博客:realzhangqingwei.github.io
prometheus官网:Prometheus - Monitoring system & time series database
prometheus中文文档:https://www.prometheus.wang/promql/prometheus-query-language.html