prometheus部署,解锁监控新篇章

一:监控简介及prometheus简介

1.1:监控简介:

通过业务监控系统,全面掌握业务环境的运行状态,通过白盒监控能够提前预知业务瓶颈,通过黑盒监控能够第一时间发现业务故障并通过告警通告运维人员进行紧急恢复,从而将业务影响降到最低。

1.1.1:黑盒监控与白盒监控:

复制代码
黑盒监控:关注的是时时的状态,一般都是正在发生的事件,比如nginx web界面打开的是界面报错503、磁盘无法读到数据等,即黑河监控重点在于能对正在发生的故障进行通知告警
白盒监控:关注的原因是,也就是系统内存暴漏的一些指标数据,比如nginx后端服务器的响应时长、磁盘的I/O负载值等。

监控系统需要能够有效的支持白盒监控和黑盒监控,通过白盒能够了解其内部的实际运行状态,以及对监控指标的观察能够预判可能出现的潜在问题,从而对潜在的不确定因素进行提前优化并避免问题的发生,而通过黑盒监控,比如常见的如HTTP探针、TCP探针等,可以在系统或者服务在发生故障时能够快速通知相关人员进行处理。

1.1.2:监控的价值

通过建立完善的监控体系,从而达到以下的价值:

复制代码
长期趋势分析:通过对监控样本数据的持续采集和统计,对监控指标进行长期趋势分析。例如,通过对磁盘空间增长率的判断,我们可以提前预测在未来什么时间节点上需要对资源进行扩容

对照分析:两个版本的系统运行资源使用情况的差异如何?在不同容量情况下系统的并发和负载变化如何?通过监控能够方便的对系统进行跟踪和比较

告警:当系统出现或者即将出现故障时,监控系统需要迅速反应并通知管理员,从而能够对问题进行快速的处理或者提前预防问题的发生,避免出现对业务的影响

故障分析与定位:当问题发生后,需要对问题进行调查和处理。通过对不同监控以及历史数据的分析,能够找到并解决根源问题。

数据可视化:通过可视化仪盘能够直接获取系统的运行状态、资源使用情况、以及服务运行状态等直观信息。

1.1.3:监控类型

主要是故障前的负载或并发连接类型的压力监控,和故障后的事件发现监控

1.1.3.1:故障前

基于数据的采集,结合自定义的阈值、触发告警通知:

复制代码
事前监控-基于阈值告警,例如:
	CPU、内存、磁盘(空间 IO inode)利用率、网卡速率、用户活动连接数、http请求响应时长
1.1.3.2:故障后

当发生业务故障后,监控系统及时发现故障点、并触发告警通知。

复制代码
事后故障告警,例如:
  	报错日志、访问日志、服务器宕机(硬件损坏、内核崩溃、系统异常/损坏)、http请求访问超时/无法打开/404/502等

1.2:监控系统逻辑布局

1.3:监控系统物理布局:

1.4:常见的监控系统:

开源监控软件:cacti、nagios、zabbix、smokeping、open-falcon、prometheus等

1.4.1:Cacti:

https://www.cacti.net

https://github.com/Cacti/cacti

复制代码
Cacti是基于LAMP平台展现的网络流量监测及分析工具,通过SNMP技术或自定义脚本从目标设备/主机获取监控指标信息;其次进行数据存储,调用模板将数据存到数据库,使用rrdtool存储和更新数据,通过rrdtool绘制结果图形;最后进行数据展现,通过web方式将监控结果呈现出来,常用于在数据中心监控网络设备

1.4.2:Nagios:

https://www.nagios.org/

复制代码
Nagios用来监视系统和网络的开源应用软件,利用其众多的插件实现对本机和远端服务的监控,当被监控对象发生异常时,会及时向管理员告警,提供一批预设好的监控插件,用户可以之间调用,也可以自定义shell脚本来监控服务,适合各企业的业务监控,可通过web页面显示对象状态、日志、告警信息,分层告警机制及自定义监控相对薄弱。

1.4.3:SmokePing:

https://oss.oetiker.ch/smokeping/

复制代码
Smokeping是一款用于网络性能监测的开源软件,主要用于对IDC的网络状况,网络质量,稳定性等做监测,通过rrdtool制图方式,图形化的展示网络的时延情况,进而能够清楚的判断出网络的即时通信情况。

1.5:prometheus简介

https://prometheus.io/

Prometheus是基于go语言开发的一套开源的监控、报警和时间序列数据库的组合,是由SoundCloud公司开源监控系统,Prometheus于2016年加入CNCF,2018年8月9日prometheus称为CNCF继kubernetes之后毕业的第二个项目,prometheus在容器和微服务领域得到了广泛的应用,其特点如下:

复制代码
使用key-value的多维度(多个角度,多个层面,多个方面)格式保存数据
数据不适用MySQL这样的传统数据库,而是使用时序数据库,目前是使用TSDB
支持第三方dashboard实现更绚丽的图形界面,如grafana组件更模块化
不需要依赖存储,数据可以本地保存也可以远程保存
平均每个采样点仅占3.5bytes,且一个Prometheus server可以处理数百万级别的metrics指标数据
支持服务自动化发现(基于consul等方式动态发现被监控的目标服务)
强大的数据查询语句功能(PromQL)
数据可以直接进行算数运算
易于横向伸缩
众多官方和第三方的exporter("数据"导出器)实现不同的指标数据收集

1.5.1:为什么使用Prometheus:

容器监控的实现方对比虚拟机或者物理机来说比大的区别。比如容器在k8s环境中可以任意横向扩容和缩容,那么就需要监控服务能够自动对新创建容器进行监控,当容器删除后又能够及时从监控服务中删除,而传统的zabbix的监控方式需要在每一个容器中安装启动agent,并且在容器自动发现注册及模板关联方面并没有比较好的实现方式。

1.5.2:Prometheus架构图

复制代码
prometheus server:主服务,接受外部http请求,收集、存储与查询数据等
prometheus targets:静态收集的目标服务数据
service discovery:动态发现服务
prometheus alerting:报警通知
push gateway:数据收集代理服务器(类似于zabbix proxy)
data visualiztion and export:数据可视化与数据导出(访问客户端)

二:部署Prometheus监控系统

可以通过不同的方式安装部署prometheus监控环境,虽然以下的各种安装方式演示了不同的部署方式,但是实际生产环境只需要根据实际需求选择其中一种方式部署即可,不过无论是使用哪一种方式安装部署的prometheus server,以后的使用都是一样的。

复制代码
# apt install prometheus #使用apt或者yum安装
https://prometheus.io/download/ #官方二进制下载及安装,prometheus server的监听端口是9090
https://prometheus.io/docs/prometheus/latest/insallation/ #docker镜像直接启动

2.1:docker-compose部署Prometheus Server、Node-exporter与grafana

复制代码
部署环境:172.16.10.19#如果之前已经通过其它方式部署了prometheus server,需要先停止再部署,避免端口冲突

2.1.1:执行部署

复制代码
https://github.com/mohamadhoseinmoradi/Docker-Compose-Prometheus-and-Grafana

version: '2.1'

networks:
  monitor-net:
    driver: bridge

volumes:
    prometheus_data: {}
    grafana_data: {}

services:

  prometheus:
    image: prom/prometheus:v2.17.1
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=200h'
      - '--web.enable-lifecycle'
    restart: unless-stopped
    expose:
      - 9090
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  alertmanager:
    image: prom/alertmanager:v0.20.0
    container_name: alertmanager
    volumes:
      - ./alertmanager:/etc/alertmanager
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
    restart: unless-stopped
    expose:
      - 9093
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  nodeexporter:
    image: prom/node-exporter:v0.18.1
    container_name: nodeexporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    restart: unless-stopped
    expose:
      - 9100
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  cadvisor:
    image: gcr.io/google-containers/cadvisor:v0.34.0
    container_name: cadvisor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro
      #- /cgroup:/cgroup:ro #doesn't work on MacOS only for Linux
    restart: unless-stopped
    expose:
      - 8080
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  grafana:
    image: grafana/grafana:6.7.2
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_USER=${ADMIN_USER}
      - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD}
      - GF_USERS_ALLOW_SIGN_UP=false
    restart: unless-stopped
    expose:
      - 3000
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  pushgateway:
    image: prom/pushgateway:v1.2.0
    container_name: pushgateway
    restart: unless-stopped
    expose:
      - 9091
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  caddy:
    image: stefanprodan/caddy
    container_name: caddy
    ports:
      - "3000:3000"
      - "9090:9090"
      - "9093:9093"
      - "9091:9091"
    volumes:
      - ./caddy:/etc/caddy
    environment:
      - ADMIN_USER=${ADMIN_USER}
      - ADMIN_PASSWORD=${ADMIN_PASSWORD}
    restart: unless-stopped
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

2.1.2:验证web界面:

2.2:Operator部署prometheus监控系统:

Operator部署器是基于已经编写好的yaml文件,可以将prometheus server、alertmanger、grafana、node-exporter等组件一键批量部署

复制代码
部署环境:在当前已有的kubernetes环境部署

2.2.1:clone项目并部署:

复制代码
# git clone -b release-0.11 https://github.com/prometheus-operator/kube-prometheus.git
# cd kube-prometheus
# kubectl apply --server-side -f manifests/setup

2.2.2:验证pod状态:

2.2.3:通过NodePort访问Prometheus Server:

复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 3.0.1
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
  - name: reloader-web
    port: 8080
    targetPort: reloader-web
  selector:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: ClientIP

2.2.4:验证prometheus web界面:

2.2.5:通过NodePort访问Grafana

复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 11.4.0
  name: grafana
  namespace: monitoring
spec:
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
  selector:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus

2.2.6:验证grafana web界面

2.3:二进制部署Prometheus Server:

复制代码
部署环境:172.31.7.101 #如果之前已经通过其它方式部署了prometheus server,需要先停止再部署,避免端口冲突

2.3.1:解压二进制程序:

复制代码
[root@qgis ~]# mkdir /apps
# cd /apps/
# tar -xvf prometheus-2.4.0.linux-amd64.tar.gz
# ln -sv /apps/prometheus-2.4.0.linux /apps/prometheus
# cd /apps/prometheus
# ll
total 105204
drwxr-xr-x  2 3434 3434       38 Sep 11  2018 console_libraries
drwxr-xr-x  2 3434 3434      173 Sep 11  2018 consoles
drwxr-xr-x 25 root root     4096 May 30  2024 data
-rw-r--r--  1 3434 3434    11357 Sep 11  2018 LICENSE
-rw-r--r--  1 3434 3434     2769 Sep 11  2018 NOTICE
-rwxr-xr-x  1 3434 3434 66744633 Sep 11  2018 prometheus
-rw-r--r--  1 3434 3434     1010 May 17  2024 prometheus.yml
-rwxr-xr-x  1 3434 3434 40951599 Sep 11  2018 promtool
-rw-r--r--  1 root root      166 May 17  2024 rule.yml

2.3.2:创建prometheus service启动脚本

复制代码
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus   --config.file=/apps/prometheus/prometheus.yml --web.enable-lifecycle

[Install]
WantedBy=multi-user.target

2.3.3:启动prometheus服务

复制代码
# systemctl daemon-reload && systemctl restart prometheus 

2.3.4:验证prometheus web界面

2.3.5:动态热加载配置:

bash 复制代码
vim /etc/systemd/system/prometheus.service
--web.enable-lifecycle
# systemctl daemon-reload && systemctl restart prometheus 
# curl -X POST http://172.16.10.16:9090/-/reload

2.4:二进制安装node-exporter:

k8s各node节点使用二进制或者daemonset方式安装node_exporter,用于收集各k8s node节点宿主机的监控指标数据,默认监听端口为9100.

复制代码
部署环境:kubernetes的node节点,如果之前已经通过其他方式了prometheus node-exporter,需要先停止再部署,避免端口冲突

2.4.1:解压二进制程序

复制代码
[root@k8s-node2 apps]# tar -xvf node_exporter-1.8.0.linux-amd64.tar.gz
# ln -sv node_exporter-1.8.0.linux node_exporter

2.4.2:创建node-exporter service启动文件

复制代码
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
ExecStart=/apps/node_exporter/node_exporter

[Install]
WantedBy=multi-user.target

2.4.3:启动node exporter服务:

复制代码
# systemctl daemon-reload && systemctl restart node-exporter

2.4.4:验证node exporter web界面:

_exporter

复制代码
### 2.4.2:创建node-exporter service启动文件

Unit

Description=Prometheus Node Exporter

After=network.target

Service

ExecStart=/apps/node_exporter/node_exporter

Install

WantedBy=multi-user.target

复制代码
### 2.4.3:启动node exporter服务:

systemctl daemon-reload && systemctl restart node-exporter

复制代码
### 2.4.4:验证node exporter web界面:

[外链图片转存中...(img-3ju41x4q-1764642489771)]
相关推荐
天天讯通1 小时前
智能外呼:降运营成本、优客户体验,数据分析来助力
数据挖掘·数据分析
SelectDB技术团队1 小时前
Apache Doris 在小米统一 OLAP 和湖仓一体的实践
数据仓库·数据分析·apache·数据库开发
搞科研的小刘选手1 小时前
【人工智能专题】第五届人工智能与大数据国际学术研讨会 (AIBDF 2025)
大数据·人工智能·数据分析·学术会议·核心算法
红队it1 小时前
【Spark+Hive】基于Spark大数据旅游景点数据分析可视化推荐系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·python·算法·数据分析·spark·django·echarts
咚咚王者2 小时前
人工智能之数据分析 Pandas:第二章 Series
人工智能·数据分析·pandas
咚咚王者2 小时前
人工智能之数据分析 Pandas:第一章 简介和安装
人工智能·数据分析·pandas
qq_381454992 小时前
AI驱动的数据分析:从描述过去到预测未来的范式革命
数据分析
TomCode先生2 小时前
MES系统数据流向及操作使用步骤
信息可视化