prometheus部署

Posted 时代广场的蟋蟀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了prometheus部署相关的知识,希望对你有一定的参考价值。

一、prometheus简介

1、概述

谷歌的内部大型集群系统borg,是kubernetes的前身。其监控系统是Prometheus,而prometheus是其克隆版,所以非常契合k8s的监控对容器非常适用。
Prometheus是一套开源的监控、报警、时间序列、数据库的组合采集的样本以时间序列的方式保存在内存(TSDB时序数据库)中并定时保存到硬盘中(持久化)时序数据库不属于sql数据库也并不是nosql数据库
官网:https://prometheus.io/docs/concepts/data_model/

2、特点

Prometheus特点:
自定义多维数据模型(时序列数据由metric名和一组key/value标签组成)
非常高效的储存平均一个采样数据占大约3.5bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G
在多维上灵活且强大的查询语句(PromQL)
不依赖分布式储存,支持单主节点工作
通过基于HTTP的pull方式采集时序数据
可以通过push gateway进行时序列数据库推送(pushing)
可以通过服务发现或静态配置去获取要采集的目标服务器
多种可视化图表及仪表盘支持

3、组件

prometheus生态圈中包含了多个组件,其中部分组件可选
1.Prometheus Server:收集和储存时间序列数据
通过scraping以刮擦的方式去获取数据放入storge(TSDB时序数据库),制定Rules/Alerts:告警规则,service discovery是自
动发现需要监控的节点
2.Client Library:客户端库,目的在于为那些期望原生提供Instrumentation功能的应用程序提供便捷的开发途径;
Push Gateway:接收那些通常由短期作业生成的指标数据的网关,并支持由Prometheus Server进行指标拉取操作;
Exporters:用于暴露现有应用程序或服务(不支持Instrumentation)的指标给Prometheus Server
3.Alertmanager:由告警规则对接,从Prometheus Server接收到"告警通知"后,通过去重、分组、路由等预处理功能后以高效向用户完成告警信息发送
4.Data Visualization(Dashboards): 与TSDB对接并且展示数据库中的数据,Prometheus web UI (Prometheus Server内建),及Grafana等;
5.Service Discovery:动态发现待监控的Target,从而完成监控配置的重要组件,在容器化环境中尤为有用;该组件目前由PropetheusServer内建支持

(一)Exporters介绍
node-exporter组件,因为prometheus抓取数据是通过http的方式调用的,假如抓取的数据是操作系统的资源负载情况,而linux操作系统内核是没有内置任何http协议的,并不支持直接通过http方式进行,所以需要在每个被监控端安装node-exporter,由其向内核中拿取各种状态信息,然后再通过prometheus兼容的指标格式暴露给prometheus
对于那些未内建Instrumentation,且也不便于自行添加该类组件以暴露指标数据的应用程序来说,常用的办法是于待监控的目标应用程序外部运行一个独立指标暴露程序,该类型的程序即统称为Exporter。
PS:Prometheus站点上提供了大量的Exporter,如果是docker技术跑多个服务就要使用docker-exportes
(二)alerts(告警)介绍
抓取异常值,异常值并不是说服务器的报警只是根据用户自定义的规则标准,prometheus通过告警机制发现和发送警示。
alter负责:告警只是prometheus基于用户提供的"告警规则"周期计算生成,好的监控可以事先预告报警、并提前处理的功能alter接受服务端发送来的告警指示,基于用户定义的告警路由(route)向告警接收人(receivers)发送告警信息(可由用户定义)
ps:在数据查询,告警规则里面会使用到promQL语句
(三)prometheus server
内建了数据样本采集器,可以通过配置文件定义,告诉Prometheus到哪个监控对象中采集指标数据,prometheus采集过后,会存储在自己内建的TSDB数据库中,提供了promQL,支持查询和过滤操作,同时支持自定义规则来作为告警规则,持续分析一场指标,一旦发生,通知给alter来发送报警信息,还支持对接外置的ui工具(grafana)来展示数据,prometheus自带的web展示图像信息比较简单。
采集、抓取数据是其自身的功能。但一般来自于export/instrumentation(指标数据的暴露)来完成,或者是服务自身的内建的测量系统来完成

4、架构图

1.prometheus-server:
retrieval(获取数据pull/discover),TSDB存储,HTPserver 控制台接口,内建了数据样本采集器,可以通过配置文件定义,告诉prometheus到那个监控对象中采集指标数据,prometheus采集过后,会存储在自己内建的TSDB数据库中(默认为2个月时间)),提供了promQL支持查询和过滤操作,同时支持自定义规则来作为告警规则,持续分析一场指标,一旦发生,通知给alerter来发送告警信息,还支持对接外置的UI工具 (grafana)来展示数据
2.pushgateway(短期周期任务)
允许短暂和批量作业将其指标暴露给普罗米修斯,由于这些类型的作业可能存在时间不足而被删除,因此他们可以将其指标推送到pushgateway,然后pushgateway将这些指标暴露给Prometheus-server端,主要用于业务数据汇报
3.exporters(常规任务—守护进程)
专门采集一些web服务,nginxmysql服务。因为不适合直接通过http的方式采集数据,所以需要通过exporter采集数据(下载mysql_exporter,采集mysql数据指标)cadvisor:docker数据收集工具(docker也有自己内置的监控收集方式)
exporter和instrumtations,负责专门服务数据的收集然后暴露出来等待promtheus收集
4.service discovery:原生支持k8s的服务发现,支持consul、DNS等
5.prometheus内置TSDB数据库作为存储(时序数据的储存,promtheus的TSDB数据库默认保存15天,可以自行调整)
ps:时间序列数据库(时序数据库)主要用于指处理代表签(按照时间的顺序变化,既时间序列化)的数据,带时间标签的数据也成为时间序列数据,这是一种特殊类型的数据库,一般不会保存长时间的数据(与mysql相比)。
数据保存时间 storge.tsdb.retention=90d参数中修改即可(或启动时间指定)
6.alertmanagr:prometheus可以生成告警信息,但是不能直接提供告警,需要使用一个外置的组件altermanager来进行告警,emailetcd优势在于,收敛、支持静默、去重、可以防止告警信息的轰炸
7.data visualization:prometheus web ui(prometheus-server内建),也可以使用grafana
8.PrmoQL(告警规则编写),通常告警规则的文件指定输出到展示界面(grafana)
9.ui表达式浏览器(调试)

二、常规部署

master 192.168.221.20 prometheus
node1 192.168.221.30
node2 192.168.221.40

1、下载、解压prometheus安装包

方法一、设置本地仓库
cat > /etc/yum.repos.d/prometheus.repo<< EOF
[prometheus] name=prometheus
baseurl=https://packagecloud.io/prometheus-rpm/release/el/$releasever/$basearchrepo_gpgcheck=1
enabled=1
gpgkey=https: //packagecloud.io/prometheus-rpm/release/gpgkey.
https://raw.githubusercontent.com/lest/prometheus-rpm/master/RPM-GPG-KEY-prometheus-rpm
gpgcheck=1 metadata_expire=300
EOF

方法二、拖入安装包
tar zxvf prometheus-2.27.1.linux-amd64.tar.gz -C /usr/local/

2、查看默认配置

cd /usr/local/prometheus-2.27.1.linux-amd64
cat prometheus.yml 

#默认配置文件
cat prometheus.yml
# my global config 全局组件
global:
#每隔多久抓一次指标
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
#内置告警规则和评估周期
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration 对接alertmanger
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
告警系统配置(如何加载/对接告警/记录)
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

3、设置时间同步并开启

ntpdate ntp1.aliyun.com

#直接开启
./prometheus

#另开一个端口查看
netstat -natp | grep 9090


4、访问验证

#访问1: 192.168.221.20:9090查看prometheus(表达式浏览器)I

#访问2: 192.168.221.20:9090/metrics查看采集数据
prometheus 会进行周期性的采集数据(完整的),多次周期性(在一个时间区间内)采集的数据集合,形成了时间序列


5、节点安装node_exporter并启动

node1 192.168.221.30
node2 192.168.221.40
prometheus想要监控节点,则需要借助于node_exporter,下载地址https:/ /prometheus.io/download/

#解压node exporter
tar zxvf node_exporter-1.1.2.linux-amd64.tar.gz

#基于go语言开发,无需其他配置
cd node_exporter-1.1.2.linux-amd64/

#复制命令,让系统可以识别
cp node_exporter /usr/local/bin/



6、配置prometheus.yml文件(静态发现)

静态发现
vim prometheus.yml 

# 添加节点配置
  - job_name: 'nodes' #定义标签
    static_configs:       #静态配置
    - targets:
      - 192.168.221.30:9100    
      - 192.168.221.40:9100

#再次访问ip,可以看见node节点出现
192.168.221.20:9090


查询node指标

过滤标签
#CPU使用总量(所有节点)
node_cpu_seconds_total
#CPU空闲值(所有节点)
node_cpu_seconds_total { mode='idle'}
#指定查看节点
node_cpu_seconds_total{mode='idle', instance="192.168.221.30:9100"}

#进阶1:
计算过去5分钟内的CPU使用速率
PromQL: irate(node_cpu_seconds_total { mode="idle" } [ 5m] )
解析:
irate:速率计算函数(灵敏度非常高的>
node_cpu_seconds total: 
node节点cPu使用总量mode="idle"空闲指标
5m:过去的5分钟内,所有cPU空闲数的样本值,每个数值做速率运算
#进阶2:
每台主机cPU在5分组内的平均使用率
PromQL: (1- avg (irate(node_cpu_seconds_total[mode='idle' ) [5m]))by (instance)* 100
解析
avg: 平均值
avg (irate (node_cpu_seconds_total fmode='idle' } [5m]):可以理解为CPU空闲量的百分比
by (instance) :表示的是所有节点
(1i- avg (irate(node_cpu_seconds_total [mode='idle'][5m]))by (instance))× 100:CPU5分钟内的平均使用率

其他常用的指标:
1、查询分钟平均负载超过主机cPu数量两倍的时间序列
node_load1 > on (instance) 2 * count (node_cpu_seconds_total[mode=' idle')) by(instance)
2、内存使用率
node_memory_MemTotal_ bytes
node_memory_MemFree_bytes
node_inemory_Buffers_bytes
node_memory_Cached_bytes
3、计算使用率
可用空间:以上后三个指标之和
己用空间:总空间减去可用空间
使用率:已用空间除以总空间

三、动态发现

Prometheus的服务发现
基于文件的服务发现;
基于DNS的服务发现;
基于API的服务发现:Kubernetes、Consul、Azure、…

1、基于文件发现

mkdir file_sed
cd file_sed/  (创建targets目录  prometheus.yml文件)
mkdir targets (创建prometheus_server.yaml  node_centos.yaml)
touch prometheus.yml
[root@master /usr/local/prometheus-2.27.1.linux-amd64/file_sed/targets] # cat prometheus_server.yaml 
- targets:
  - 192.168.221.20:9090
  labels:
    app: prometheus
    job: prometheus

[root@master /usr/local/prometheus-2.27.1.linux-amd64/file_sed/targets] # vim nodes_centos.yaml
- targets:
  - 192.168.221.30:9100
  - 192.168.221.40:9100
  labels:
    app: node-exporter
    job: node

[root@master /usr/local/prometheus-2.27.1.linux-amd64/file_sed] # vim prometheus.yml
    file_sd_configs:
    - files:
      - targets/prometheus_*.yaml
      refresh_interval: 2m

  # All nodes
  - job_name: 'nodes'
    file_sd_configs:
    - files:
      - targets/nodes_*.yaml
      refresh_interval: 2m     

./prometheus --config.file=./file_sd/prometheus.yml         



2、基于dns服务发现

>基于DNS的服务发现针对一组DNS域名进行定期查询,以发现待监控的目标
查询时使用的DNS服务器由/etc/resolv.conf文件指定;
该发现机制依赖于A、AAAA和SRv资源记录,且仅支持该类方法,尚不支持REC6763中的高级DNs发现方式PS:
#SRV:SRV记录的作用是指明某域名下提供的服务。
实例:
_http._tcp.example.com. SRV 10 5 80. www.example.com

>SRV后面项目的含义:
10 -优先级,类似MX记录
5-权重
80 -端口
www.example.com -实际提供服务的主机名。
同时sRV可以指定在端口上对应哪个service
#prometheus 基于Du的服务中的sR记录,iprometheus发现指定target上对应的端口对应的是exporter或instrumentation

>示例:
names:
[ - <string> ] 										#定义SRV资源记录的名称,比如"prometheus._tcp.kgc.com"
[ type: <string> | defualt - 'SRV']					#基于哪种方式的DNS服务发现
[ port: <int> ]										#指定的端口是哪个
[ refresh_interval: <duration> | default = 30s ]	#多长时间刷新一次

3、基于consul部署

192.168.221.20

unzip consul_1.9.0_linux_amd64.zip -d /usr/local/bin
mkdir -pv /consul/datamkdir /etc/consul
cd /etc/consul/
consul agent -dev -ui -data-dir=/consul/data/ \\
> -config-dir=/etc/consul/ -client=0.0.0.0

agent -dev : 运行开发模式
agent -server:运行server模式-ui : ui界面
-data-dir :数据位置
-config-dir :配置文件位置
/etc/consul :可以以文件形式定义好的各个services的配置,也可以基于api接口直接配置-client:监听地址
运用的端口:8500


[root@master ~] # cd /etc/consul/
[root@master /etc/consul] # vim prometheus-servers.json

{
  "services": [
    {
      "id": "prometheus-server-node01",
      "name": "prom-server-node01",
      "address": "192.168.221.20",
      "port": 9090,
      "tags": ["prometheus"],
      "checks": [{
        "http": "http://192.168.221.20:9090/metrics",
        "interval": "5s"
      }]
    }
  ]
}

#重载consul 配置文件
consul services register /etc/consul/prometheus-servers.json

#也可以使用consul reload 进行重载


[root@master /usr/local/prometheus-2.27.1.linux-amd64/consul_sd] # vim prometheus.yml 
    consul_sd_configs:
    - server: "192.168.221.20:8500"
      tags:
      - "prometheus"
      refresh_interval: 2m

  # All nodes
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "192.168.221.20:8500"
      tags:
      - "nodes"
      refresh_interval: 2m

 ./prometheus --config.file=./consul_sd/prometheus.yml
 ##此时查看prometheus
targets指标,只能看到一个prometheus,因为配置文件中配置了"prometheus"的tag,所以只会抓取pro的配置


## 定义node节点
[root@master /etc/consul] # vim nodes.json 

{
  "services": [
    {
      "id": "node_exporter-node01",
      "name": "node01",
      "address": "192.168.221.30",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://192.168.221.30:9100/metrics",
        "interval": "5s"
      }]
    },
    {
      "id": "node_exporter-node02",
      "name": "node02",
      "address": "192.168.221.40",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://192.168.221.40:9100/metrics",
        "interval": "5s"
      }]
    }
  ]
}

./prometheus --config.file=./consul_sd/prometheus.yml



四、 Prometheus对接grafana

Grafana是一款基于go语言开发的通用可视化工具,支持从多种不同的数据源加载并展示数据,可作为其数据源的部分存储系统
如下所示
TSDB: Prometheus、IfluxDB、OpenTSDB和Graphit
日志和文档存储:Loki和Elasitchsearch
分布式请求跟踪:Zipkin、 Jaeger和Tempo
SQL DB: MySQL、PostgresQL和Microsoft SQL Server

Grafana基础
默认监听于TCP协议的3000端口,支持集成其他认证服务,且能够通过/metrics输出内建指标;
几个基本概念
数据源((Data source) :提供用于展示的数据的存储系统;
仪表盘(Dashboard):组织和管理数据的可视化面板(Panel) ;
团队和用户:提供了面向企业组织层级的管理能力;

1、部署grafana

Centos系统上的部署步骤
VERSION=7.3.6
wget https://mirrors.huaweicloud.com/grafana/7.3.6/grafana-7.3.6-1.x86_64.rpm
yum install grafana-7.3.6-1.x86_64.rpm
systemctl start grafana-server

Docker容器运行方式
VERSION=7.3.6
docker run -d --name=grafana -p 3000:3000 grafana/grafana
#账号密码默认为admin, admin
#grafana默认配置文件目录/etc/grafana/grafana.ini

#直接访问ip:8500进入grafana控制台
#grafana模板
https://grafana.com/grafana/dashboards
8919

2、登录grafana














五、alertmange对接邮箱

192.168.221.20

tar zxvf alertmanager-0.22.2.linux-amd64.tar.gz -C /usr/local

#查看默认配置文件
cat /usr/local/alertmanager/alertmanager.yml 
route:										#路由信息
  group_by: ['alertname']					#分组
  group_wait: 30s							#分组缓冲/等待时间
  group_interval: 5m						#重新分组时间
  repeat_interval: 1h						#重新告警间隔
  receiver: 'web.hook'						#指定接收人/媒介
receivers:									#receivers接收人/媒介具体信息
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:								#抑制规则的策略
  - source_match:							#匹配项
      severity: 'critical'					#严重的级别
    target_match:
      severity: 'warning'					#target匹西配warning级别
    equal: ['alertname', 'dev', 'instance'] #符合alertname . dev、instance

2、修改altermanger.yml文件

cat /usr/local/alertmanager/alertmanager.yml 
global:
  resolve_timeout: 5m
  smtp_from: 649859205@qq.com
  smtp_auth_username: 649859205@qq.com
  smtp_auth_password: zwesluwiubnmbdhb
  smtp_require_tls: false
  smtp_smarthost: 'smtp.qq.com:465'
 
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email-koubei'
receivers:
- name: 'email-koubei'
  email_configs:
  - to: 649859205@qq.com
    send_resolved: true

./alertmanger 

3、修改邮箱配置



4、添加配置文件

[root@master /usr/local/prometheus-2.27.1.linux-amd64/alter-config] # tree
.
├── alter_rules
│   └── instance_down.yaml
├── prometheus.yml
└── targets
    ├── alertmanagers.yaml
    ├── nodes-linux.yaml
    └── prometheus-servers.yaml



[root@master /usr/local/prometheus-2.27.1.linux-amd64/alter-config/alter_rules] # cat instance_down.yaml 
groups:
- name: AllInstances
  rules:
  - alert: InstanceDown
    # Condition for alerting
    expr: up == 0
    for: 1m
    # Annotation - additional informational labels to store more information
    annotations:
      title: 'Instance down'
      description: Instance has been down for more than 1 minute.'
    # Labels - additional labels to be attached to the alert
    labels:
      severity: 'critical'


[root@master /usr/local/prometheus-2.27.1.linux-amd64/alter-config] # cat prometheus.yml 
    static_configs:
    file_sd_configs:
    - files:                                               
      - targets/prometheus-*.yaml  
      refresh_interval: 2m 

  # All nodes
  - job_name: 'nodes'
    file_sd_configs:
    - files:                                               
      - targets/nodes-*.yaml  
      refresh_interval: 2m 

  - job_name: 'alertmanagers'
    file_sd_configs:
    - files:
      - targets/alertmanagers*.yaml
      refresh_interval: 2m 

[root@master /usr/local/prometheus-2.27.1.linux-amd64/alter-config/targets] # cat alertmanagers.yaml 
- targets:
  - 192.168.221.20:9093
  labels:
    app: alertmanager
[root@master /usr/local/prometheus-2.27.1.linux-amd64/alter-config/targets] # cat nodes-linux.yaml 
- targets:
  - 192.168.221.30:9100
  - 192.168.221.40:9100
  labels:
    app: node-exporter
    job: node
[root@master /usr/local/prometheus-2.27.1.linux-amd64/alter-config/targets] # cat prometheus-servers.yaml 
- targets:
  - 192.168.221.20:9090
  labels:
    app: prometheus
    job: prometheus

./prometheus --config.file=./alert-config/prometheus.yml




4、验证告警







以上是关于prometheus部署的主要内容,如果未能解决你的问题,请参考以下文章

基于docker部署prometheus+grafana

prometheus部署

prometheus部署

Prometheus基础知识及部署!

Prometheus基础知识及部署!

Prometheus基础知识及部署!