一、Prometheus概述

1、Prometheus简介

Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件 Prometheus server 会定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉取数据,新拉取到的数据会持久化到存储设备当中。

每个被监控的主机都可以通过专用的 exporter 程序提供输出监控指标数据的接口,它会在目标处收集监控数据,并暴露出一个 HTTP 接口供 Prometheus server 查询, Prometheus 通过基于 HTTP 的 pull 的方式来周期性的采集数据,默认时间是 15s 抓取一次。
抓取到的指标数据会被以时间序列的形式保存在内存中,并且定时刷到磁盘上,默认是两个小时回刷一次。并且为了防止 Prometheus 发生崩溃或重启时能够恢复数据, Prometheus 也提供了类似 MySQL 中 binlog 一样的 wal 预写日志,当 Prometheus 崩溃重启时,会读这个预写日志来恢复数据。

如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到 Alertmanager 完成告警的汇总和分发。

对于短时间执行的脚本任务或者不好直接 pull 指标数据的服务,Prometheus 提供了 Pushgateway 给这些任务将服务指标数据主动 push 到 Pushgateway 并临时存储,然后等待 Prometheus server 完成数据的采集。

任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让 Prometheus 通过服务发现的机制进行动态管理。
Prometheus 能够直接把K8S的 API Server 作为服务发现系统使用,进而动态发现和监控K8S集群中的所有可被监控的对象。

 

2、TSDB 介绍

TSDB 作为 Prometheus 的存储引擎完美契合了监控数据的应用场景

  • 存储的数据量级十分庞大
  • 大部分时间都是写入操作
  • 写入操作几乎是顺序添加,大多数时候数据都以时间排序
  • 很少更新数据,大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库
  • 删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据
  • 基本数据大,一般超过内存大小。一般选取的只是其一小部分且没有规律,缓存几乎不起任何作用
  • 读操作是十分典型的升序或者降序的顺序读
  • 高并发的读操作十分常见

3、Prometheus 的特点

多维数据模型:由度量名称和键值对标识的时间序列数据
时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;服务器指标数据、应用程序性能监控数据、网络数据等都是时序数据

内置时间序列(Time Series)数据库:Prometheus ;外置的远端存储通常会用:InfluxDB、OpenTSDB 等

promQL:一种灵活的查询语言,可以利用多维数据完成复杂查询

基于 HTTP 的 pull(拉取)方式采集时间序列数据;同时支持 PushGateway 组件收集数据

通过静态配置或服务发现发现目标

支持作为数据源接入 Grafana    

4、Prometheus 组件

Prometheus Server 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由 Prometheus Server 所负责。
Prometheus 生态圈中包含了多个组件,其中部分组件可选:

(1)Prometheus server:服务核心组件,采用 pull 方式采集监控数据,通过 http 协议传输;存储时间序列数据;基于“告警规则”生成告警通知。

Prometheus server 由三个部分组成:Retrieval,Storage,PromQL

Retrieval:负责在活跃的 target 主机上抓取监控指标数据。
Storage:存储,主要是把采集到的数据存储到磁盘中。默认为 15 天。
PromQL:是 Prometheus 提供的查询语言模块。

(2)Client Library: 客户端库,目的在于为那些期望原生提供 Instrumentation 功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。

(3)Exporters:指标暴露器,负责收集不支持内建 Instrumentation 的应用程序或服务的性能指标数据,并通过 HTTP 接口供 Prometheus Server 获取。换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为 Prometheus 格式的指标向外暴露。

常用的 Exporters:

●Node-Exporter:用于收集服务器节点的物理指标状态数据,如平均负载、CPU、内存、磁盘、网络等资源信息的指标数据,需要部署到所有运算节点。

●mysqld-exporter/nginx-exporter

●Kube-State-Metrics:为 Prometheus 采集 K8S 资源数据的 exporter,通过监听 APIServer 收集 kubernetes 集群内资源对象的状态指标数据,例如 pod、deployment、service 等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。
需要注意的是 kube-state-metrics 只是简单的提供一个 metrics 数据,并不会存储这些指标数据,所以可以使用 Prometheus 来抓取这些数据然后存储, 主要关注的是业务相关的一些元数据,比如 Deployment、Pod、副本状态等;调度了多少个 replicas ?现在可用的有几个?多少个 Pod 是 running/stopped/terminated 状态?Pod 重启了多少次?有多少 job 在运行中。

●cAdvisor:用来监控容器内部使用资源的信息,比如 CPU、内存、网络I/O、磁盘I/O 。

●blackbox-exporter:监控业务容器存活性。

(4)Service Discovery:服务发现,用于动态发现待监控的 Target,Prometheus 支持多种服务发现机制:文件、DNS、Consul、Kubernetes 等等。 服务发现可通过第三方提供的接口,Prometheus 查询到需要监控的 Target 列表,然后轮询这些 Target 获取监控数据。该组件目前由 Prometheus Server 内建支持

(5)Alertmanager:是一个独立的告警模块,从 Prometheus server 端接收到 “告警通知” 后,会进行分组、去重,并路由到相应的接收方,发出报警, 常见的接收方式有:电子邮件、钉钉、企业微信等。
Prometheus Server 仅负责生成告警指示,具体的告警行为由另一个独立的应用程序 AlertManager 负责;告警指示由 Prometheus Server 基于用户提供的告警规则周期性计算生成,Alertmanager 接收到 Prometheus Server 发来的告警指示后,基于用户定义的告警路由向告警接收人发送告警信息。

(6)Pushgateway:类似一个中转站,Prometheus 的 server 端只会使用 pull 方式拉取数据,但是某些节点因为某些原因只能使用 push 方式推送数据, 那么它就是用来接收 push 而来的数据并暴露给 Prometheus 的 server 拉取的中转站。
可以理解成目标主机可以上报短期任务的数据到 Pushgateway,然后 Prometheus server 统一从 Pushgateway 拉取数据。

(7)Grafana:是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。

5、Prometheus的工作流程

1)prometheus server通过静态配置或服务发现的方式获取监控目标target(通过exporter或pushgateway暴露的http接口)
2)prometheus server通过http pull拉取的方式从监控目标target采集监控指标数据
3)prometheus server将采集到的监控指标数据通过时序数据库持久化存储到本地磁盘或外置存储中
4)prometheus server通过将采集到的监控指标数据与本地配置的监控告警规则进行计算比对,如果触发告警则生成告警通知发送给alertmanager
5)alertmanager接收到prometheus server发来的告警通知后,对告警通知分组、去重,再通过邮件、钉钉、企业微信等方式发送给接收人
6)prometheus支持原生的web UI或grafana接入prometheus数据源,通过promQL查询数据,以图形化形式展示监控数据

6、Prometheus 的局限性:

●Prometheus 是一款指标监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据;

●Prometheus 认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对大量的历史数据进行存储;
若需要存储长期的历史数据,建议基于远端存储机制将数据保存于 InfluxDB 或 OpenTSDB 等系统中;

●Prometheus 的集群机制成熟度不高,可基于 Thanos 或 Cortex 实现 Prometheus 集群的高可用及联邦集群。
 

注:Prometheus支持使用influxdb等大型的时序数据库系统作为外置远端存储,实现长期存储历史数据。

1、基于thanos实现prometheus集群的高可用。在K8S上部署prometheus,thanos通过边车模式与promethus部署在同一个Pod里共享监控数据,由thanos在外置存储中进行远程读写操作。
 2、通过联邦模式将多个prometheus集群的监控数据进行聚合汇总,实现统一展示和管理

二、Prometheus部署

关闭防火墙

systemctl disable --now firewalld
setenforce 0

Prometheust Server 端安装和相关配置

上传 prometheus-2.45.0.linux-amd64.tar.gz 到 /opt 目录中,并解压
tar xf prometheus-2.45.0.linux-amd64.tar.gz
mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus
cd /usr/local/prometheus/
vim prometheus.yml
 scrape_interval: 15s			#采集目标主机监控数据的时间间隔,默认为1m
  evaluation_interval: 15s 		#触发告警生成alert的时间间隔,默认是1m
  # scrape_timeout is set to the global default (10s).
  scrape_timeout: 10s			#数据采集超时时间,默认10s
metrics_path: '/metrics'    #指标数据采集路径,默认为 /metrics

 

配置系统启动文件
 
cd /usr/lib/systemd/system
vim prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention.time=15d \
--web.enable-lifecycle
  
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
 
systemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep 9090

常用的监控指标: 

●node_cpu_seconds_total
●node_memory_MemTotal_bytes
●node_filesystem_size_bytes{mount_point=PATH}
●node_system_unit_state{name=}
●node_vmstat_pswpin:系统每秒从磁盘读到内存的字节数
●node_vmstat_pswpout:系统每秒钟从内存写到磁盘的字节数

刚开始prometheus只能监控本机,若是需要监控其他资源,还需要部署exports 

部署 Exporters监控本机

上传 node_exporter-1.3.1.linux-amd64.tar.gz 到 /opt 目录中,并解压
cd /opt/
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64 /usr/local/node_exporter
cd /usr/local/node_exporter
mv node_exporter /usr/local/bin/
 
 
 
配置启动文件
cd /usr/lib/systemd/system
vim node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat
 
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
 
 
systemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep node_exporter

关联prometheus监控9100端口

cd /usr/local/prometheus/
vim prometheus.yml
末尾添加
- job_name: "node_exporter"
    scheme: http
    metrics_path: /metrics
    static_configs:
    - targets:
      - 192.168.10.30:9100
      labels:
        service: node_exporter
 
curl -X POST http://192.168.10.33:9090/-/reload  重新载入配置

浏览器查看(Status->Targets)

监控其他主机

cd /usr/local/bin/
scp node_exporter 192.168.10.30:`pwd`
cd /usr/lib/systemd/system
scp node_exporter.service 192.168.10.30:`pwd`
 
将本地的配置文件和启动文件复制到需要监控的主机
 
 
需监控主机操作
systemctl start node_exporter.service
systemctl enable node_exporter.service
netstat -lntp | grep 9100

普罗米修斯服务器
cd /usr/local/prometheus/
vim prometheus.yml 
static_configs:
    - targets:
      - 192.168.10.30:9100
      - 192.168.10.31:9100       #添加需要监控的服务器
      labels:
        service: node_exporter
 
 
curl -X POST http://192.168.10.30:9090/-/reload重载

监控mysql数据库

mysql服务器
cd /opt
上传mysqld_exporter-0.14.0.linux-amd64.tar.gz
 tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
cd mysqld_exporter-0.14.0.linux-amd64/
mv mysqld_exporter /usr/local/bin/
mysqld_exporter --help

cd /usr/lib/systemd/system
vim mysqld_exporter.service
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf
 
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

修改 MySQL 配置文件

vim /etc/my.cnf
host=localhost
user=exporter
password=abc123

授权 exporter 用户
mysql -u root -pabc123
create user 'exporter'@'localhost' identified by 'abc123';
grant process, replication client, select on *.* to 'exporter'@'localhost';
flush privileges;
quit
systemctl restart mysqld_exporter.service
systemctl enable mysqld_exporter.service
netstat -lntp | grep 9104

普罗米修斯服务器
cd /usr/local/prometheus
vim prometheus.yml
- job_name: "mysqld_exporter"
    scheme: http
    metrics_path: /metrics
    static_configs:
    - targets:
      - 192.168.10.20:9104
      labels:
        service: mysqld      
 
末尾添加
 
systemctl reload prometheus.service 

监控nginx服务器

下载 nginx-exporter 地址:https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
下载 nginx 地址:http://nginx.org/download/
下载 nginx 插件地址:https://github.com/vozlt/nginx-module-vts/tags

上传nginx-1.12.0.tar.gz、nginx-module-vts-0.1.18.tar.gz、 nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
 
useradd -M -s /sbin/nologin nginx
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts
tar xf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/nginx-module-vts
 
 
make -j2 && make install
修改 nginx 配置文件,启动 nginx
cd /usr/local/nginx/conf
 
 81    server {
 82         listen 8080;
 83         vhost_traffic_status off;
 84         allow 127.0.0.1;
 85         allow 192.168.9.113;
 86 
 87         location /nginx-status {
 88             stub_status on;
 89             access_log off;
 90         }
 91         location /vts-status {
 92             vhost_traffic_status_display;
 93             vhost_traffic_status_display_format html;
 94         }
 95     }
 
 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t

cat > /lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

systemctl start nginx
systemctl enable nginx
解压 nginx-exporter,启动 nginx-exporter
cd /opt/
tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/

cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/status/format/json

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl start nginx-exporter
systemctl enable nginx-exporter

netstat -natp | grep :9913

 

普罗米修斯服务器
vim prometheus.yml 
- job_name: "nginx_vts_exporter"
    scheme: http
    metrics_path: /metrics
    static_configs:
    - targets:
      - 192.168.10.31:9913
      labels:
        service: nginx
最后添加

三、部署 Grafana 进行展示 

下载地址:https://grafana.com/grafana/download
                 https://mirrors.bfsu.edu.cn/grafana/yum/rpm/

上传grafana-7.4.0-1.x86_64.rpm
rpm -ivh grafana-7.4.0-1.x86_64.rpm
 
systemctl start grafana-server.service
systemctl enable grafana-server.service 
netstat -lntp | grep 3000

浏览器访问

如何查看其他nodeport节点数据

总结:

Zabbix:更适合于传统业务架构的物理机、虚拟机环境的监控,对服务器系统和传统应用组件监控比较成熟,但是对容器的支持比较差。
        数据存储主要采用的是关系型数据库,会随着被监控节点数量的增加,关系型数据库的负载压力也会变大,监控数据的读写也会变慢。
        对大规模集群监控的性能比prometheus要弱一些,可适用于单集群规模不超过1000台节点的场景。

Prometheus:除了传统业务架构,还能支持云环境、K8S容器集群的监控,是目前容器监控最好的解决方案。
            数据存储采用的是时序数据库,大大的节省存储空间,还能提升查询效率。
            单集群能支持的节点规模更大,通常超过2000台节点、服务数量大于1000个的时候建议直接上Prometheus。

 

Prometheus是一个开源的监控系统 + 时间序列数据库。
数据模型:时间序列,格式:指标度量名称{键值对标签集}
node_cpu_usage{instance="node01", cpuid="0"} 
node_cpu_usage{instance="node01", cpuid="1"} 
node_cpu_usage{instance="node02", cpuid="0"} 
node_cpu_usage{instance="node02", cpuid="1"} 
指标度量名称     键值对标签集
node_memory_usage{instance="node01"}
node_memory_usage{instance="node02"}

Prometheus数据采集配置

scrape_configs:
- job_name: XXX                         #自定义监控任务的名称
  scheme: http                          #指定请求监控数据的协议,http(默认值) 或 https
  metrics_path: /metrics                #指定请求监控数据的URL路径,一般都是 /metrics
  
  #定义静态配置的监控目标
  static_configs:
  - targets:
    - IP1:端口1                        #指定监控目标节点的IP和exporter的端口
    - IP2:端口2
    labels:
      key: value                       #自定义监控目标的标签

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐