Promethues官网:
Prometheus介绍
一、Prometheus介绍
Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway
进行数据上报,Prometheus性能足够支撑上万台规模的集群。
二、Prometheus特点
2.1、prometheus特点
1)多维度数据模型
每一个时间序列数据都由metric度量指标名称和它的标签labels键值对集合唯一确定:这个metric度量指标名称指定监控目标系统的测量特征(如:http_requests_total-
接收http请求的总计数)。labels开启了Prometheus的多维数据模型:对于相同的度量名称,通过不同标签列表的结合, 会形成特定的度量维度实例。(例如:所有包含度量名称为/api/tracks
的http请求,打上method=POST的标签,则形成了具体的http请求)。这个查询语言在这些度量和标签列表的基础上进行过滤和聚合。改变任何度量上的任何标签值,则会形成新的时间序列图。
2)灵活的查询语言(PromQL):可以对采集的metrics指标进行加法,乘法,连接等操作;
3)可以直接在本地部署,不依赖其他分布式存储;
4)通过基于HTTP的pull方式采集时序数据;
5)可以通过中间网关pushgateway
的方式把时间序列数据推送到prometheus server
端;
6)可通过服务发现或者静态配置来发现目标服务对象(targets)。
7)有多种可视化图像界面,如Grafana等。
8)高效的存储,每个采样数据占3.5 bytes左右,300万的时间序列,30s间隔,保留60天,消耗磁盘大概200G。
9)做高可用,可以对数据做异地备份,联邦集群,部署多套prometheus,pushgateway上报数据
2.2、什么是样本
样本:在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:
指标(metric):指标名称和描述当前样本特征的 labelsets;
时间戳(timestamp):一个精确到毫秒的时间戳;
样本值(value): 一个 folat64 的浮点型数据表示当前样本的值。
表示方式:通过如下表达方式表示指定指标名称和指定标签集合的时间序列:
例如,指标名称为 api_http_requests_total,标签为 method="POST" 和 handler="/messages" 的时间序列可以表示为:api_http_requests_total{method="POST", handler="/messages"}
Metric类型:
Counter: 一种累加的metric,如请求的个数,结束的任务数,出现的错误数等
Gauge: 常规的metric,如温度,可任意加减。其为瞬时的,与时间没有关系的,可以任意变化的数据。
Histogram: 柱状图,用于观察结果采样,分组及统计,如:请求持续时间,响应大小。其主要用于表示一段时间内对数据的采样,并能够对其指定区间及总数进行统计。根据统计区间计算
Summary: 类似Histogram,用于表示一段时间内数据采样结果,其直接存储quantile数据,而不是根据统计区间计算出来的。不需要计算,直接存储结果
PromQL 基本使用
PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化以及rule 告警中都会使用到它。在后面章节会介绍
更多请参见详情
三、Prometheus组件介绍
1)Prometheus Server: 用于收集和存储时间序列数据。
2)Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。
3)Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端,所有向promtheus server提供监控数据的程序都可以被称为exporter
4)Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。
5)Grafana:监控仪表盘,可视化监控数据
6)pushgateway: 各个目标主机可上报数据到pushgateway,然后prometheus server统一从pushgateway拉取数据。
helm 部署prometheus
从官网仓库搜索prometheus 并按提示添加仓库并安装
https://artifacthub.io/
- 添加仓库
[root@k8s-master prometheus]# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories
[root@k8s-master prometheus]# helm repo update #更新仓库
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "bitnami" chart repository
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
[root@k8s-master prometheus]# helm search repo prometheus
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/kube-prometheus 6.1.8 0.50.0 kube-prometheus collects Kubernetes manifests t...
bitnami/prometheus-operator 0.31.1 0.41.0 DEPRECATED The Prometheus Operator for Kubernet...
bitnami/wavefront-prometheus-storage-adapter 1.0.7 1.0.3 Wavefront Storage Adapter is a Prometheus integ...
prometheus-community/kube-prometheus-stack 18.0.10 0.50.0 kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus 14.6.1 2.26.0 Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter 2.17.0 v0.9.0 A Helm chart for k8s prometheus adapter
prometheus-community/prometheus-blackbox-exporter 5.0.3 0.19.0 Prometheus Blackbox Exporter
[root@k8s-master prometheus]# helm show readme prometheus-community/prometheus #安装前看下包含的组件是否合适 此版本包含的插件比较全面
[root@k8s-master prometheus]# kubectl create ns monitor
namespace/monitor created
- 下载Chart包 根据自己需求修改
values.yaml
[root@k8s-master prometheus]# helm pull prometheus-community/prometheus
[root@k8s-master prometheus]# ls
prometheus-14.6.1.tgz
[root@k8s-master prometheus]# tar -xf prometheus-14.6.1.tgz
[root@k8s-master prometheus]# cd prometheus/
[root@k8s-master prometheus]# ls
Chart.lock charts Chart.yaml README.md templates values.yaml
- 把
prometheus-server
和prometheus-alertmanager
两个字段PVC取消掉 正式环境需要先
部署PVC存储卷
[root@k8s-master prometheus]# vim values.yaml
persistentVolume:
## If true, alertmanager will create/use a Persistent Volume Claim
## If false, use emptyDir
##
enabled: false #修改为false
#配置prometheus、alertmanager ingress hosts
ingress:
## If true, pushgateway Ingress will be created
##
enabled: true
ingressClassName: nginx #存在多个ingress 指定使用 ingress-nginx
hosts:
- prometheus.com
...
hosts:
- alertmanager.com
- 部署安装
[root@k8s-master prometheus]# helm install prometheus prometheus -n monitor
NAME: prometheus
LAST DEPLOYED: Sat Sep 18 15:40:47 2021
NAMESPACE: monitor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.monitor.svc.cluster.local
[root@k8s-master prometheus]# kubectl get pod -n monitor
NAME READY STATUS RESTARTS AGE
prometheus-alertmanager-769488c787-h9s7z 2/2 Running 0 2d21h
prometheus-kube-state-metrics-68b6c8b5c5-fgqjg 1/1 Running 0 2d21h
prometheus-node-exporter-hfw4c 1/1 Running 0 2d21h
prometheus-node-exporter-rzjzj 1/1 Running 0 2d21h
prometheus-node-exporter-vhr9p 1/1 Running 0 2d21h
prometheus-pushgateway-8655bf87b9-xwzjx 1/1 Running 0 2d21h
prometheus-server-7df4f9b485-7pz8j 2/2 Running 0 2d21h
[root@k8s-master prometheus]# kubectl get svc -n monitor
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-alertmanager ClusterIP 10.96.135.142 80/TCP 2d21h
prometheus-kube-state-metrics ClusterIP 10.96.153.83 8080/TCP 2d21h
prometheus-node-exporter ClusterIP None 9100/TCP 2d21h
prometheus-pushgateway ClusterIP 10.109.40.211 9091/TCP 2d21h
prometheus-server ClusterIP 10.104.231.248 80/TCP 2d21h
[root@k8s-master prometheus]# kubectl get ingress -n monitor
NAME CLASS HOSTS ADDRESS PORTS AGE
prometheus-alertmanager nginx alertmanager.com 192.168.103.211 80 2d21h
prometheus-server nginx prometheus.com 192.168.103.211 80 2d21h
[root@k8s-master prometheus]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.108.78.161 80:32601/TCP,443:31371/TCP 85d
ingress-nginx-controller-admission ClusterIP 10.101.146.205 443/TCP 85d