prometheus
Prometheus部署
主机名 | IP地址 | CPU | 内存 | 磁盘 | 角色 |
---|---|---|---|---|---|
prometheus-server31 | 10.0.0.31 | 1C | 1G | 20G+ | Prometheus server |
prometheus-server32 | 10.0.0.32 | 1C | 1G | 20G+ | Prometheus server |
prometheus-server33 | 10.0.0.33 | 1C | 1G | 20G+ | Prometheus server |
prometheus-node41 | 10.0.0.41 | 1C | 512M | 20G+ | node-exporter |
prometheus-node42 | 10.0.0.42 | 1C | 512M | 20G+ | node-exporter |
prometheus-node43 | 10.0.0.43 | 1C | 512M | 20G+ | node-exporter |
alermanager51 | 10.0.0.51 | 1C | 512M | 20G+ | alermanager |
pushgateway61 | 10.0.0.61 | 1C | 512M | 20G+ | pushgateway |
0.概述
什么是Prometheus:
Prometheus是一个开源的系统监控和报警系统,它启发与Google的borgmon监控系统,在一定程度上开源理解为,Google BorgMon监控系统的开源版本。
该软件由工作在SoundClound的前Google员工在2012年创建,作为社区开源项目进行开发,并于2015年正式成立。
2016年,Prometheus正式加入CNCF(Clound Native Computing Foundation),成为继kubernetes之后第二个CNCF托管的项目,现广泛用于在容器和微服务领域中得到了广泛的应用,当然不仅限于此。
2018年8月9日prometheus称为CNCF继kubernetes之后毕业的第二个项目。
Prometheus本身基于Go语言开发的一套开源的系统监控报警框架和时序列数据库(TSDB)。
Prometheus的监控能功能很完善和全面,性能也足够支持上万台规模的集群。
推荐阅读:
云原生CNCF官网:
https://landscape.cncf.io/
Prometheus的GitHub地址:
https://github.com/prometheus/prometheus
Prometheus的官网地址:
https://prometheus.io/
2.Prometheus主要特点
- 支持多维数据模型,由度量名称和键值对组成的时间序列;
- 内置的时间序列数据库TSDB(Time Series Database);
- 支持PromQL(Prometheus Query Language)查询语言,可以完善非常复杂的查询和分析,对图表和告警非常有意义;
- 支持http的pull方式采集时间序列数据;
- 支持pushGateway采集瞬时任务的数据;
- 支持静态配置和服务发现两种方式发现目标;
- 不依赖存储,数据可以本地保存也可以远程保存;
- 平均每个采样点仅占3.5bytes,且一个prometheus server可以处理数百万级别的metrics指标数据;
- 易于横向伸缩;
- 众多官方和第三方的exporter实现不同的指标数据收集;
3.Prometheus数据特点
- 监控指标:
采用独创的指标格式,我们称之为Prometheus格式,这个格式在监控场景中很常见;
- 数据标签:
支持多维度标签,每个独立的标签组合都代表一个独立的时间序列。
- 数据处理:
Prometheus内部支持多种数据的聚合,切割,切片等功能。
- 数据存储:
Prometheus支持双精度浮点型数据存储和字符串。
4. Prometheus适用场景
Prometheus非常适合记录任何纯数字时间序列,它既适合以机器为中心的监控场景,也适合于高度动态的面向服务的体系结构的监控场景。尤其是在微服务世界中,它对多维数据收集和查询的支持是一种特别的优势。
Prometheus的设计旨在提高可靠性,使其成为中断期间要使用的系统,以使您能够快速诊断问题。每个Prometheus服务器都是独立的,而不依赖于网络存储或其他远程服务。当基础结构的其他部分故障时,您可以依靠它,并且无需广泛的基础结构即可使用它。
由于Prometheus重视可靠性,在故障情况下,我们可以查看有关系统的可用统计信息,但是如果您需要100%的准确性,则Prometheus并不是一个不错的选择,因为所收集的数据可能不会足够详细和完整。在这种情况下,最好使用其他系统来收集和分析数据以进行计费,并使用Prometheus进行其余监视。
5.为什么要使用Prometheus
容器监控的实现对比虚拟机或者物理机来说有比较大的区别,比如容器在k8s环境中可以任意横向扩容与缩容,那么就需要监控服务能够自动对新创建的容器进行监控,当容器删除后又能及时的从监控服务中删除,而传统的zabbix的监控方式需要在每一个容器中安装并启动zabbix agent,并且在容器自动发现注册及模板关联方面并没有比较好的实现方式。
- prometheus架构图解
- Prometheus:
时间数据存储,监控指标管理。
- 可视化:
Prometheus Web UI: 集群状态管理,PromQL。
Grafana: 非常全面的可视化套件。
- 数据采集:
Exporter: 为当前的客户端暴露出符合Prometheus规则的数据指标,Exporter以守护进程的模式运行并开始采集数据,Exporter本身也是一个http_server可以对http请求作出响应返回数据(K/V形式的metrics)。
- 监控目标:
服务发现: file,DNS,Kubernete,Consul,custom Integration,...
- 告警:
alertmanager
Prometheus由几个主要软件包组成,其职责如下:
- Prometheus Server:
彼此独立运行,仅依靠其本地存储来实现其核心功能,抓取时序数据,规则处理和报警等。
- Prometheus targets:
静态收集的目标服务数据。
- service discovery:
动态服务发现。
- Client Library:
客户端库,为需要监控的服务生成相应的metrics并暴露给Prometheus Server。
当Prometheus Server来pull时,直接返回实时状态的metrics。
- Push Gateway:
exporter采集型已经很丰富,但是依然需要很多自定义的监控数据,由pushgateway可以实现自定义的监控数据,任意灵活想做什么都可以做到。
exporter的开发需要使用真正的编程语音,不支持shell这种脚本,而pushgateway开发却容易的多。
pushgateway主要用于短期的jobs,由于这类jobs存在时间较短,可能是Prometheus来pull之前就消失了。为此,这次jobs可以直接向Prometheus server端推送它们的metrics,这种凡是主要用于服务层面的metrics,对于机器层面的metrics,需要使用node exporter。
- Exporters:
部署第三方软件主机上,用于暴露已有的第三方服务的metrics给Prometheus。
- Altermanager:
从Prometheus Server端接收到alters后,会进行去除重复数据,分组,并路由到对应的接收方式,以高效向用户完成告警信息发送。常见的方式有: 电子邮件,pagerduty,OpsGenie,Webhook等一些其他的工具。
- Data Visualization:
Prometheus Web UI(Prometheus Server内置的界面),Grafana(第三方可视化组件,需要单独部署)。
- Server Discovery:
动态发现待监控的Target,从而完成监控配置的重要组件,在容器化环境中尤为有用,该组件目前由Prometheus Server内建支持。
上述组件中,大多数都是用Go编写的,因此易于构建和部署为二进制文件。
参考地址:
https://prometheus.io/docs/introduction/overview/
https://github.com/prometheus/prometheus
1. prometheus-server部署
- prometheus的部署方式
7.1.包安装
RHEL系统:
参考链接:
https://packagecloud.io/app/prometheus-rpm/release/search
Ubuntu和Debian:
可以直接使用apt命令安装即可。
7.2 二进制部署
参考链接:
https://prometheus.io/download
7.3 基于docker部署
参考链接:
https://prometheus.io/docs/prometheus/latest/installation
7.4 基于kubernetes operator安装
参考链接:
https://github.com/coreos/kube-prometheus
7.5 基于helm部署
需要单独安装helm组件,K8S集群。
7.6 手动部署prometheus server到K8S集群
需要编写资源清单文件 。
# ubuntu系统
[root@prometheus-server31 ~]# uname -r
5.15.0-78-generic
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
dhcp4: false
addresses: [10.0.0.31/24]
gateway4: 10.0.0.254
nameservers:
addresses: [223.5.5.5,223.6.6.6]
version: 2
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]# cat /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
[root@prometheus-server31 ~]#
参考链接:
https://developer.aliyun.com/mirror/ubuntu
- 二进制安装prometheus server
1.下载软件包
[root@prometheus-server31 ~]# wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz
- 使用shell一键部署prometheus server
[root@prometheus-server33 ~]# cat install-prometheus.sh
#!/bin/bash
VERSION=2.45.3
SOFTWARE=prometheus-${VERSION}.linux-amd64.tar.gz
URL=https://github.com/prometheus/prometheus/releases/download/v${VERSION}/${SOFTWARE}
DOWNLOAD=./download
INSTALLDIR=/jiaxing/softwares
BASEDIR=${INSTALLDIR}/prometheus-${VERSION}.linux-amd64
# 判断目录是否存在,若不存在则创建
[ -d $INSTALLDIR ] || mkdir -pv ${INSTALLDIR}
[ -d $DOWNLOAD ] || mkdir -pv ${DOWNLOAD}
# 判断系统是否安装wget
# [ -f /usr/bin/wget ] || yum -y install wget
# 判断文件是否存在,若不存在则下载
[ -s ${DOWNLOAD}/${SOFTWARE} ] || wget $URL -O ${DOWNLOAD}/${SOFTWARE}
if [ $? -eq 0 ]; then
# 解压文件软件包
tar xf ${DOWNLOAD}/${SOFTWARE} -C ${INSTALLDIR}
# 生成启动脚本
cat > /etc/systemd/system/prometheus-server.service <<EOF
[Unit]
Description=Jiaxing Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
ExecStart=${BASEDIR}/prometheus \
--config.file=${BASEDIR}/prometheus.yml \
--web.listen-address="0.0.0.0:9090" \
--storage.tsdb.path="/jiaxing/data/prometheus" \
--storage.tsdb.retention.time=30d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
# 将服务设置为开机自启动
systemctl daemon-reload
systemctl enable --now prometheus-server
systemctl status prometheus-server
fi
[root@prometheus-server33 ~]#
2. node-exporter部署
- 部署node exporter
1.下载软件包
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
- 基于脚本一键部署node-exporter
[root@prometheus-node42 ~]# cat install-node-exporter.sh
#!/bin/bash
VERSION=1.7.0
SOFTWARE=node_exporter-${VERSION}.linux-amd64.tar.gz
URL=https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/${SOFTWARE}
DOWNLOAD=./download
INSTALLDIR=/jiaxing/softwares
BASEDIR=${INSTALLDIR}/node_exporter-${VERSION}.linux-amd64
# 判断目录是否存在,若不存在则创建
[ -d $INSTALLDIR ] || mkdir -pv ${INSTALLDIR}
[ -d $DOWNLOAD ] || mkdir -pv ${DOWNLOAD}
# 判断系统是否安装curl
# [ -f /usr/bin/wget ] || apt update && apt -y install wget
# 判断文件是否存在,若不存在则下载
[ -s ${DOWNLOAD}/${SOFTWARE} ] || wget $URL -O ${DOWNLOAD}/${SOFTWARE}
if [ $? -eq 0 ]; then
# 解压文件软件包
tar xf ${DOWNLOAD}/${SOFTWARE} -C ${INSTALLDIR}
# 生成启动脚本
cat > /etc/systemd/system/node-exporter.service <<EOF
[Unit]
Description=Jiaxing Node Exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
ExecStart=${BASEDIR}/node_exporter --web.listen-address=:9100
[Install]
WantedBy=multi-user.target
EOF
# 将服务设置为开机自启动
systemctl daemon-reload
systemctl enable --now node-exporter.service
fi
[root@prometheus-node42 ~]#
[root@prometheus-node42 ~]# bash install-node-exporter.sh
6.访问node-exporter的WebUI
http://10.0.0.42:9100/metrics
3. 监控node-exporter
- prometheus监控node-exporter
1.修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-node-exporter"
static_configs:
- targets:
- "10.0.0.41:9100"
- "10.0.0.42:9100"
2.检查配置文件
[root@prometheus-server31 ~]# /jiaxing/softwares/prometheus-2.45.3.linux-amd64/promtool check config /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
Checking /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
SUCCESS: /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml is valid prometheus config file syntax
[root@prometheus-server31 ~]#
3.配置环境变量
[root@prometheus-server31 ~]# cat /etc/profile.d/prometheus.sh
#!/bin/bash
export PROMETHEUS_HOME=/jiaxing/softwares/prometheus-2.45.3.linux-amd64/
export PATH=$PATH:$PROMETHEUS_HOME
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]# source /etc/profile.d/prometheus.sh
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]# promtool check config $PROMETHEUS_HOME/prometheus.yml
Checking /oldboyedu/softwares/prometheus-2.45.3.linux-amd64//prometheus.yml
SUCCESS: /oldboyedu/softwares/prometheus-2.45.3.linux-amd64//prometheus.yml is valid prometheus config file syntax
[root@prometheus-server31 ~]#
4.重新加载配置
方式一:
[root@prometheus-server31 ~]# systemctl restart prometheus
方式二: (无需重启服务,启动prometheus时需要"--web.enable-lifecycle")
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
5.访问prometheus server WebUI
http://10.0.0.31:9090/targets
6.查询数据
node_cpu_seconds_total
温馨提示:
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
Lifecycle API is not enabled.
出现如上所示的字样,说明咱们的prometheus server服务启动时未启用"--web.enable-lifecycle"参数。
3. prometheus metrics type
- prometheus metrics type
prometheus监控中采集过来的数据统一称为Metrics数据,其并不是代表具体的数据格式,而是一种统计度量计算单位。
当我们需要为某个系统或者某个服务做监控时,就需要使用到metrics。
prometheus支持的metrics包括但不限于以下几种数据类型:
guage:
最简单的度量指标,只是一个简单的返回值,或者叫瞬时状态。
比如说统计硬盘,内存等使用情况。
couter:
就是一个计数器,从数据量0开始累积计算,在理想情况下,只能是永远的增长,不会降低(有特殊情况,比如粉丝量)。
比如统计1小时,1天,1周,1一个月的用户访问量,这就是一个累加的操作。
histograms:
是统计数据的分布情况,比如最小值,最大值,中间值,中位数等,代表的是一种近似百分比估算数值。
通过histograms可以分别统计处在一个时间段(1s,2s,5s,10s)内nginx访问用户的响应时间。
summary:
summary是histograms的扩展类型,主要弥补histograms不足。
4. PromQL
- PromQL初体验
2.2.1 查看某个特定的key
node_cpu_seconds_total
2.2.2 查看某个节点的指标
node_cpu_seconds_total{instance="10.0.0.41:9100"}
2.2.3 查看某个节点的某刻CPU的某种状态
node_cpu_seconds_total{instance="10.0.0.41:9100",cpu="0",mode="idle"}
2.2.4 查询最近10s内某个节点CPU的某种状态时间
node_cpu_seconds_total{instance="10.0.0.41:9100",cpu="0",mode="idle"}[10s]
2.2.5 统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,非空闲状态使用的总时间
node_cpu_seconds_total{mode!="idle",cpu="0", instance="10.0.0.42:9100"}[1m]
2.2.6 统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,mode名称以字母"i"开头的所有CPU核心。
node_cpu_seconds_total{mode=~"i.*",cpu="0", instance="10.0.0.42:9100"}[1m]
2.2.7 统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,mode名称不是以字母"i"开头的所有CPU核心。
node_cpu_seconds_total{mode!~"i.*",cpu="0", instance="10.0.0.42:9100"}[1m]
- 2.3 Prometheus常用的函数
2.3.1 increase
increase函数:
用来针对counter数据类型,截取其中一段时间总的增量。
举个例子:
increase(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.42:9100"}[1m])
统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,空闲状态使用的总时间增量。
2.3.2 sum
sum函数:
加和的作用。
举个例子:
sum(increase(node_cpu_seconds_total{mode="idle",cpu="0"}[1m]))
统计1分钟内,使用标签过滤器查看所有节点的第0颗CPU,空闲状态使用的总时间增量,并将返回结果累加。
2.3.3 by
by函数:
将数据进行分组,类似于MySQL的"GROUP BY"。
举个例子:
sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
统计1分钟内,使用标签过滤器查看CPU空闲状态,并将结果进行累加,基于instance进行分组。
2.3.4 rate
rate函数:
它的功能是按照设置的时间段,取counter在这个时间段中平均每秒的增量。
举个例子:
rate(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.42:9100"}[1m])
统计1分钟内,使用标签过滤器查看"10.0.0.42:9100"节点的第0颗CPU,空闲状态使用的每秒的增量。
increase和rate如何选择:
(1)对于采集数据频率较低的场景建议使用increase函数,因为使用rate函数可能会出现断点,比如针对硬盘容量监控。
(2)对于采集数据频率较高的场景建议使用rate函数,比如针对CPU,内存,网络流量等都是可以基于rate函数来采集等。
2.3.5 topk
topk函数:
取前几位的最高值,实际使用的时候一般会用该函数进行瞬时报警,而不是为了观察曲线图。
举个例子:
topk(3, rate(node_cpu_seconds_total{mode="idle"}[1m]))
统计1分钟内,使用标签过滤器查看CPU,所有状态使用的每秒的增量,只查看前3个节点。
2.3.6 count
count函数:
把数值符合条件的,输出数目进行累加加和。
比如说企业中有100台服务器,如果只有10台服务器CPU使用率高于80%时候是不需要报警的,但是数量操作70台时就需要报警了。
举个例子:
count(oldboyedu_tcp_wait_conn > 500):
假设oldboyedu_tcp_wait_conn是咱们自定义的KEY。
若TCP等待数量大于500的机器数量就判断条件为真。
count(rate(node_cpu_seconds_total{cpu="0",mode="idle"}[1m]))
对统计的结果进行计数。
2.3.7 其他函数
推荐阅读:
https://prometheus.io/docs/prometheus/latest/querying/functions/
5. Grafana部署
- 基于grafana实现数据的展示和查询:
1.基于Ubuntu安装grafana
apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.3.1_amd64.deb
dpkg -i grafana-enterprise_10.3.1_amd64.deb
2.启动服务
systemctl daemon-reload
systemctl enable --now grafana-server
监控zookeeper-云原生应用
1.prometheus监控zookeeper集群
- prometheus server监控zookeeper集群
1.修改zookeeper的配置文件
[root@elk91 ~]# vim /oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg
...
# https://prometheus.io Metrics Exporter
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpHost=0.0.0.0
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
[root@elk91 ~]#
2.将配置同步到其他节点
[root@elk91 ~]# scp /oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg elk92:/oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg
[root@elk91 ~]# scp /oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg elk93:/oldboyedu/softwares/apache-zookeeper-3.8.2-bin/conf/zoo.cfg
3.启动zookeeper集群
[root@elk91 ~]# managaer-zk.sh start
4.检查各节点的Metrics状态
[root@elk91 ~]# curl -s http://10.0.0.93:7000/metrics | tail -1
learner_handler_qp_size_sum{key="92",} 3.0
[root@elk91 ~]#
[root@elk91 ~]#
[root@elk91 ~]# curl -s http://10.0.0.92:7000/metrics | tail -1
startup_txns_loaded_sum 2.0
[root@elk91 ~]#
[root@elk91 ~]#
[root@elk91 ~]# curl -s http://10.0.0.91:7000/metrics | tail -1
# TYPE learner_handler_qp_size summary
[root@elk91 ~]#
5.修改prometheus server配置监控
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-zookeeper"
static_configs:
- targets:
- "10.0.0.91:7000"
- "10.0.0.92:7000"
- "10.0.0.93:7000"
6.重新加载prometheus的配置
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
7.验证prometheus的WebUI是否成功监控target
http://10.0.0.31:9090/targets
8.grafana导入模板
10465
2.servicemonitor监控etcd
三.Prometheus监控云原生应用etcd案例
1.测试ectd metrics接口
1.查看etcd证书存储路径
[root@master231 yinzhengjie]# egrep "\--key-file|--cert-file" /etc/kubernetes/manifests/etcd.yaml
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --key-file=/etc/kubernetes/pki/etcd/server.key
[root@master231 yinzhengjie]#
2.测试etcd证书访问的metrics接口
[root@master231 yinzhengjie]# curl -s --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://10.0.0.231:2379/metrics -k | tail
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes 1.8446744073709552e+19
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 4
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
[root@master231 yinzhengjie]#
2.etcd Service创建
1.创建etcd的service
[root@master231 01-etcd]# cat etcd-svc.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-k8s
namespace: kube-system
subsets:
- addresses:
- ip: 10.0.0.231
ports:
- name: https-etcd
port: 2379
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: etcd-k8s
namespace: kube-system
labels:
apps: etcd
spec:
ports:
- name: https-etcd
port: 2379
targetPort: 2379
type: ClusterIP
[root@master231 01-etcd]#
[root@master231 01-etcd]# kubectl apply -f etcd-svc.yaml
endpoints/etcd-k8s created
service/etcd-k8s created
[root@master231 01-etcd]#
[root@master231 01-etcd]# kubectl get svc -n kube-system -l apps=etcd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
etcd-k8s ClusterIP 10.200.10.2 <none> 2379/TCP 22s
[root@master231 01-etcd]#
[root@master231 01-etcd]# kubectl -n kube-system describe svc etcd-k8s | grep Endpoints
Endpoints: 10.0.0.231:2379
[root@master231 01-etcd]#
2.基于创建的svc访问测试连通性
[root@master231 01-etcd]# curl -s --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://10.200.10.2:2379/metrics -k | tail -5
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 3
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
[root@master231 01-etcd]#
3.创建etcd证书的secrets并挂载到Prometheus server
3.1.查找需要挂载etcd的证书文件路径
[root@master231 01-etcd]# egrep "\--key-file|--cert-file|--trusted-ca-file" /etc/kubernetes/manifests/etcd.yaml
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
[root@master231 01-etcd]#
2.根据etcd的实际存储路径创建secrets
[root@master231 yinzhengjie]# kubectl create secret generic etcd-tls --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/server.key --from-file=/etc/kubernetes/pki/etcd/ca.crt -n monitoring
secret/etcd-tls created
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kubectl -n monitoring get secrets etcd-tls
NAME TYPE DATA AGE
etcd-tls Opaque 3 12s
[root@master231 yinzhengjie]#
3.修改Prometheus的资源,修改后会自动重启
[root@master231 yinzhengjie]# kubectl -n monitoring edit prometheus k8s
...
spec:
secrets:
- etcd-tls
...
[root@master231 yinzhengjie]# kubectl -n monitoring get pods -l app.kubernetes.io/component=prometheus -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
prometheus-k8s-0 2/2 Running 0 74s 10.100.1.57 worker232 <none> <none>
prometheus-k8s-1 2/2 Running 0 92s 10.100.2.28 worker233 <none> <none>
[root@master231 yinzhengjie]#
4.查看证书是否挂载成功
[root@master231 yinzhengjie]# kubectl -n monitoring exec prometheus-k8s-0 -c prometheus -- ls -l /etc/prometheus/secrets/etcd-tls
total 0
lrwxrwxrwx 1 root 2000 13 Jan 24 14:07 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root 2000 17 Jan 24 14:07 server.crt -> ..data/server.crt
lrwxrwxrwx 1 root 2000 17 Jan 24 14:07 server.key -> ..data/server.key
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kubectl -n monitoring exec prometheus-k8s-1 -c prometheus -- ls -l /etc/prometheus/secrets/etcd-tls
total 0
lrwxrwxrwx 1 root 2000 13 Jan 24 14:07 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root 2000 17 Jan 24 14:07 server.crt -> ..data/server.crt
lrwxrwxrwx 1 root 2000 17 Jan 24 14:07 server.key -> ..data/server.key
[root@master231 yinzhengjie]#
5.创建ServerMonitor
5.1.创建ServiceMonitor资源关联etcd的svc
[root@master231 yinzhengjie]# cat etcd-smon.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: jiaxing-etcd-smon
namespace: monitoring
spec:
# 指定job的标签,可以不设置。
jobLabel: kubeadm-etcd-k8s-jiaxing
# 指定监控后端目标的策略
endpoints:
# 监控数据抓取的时间间隔
- interval: 30s
# 指定metrics端口,这个port对应Services.spec.ports.name
port: https-etcd
# Metrics接口路径
path: /metrics
# Metrics接口的协议
scheme: https
# 指定用于连接etcd的证书文件
tlsConfig:
# 指定etcd的CA的证书文件
caFile: /etc/prometheus/secrets/etcd-tls/ca.crt
# 指定etcd的证书文件
certFile: /etc/prometheus/secrets/etcd-tls/server.crt
# 指定etcd的私钥文件
keyFile: /etc/prometheus/secrets/etcd-tls/server.key
# 关闭证书校验,毕竟咱们是自建的证书,而非官方授权的证书文件。
insecureSkipVerify: true
# 监控目标Service所在的命名空间
namespaceSelector:
matchNames:
- kube-system
# 监控目标Service目标的标签。
selector:
# 注意,这个标签要和etcd的service的标签保持一致哟
matchLabels:
apps: etcd
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kubectl apply -f etcd-smon.yaml
servicemonitor.monitoring.coreos.com/yinzhengjie-etcd-smon created
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kubectl get smon -n monitoring jiaxing-etcd-smon
NAME AGE
yinzhengjie-etcd-smon 8s
[root@master231 yinzhengjie]#
2.访问Prometheus的WebUI
http://10.0.0.233:30090/targets?search=
5.查看etcd的数据
如上图所示,我们搜索"etcd_cluster_version"就可以查询到etcd的数据啦。
6.使用grafana查看etcd数据
导入etcd的模板,建议编号为"3070"。
监控非云原生应用
1. 监控MySQL-非云原生应用
- Promethues监控MySQL服务
1.部署MySQL软件
1.1.下载对应的软件包
[root@elk92 ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.28-linux-glibc2.12-x86_64.tar
1.2.创建工作目录
[root@elk92 ~]# mkdir -pv /jiaxing/{softwares,data,logs}/
1.3.解压软件包
[root@elk92 ~]# tar xf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz -C /jiaxing/softwares/
1.4 创建符号链接(软连接)
[root@elk92 ~]# cd /jiaxing/softwares/ && ln -sv mysql-8.0.28-linux-glibc2.12-x86_64 mysql80
1.5 配置环境变量
cat > /etc/profile.d/mysql80.sh <<'EOF'
#!/bin/bash
export MYSQL_HOME=/jiaxing/softwares/mysql80
export PATH=$PATH:$MYSQL_HOME/bin
EOF
source /etc/profile.d/mysql80.sh
1.6 卸载当前系统自带的MySQL分支
[root@elk92 ~]# rpm -qa | grep mariadb
[root@elk92 ~]# yum -y remove mariadb-libs
1.7 准备mysql的配置文件
[root@elk92 ~]# cat > /etc/my.cnf <<'EOF'
# mysql服务端的配置参数
[mysqld]
# 指定mysql服务端的运行用户
user=mysql
# 指定mysql的安装目录
basedir=/jiaxing/softwares/mysql80
# 指定mysql的数据目录
datadir=/jiaxing/data/mysql80
# 指定socket套接字文件
socket=/tmp/jiaxing-mysql80.sock
[mysql]
socket=/tmp/jiaxing-mysql80.sock
EOF
1.8 修改mysql的启动脚本
[root@elk92 ~]# cp /jiaxing/softwares/mysql80/support-files/mysql.server /etc/init.d/mysqld
[root@elk92 ~]#
[root@elk92 ~]# vim /etc/init.d/mysqld
...(仅需修改下面2个参数即可,大概是在46-47行之间哟~)
basedir=/jiaxing/softwares/mysql80
datadir=/jiaxing/data/mysql80
1.9 修改文件权限
[root@elk92 ~]# useradd mysql && chown mysql:mysql -R /jiaxing/softwares/mysql80/
[root@elk92 ~]#
[root@elk92 ~]# ll /jiaxing/softwares/mysql80/
total 284
drwxr-xr-x 2 mysql mysql 4096 Dec 18 2021 bin
drwxr-xr-x 2 mysql mysql 55 Dec 18 2021 docs
drwxr-xr-x 3 mysql mysql 282 Dec 18 2021 include
drwxr-xr-x 6 mysql mysql 201 Dec 18 2021 lib
-rw-r--r-- 1 mysql mysql 276595 Dec 18 2021 LICENSE
drwxr-xr-x 4 mysql mysql 30 Dec 18 2021 man
-rw-r--r-- 1 mysql mysql 666 Dec 18 2021 README
drwxr-xr-x 28 mysql mysql 4096 Dec 18 2021 share
drwxr-xr-x 2 mysql mysql 77 Dec 18 2021 support-files
[root@elk92 ~]#
1.10 初始化MySQL服务
初始化MySQL数据库
install -d /jiaxing/data/mysql80 -o mysql -g mysql
# 姿势1,不会生成文件,会直接将密码打印到当前终端。
# mysqld --user=mysql --basedir=/jiaxing/softwares/mysql80 --datadir=/oldboyedu/data/mysql80 --initialize
# 姿势2,初学者推荐使用这种方式进行初始化即可。因为这种方式初始化的密码为空。
mysqld --user=mysql --basedir=/jiaxing/softwares/mysql80 --datadir=/jiaxing/data/mysql80 --initialize-insecure
1.11 启动MySQL服务
[root@elk92 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/oldboyedu/data/mysql80/elk92.err'.
. SUCCESS!
[root@elk92 ~]#
[root@elk92 ~]# ss -ntl | grep 3306
LISTEN 0 128 [::]:3306 [::]:*
LISTEN 0 70 [::]:33060 [::]:*
[root@elk92 ~]#
2.MySQL授权mysql_exporter
CREATE USER 'mysql_exporter'@'%' IDENTIFIED WITH mysql_native_password BY 'jiaxing' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'%';
QUIT
mysql -umysql_exporter -pjiaxing -h 10.0.0.92
3.部署mysql_exporter
3.1 下载mysql_exporter
[root@elk93 ~]# https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
3.2 解压软件包
[root@elk93 ~]# tar xf mysqld_exporter-0.15.1.linux-amd64.tar.gz -C /usr/local/bin/ mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter --strip-components=1
3.3 创建MySQL的配置,指定默认的用户名和密码
[root@elk93 ~]# cat > /root/.my.cnf <<EOF
[client]
user=mysql_exporter
password=jiaxing
EOF
3.4 运行mysqld-exporter
[root@elk93 ~]# mysqld_exporter --mysqld.address="10.0.0.92:3306" --web.listen-address=:9104 --config.my-cnf="/root/.my.cnf"
3.5 访问webUI测试
http://10.0.0.93:9104/metrics
3.6 配置prometheus监控MySQL
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-mysql"
static_configs:
- targets:
- "10.0.0.93:9104"
3.7 重新加载prometheus的配置
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
3.8 grafana导入模板
7362
1.2 通过serviceMonitor监控mysql(内部)
四.Prometheus监控非云原生应用MySQL案例
1.部署MySQL服务
1.编写资源清单
[root@master231 yinzhengjie]# cat deploy-mysql80.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql80-deployment
spec:
replicas: 1
selector:
matchLabels:
apps: mysql80
template:
metadata:
labels:
apps: mysql80
spec:
containers:
- name: mysql
image: harbor.oldboyedu.com/db/mysql:8.0-oracle
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: jiaxing
---
apiVersion: v1
kind: Service
metadata:
name: mysql80-service
spec:
selector:
apps: mysql80
ports:
- protocol: TCP
port: 3306
targetPort: 3306
[root@master231 yinzhengjie]#
2.创建资源
[root@master231 yinzhengjie]# kubectl apply -f deploy-mysql80.yaml
deployment.apps/mysql80-deployment created
service/mysql80-service created
[root@master231 yinzhengjie]#
3.验证服务的可用性
[root@master231 yinzhengjie]# kubectl get pods,svc | grep mysql80
pod/mysql80-deployment-846477c784-hmvfw 1/1 Running 0 43s
service/mysql80-service ClusterIP 10.200.95.73 <none> 3306/TCP 43s
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# telnet 10.200.95.73 3306
Trying 10.200.95.73...
Connected to 10.200.95.73.
Escape character is '^]'.
J
8.0.3xkS`0Pÿ2uV9z}tX'pcaching_sha2_password
2.为mysql_exporter授权
[root@master231 yinzhengjie]# kubectl exec -it mysql80-deployment-846477c784-hmvfw -- mysql -pjiaxing
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.36 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> CREATE USER mysql_exporter IDENTIFIED BY 'jiaxing' WITH MAX_USER_CONNECTIONS 3;
Query OK, 0 rows affected (0.04 sec)
mysql> GRANT PROCESS,REPLICATION CLIENT,SELECT ON *.* TO mysql_exporter;
Query OK, 0 rows affected (0.01 sec)
mysql>
3.部署mysql_exporter
1.编写资源清单
[root@master231 yinzhengjie]# cat deploy-svc-cm-mysql_exporter.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my.cnf
data:
.my.cnf: |-
[client]
user = mysql_exporter
password = jiaxing
[client.servers]
user = mysql_exporter
password = jiaxing
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-exporter-deployment
spec:
replicas: 1
selector:
matchLabels:
apps: mysql-exporter
template:
metadata:
labels:
apps: mysql-exporter
spec:
volumes:
- name: data
configMap:
name: my.cnf
items:
- key: .my.cnf
path: .my.cnf
containers:
- name: mysql-exporter
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/mysqld-exporter:v0.15.1
command:
- mysqld_exporter
- --config.my-cnf=/root/my.cnf
- --mysqld.address=mysql80-service.default.svc.oldboyedu.com:3306
securityContext:
runAsUser: 0
ports:
- containerPort: 9104
#env:
#- name: DATA_SOURCE_NAME
# value: mysql_exporter:yinzhengjie@(mysql80-service.default.svc.oldboyedu.com:3306)
volumeMounts:
- name: data
mountPath: /root/my.cnf
subPath: .my.cnf
---
apiVersion: v1
kind: Service
metadata:
name: mysql-exporter-service
labels:
apps: mysqld
spec:
selector:
apps: mysql-exporter
ports:
- protocol: TCP
port: 9104
targetPort: 9104
name: mysql80
[root@master231 yinzhengjie]#
2.验证数据是否采集到
[root@master231 yinzhengjie]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.200.0.1 <none> 443/TCP 22d
mysql-exporter-service ClusterIP 10.200.96.244 <none> 9104/TCP 3m57s
mysql80-service ClusterIP 10.200.95.73 <none> 3306/TCP 2d12h
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# curl -s 10.200.96.244:9104/metrics | tail -1
promhttp_metric_handler_requests_total{code="503"} 0
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# curl -s 10.200.96.244:9104/metrics | wc -l
2557
[root@master231 yinzhengjie]#
4.编写ServiceMonitor监控mysql_exporter
[root@master231 yinzhengjie]# cat mysql-smon.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: yinzhengjie-mysql-smon
spec:
jobLabel: kubeadm-mysql-k8s-yinzhengjie
endpoints:
- interval: 30s
# 这里的端口可以写svc的端口号,也可以写svc的名称。
# 但我推荐写svc端口名称,这样svc就算修改了端口号,只要不修改svc端口的名称,那么我们此处就不用再次修改哟。
# port: 9104
port: mysql80
path: /metrics
scheme: http
namespaceSelector:
matchNames:
- default
selector:
matchLabels:
apps: mysqld
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kubectl apply -f mysql-smon.yaml
servicemonitor.monitoring.coreos.com/yinzhengjie-mysql-smon created
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]#
[root@master231 yinzhengjie]# kubectl get smon
NAME AGE
yinzhengjie-mysql-smon 8s
[root@master231 yinzhengjie]#
5.观察Prometheus是否有数据
如上图所示,我们观察到Prometheus已经监控到mysql_exporter啦。
如下图所示,我们也可以搜索"mysql_up"这个metrics来观察是否采集到数据指标。
6.使用grafana查看数据
导入模板ID。如上图所示,我使用的是"7362"这个ID编号。
参考链接:
https://www.cnblogs.com/yinzhengjie/p/17993644
1.3 通过serviceMonitor监控mysql(外部)
[root@master231 /oldboyedu/prom]# cat 04-endpoint_mysql.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: jiaxing-mysql-metrics
subsets:
- addresses:
- ip: 10.0.0.52
ports:
- port: 9104
name: mysql80
---
apiVersion: v1
kind: Service
metadata:
name: jiaxing-mysql-metrics
labels:
apps: mysqld
spec:
ports:
- protocol: TCP
port: 9104
targetPort: 9104
name: mysql80
[root@master231 /oldboyedu/prom]# cat mysql-smon.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: jiaxing-mysql-smon
spec:
jobLabel: kubeadm-mysql-k8s-jiaxing
endpoints:
- interval: 30s
port: mysql80
path: /metrics
scheme: http
namespaceSelector:
matchNames:
- default
selector:
matchLabels:
apps: mysqld
[root@master231 /oldboyedu/prom]#
2. 监控elk集群-非云原生应用
- prometheus监控ElasticSearch集群
1.验证集群的可用性
[root@elk92 ~]# curl -u elastic:123456 10.0.0.91:9200/_cat/nodes
10.0.0.92 43 57 1 0.00 0.04 0.05 cdfhilmrstw * elk92
10.0.0.91 58 47 7 0.07 0.26 0.24 cdfhilmrstw - elk91
10.0.0.93 44 31 2 0.12 0.12 0.08 cdfhilmrstw - elk93
[root@elk92 ~]#
2.下载ElasticSearch-exporter
[root@elk92 ~]# wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.7.0/elasticsearch_exporter-1.7.0.linux-amd64.tar.gz
3.解压软件包
[root@elk92 ~]# tar xf elasticsearch_exporter-1.7.0.linux-amd64.tar.gz -C /usr/local/bin/ elasticsearch_exporter-1.7.0.linux-amd64/elasticsearch_exporter --strip-components=1
4.启动ElasticSearch_exporter
[root@elk92 ~]# elasticsearch_exporter --es.uri="http://elastic:123456@10.0.0.91:9200" --web.listen-address=:9114 --es.all
5.验证数据
[root@elk93 ~]# curl -s http://10.0.0.92:9114/metrics | grep elk92 | tail -1
elasticsearch_transport_tx_size_bytes_total{cluster="oldboyedu-linux89",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="10.0.0.92",name="elk92"} 2.31223915e+08
[root@elk93 ~]#
[root@elk93 ~]# curl -s http://10.0.0.92:9114/metrics | grep elk93 | tail -1
elasticsearch_transport_tx_size_bytes_total{cluster="oldboyedu-linux89",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="10.0.0.93",name="elk93"} 1.38740035e+08
[root@elk93 ~]#
[root@elk93 ~]# curl -s http://10.0.0.92:9114/metrics | grep elk91 | tail -1
elasticsearch_transport_tx_size_bytes_total{cluster="oldboyedu-linux89",es_client_node="true",es_data_node="true",es_ingest_node="true",es_master_node="true",host="10.0.0.91",name="elk91"} 1.31043729e+08
[root@elk93 ~]#
6.配置prometheus监控ElasticSearch集群
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-elasticsearch"
static_configs:
- targets:
- "10.0.0.92:9114"
7.让配置生效
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
8.验证target是否监控到es集群
http://10.0.0.31:9090/targets
9.grafana导入模板
14191
3. 监控kafka集群
- prometheus监控kafka实战
1.启动zookeeper集群
[root@elk91 ~]# managaer-zk.sh start
[root@elk91 ~]#
[root@elk91 ~]# managaer-zk.sh status
查看状态
========== 10.0.0.91 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
========== 10.0.0.92 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
========== 10.0.0.93 zkServer.sh status ================
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
[root@elk91 ~]#
2.启动kafka集群
[root@elk91 ~]# kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
[root@elk92 ~]# kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
[root@elk93 ~]# kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
3.查看zookeeper对应的broker是否上线
[root@elk91 ~]# zkCli.sh
...
[zk: localhost:2181(CONNECTED) 9] ls /oldboyedu_kafka351/brokers/ids
[91, 92, 93]
[zk: localhost:2181(CONNECTED) 10]
4.下载kafka_exporter
[root@elk93 ~]# wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.7.0/kafka_exporter-1.7.0.linux-amd64.tar.gz
5.解压软件包
[root@elk93 ~]# tar xf kafka_exporter-1.7.0.linux-amd64.tar.gz -C /usr/local/bin/ kafka_exporter-1.7.0.linux-amd64/kafka_exporter --strip-components=1
[root@elk93 ~]#
6.运行kafka_exporter
[root@elk93 ~]# kafka_exporter --kafka.version="3.5.1" --web.listen-address=":9308" --web.telemetry-path="/oldboyedu-metrics" --kafka.server=10.0.0.91:9092 --kafka.server=10.0.0.92:9092 --kafka.server=10.0.0.93:9092
温馨提示:
如果不修改"web.telemetry-path",默认值为"/metrics"
7.客户端测试访问
[root@elk91 ~]# curl -s http://10.0.0.93:9308/oldboyedu-metrics | tail -1
promhttp_metric_handler_requests_total{code="503"} 0
[root@elk91 ~]#
4. 监控nginx
- prometheus监控nginx
1 编译安装nginx
1.1 安装编译工具
yum -y install git wget gcc make zlib-devel gcc-c++ libtool openssl openssl-devel
1.2 克隆nginx-module-vts模块
git clone git://github.com/vozlt/nginx-module-vts.git
如果上述连接不好用,可以执行下面代码:
git clone https://gitee.com/jasonyin2020/nginx-module-vts.git
1.3 下载nginx软件包
wget http://nginx.org/download/nginx-1.22.1.tar.gz
1.4 解压nginx
tar xf nginx-1.22.1.tar.gz
1.5 配置nginx
cd nginx-1.22.1
./configure --prefix=/oldboyedu/softwares/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--without-http_gzip_module \
--with-pcre \
--with-file-aio \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=/root/nginx-module-vts
1.6 编译并安装nginx
make -j 2 && make install
1.7 修改nginx的配置文件
vim /oldboyedu/softwares/nginx/conf/nginx.conf
...
http {
vhost_traffic_status_zone;
upstream oldboyedu-promethues {
server 10.0.0.31:9090;
}
...
server {
...
location / {
root html;
# index index.html index.htm;
proxy_pass http://oldboyedu-promethues;
}
location /status {
# 使用新加入模块功能
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
1.8 检查配置文件语法
/oldboyedu/softwares/nginx/sbin/nginx -t
1.9 启动nginx
/oldboyedu/softwares/nginx/sbin/nginx
1.10 访问nginx的状态页面
http://10.0.0.41/status/format/prometheus
2 安装nginx-vtx-exporter
2.1 下载nginx-vtx-exporter
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
温馨提示:
不建议下载更高版本,因为其会提升对GLIC的版本要求,可以通过" strings /lib64/libc.so.6 | grep GLIBC_ "查看默认是2.17版本,若使用较高版本则需要2.32+
2.2 解压软件包到path路径
tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz -C /usr/local/bin/ nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter --strip-components=1
2.3 运行nginx-vtx-exporter
nginx-vts-exporter -nginx.scrape_uri=http://10.0.0.245/status/format/json
3.配置prometheus采集nginx数据
3.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-nginx-exporter"
metrics_path: "/status/format/prometheus"
static_configs:
- targets:
- "10.0.0.245:80"
- job_name: "oldboyedu-nginx-vts-exporter"
static_configs:
- targets:
- "10.0.0.245:9913"
3.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload
3.3 导入grafana模板
2949
5. 监控redis
- prometheus监控redis环境
1 部署redis
1.1 安装redis
curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install redis
1.2 修改redis的配置文件
sed -i '/^bind/s#127.0.0.1#0.0.0.0#' /etc/redis.conf
grep ^bind /etc/redis.conf
1.3 启动redis
systemctl start redis
1.4 写入测试数据
[root@prometheus-node41 ~]# redis-cli -n 5 --raw# redis-cli -n 5 –raw
127.0.0.1:6379[5]> LPUSH xiyouji 孙悟空 猪八戒 沙和尚 唐三藏
127.0.0.1:6379[5]> SET school oldboyedu
127.0.0.1:6379[5]> SET class linux86
127.0.0.1:6379[5]> KEYS *
class
xiyouji
school
127.0.0.1:6379[5]>
2 部署redis-exporter
2.1 下载redis-exporter
wget https://github.com/oliver006/redis_exporter/releases/download/v1.57.0/redis_exporter-v1.57.0.linux-amd64.tar.gz
2.2 解压软件包到PATH路径
tar xf redis_exporter-v1.57.0.linux-amd64.tar.gz -C /usr/local/bin/ redis_exporter-v1.57.0.linux-amd64/redis_exporter --strip-components=1
2.3 运行redis-exporter
redis_exporter
# redis_exporter -web.listen-address ":9121" -web.telemetry-path "/metrics"
3 配置prometheus采集redis数据
3.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-redis-exporter"
static_configs:
- targets:
- "10.0.0.245:9121"
3.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload
3.3 导入grafana模板
763
14091
14615
6. 监控tomcat-基于docker镜像方式
- prometheus监控tomcat
1 部署tomcat-exporter
1.1 安装docker环境
略。
1.2 基于Dockerfile构建tomcat-exporter
参考我给的Dockerfile(25天笔记)
[root@prometheus-node41 tomcat]# docker build -t tomcat-exporter:v0.1 .
1.3 运行tomcat镜像
[root@prometheus-node41 tomcat]# docker run -d --network host tomcat-exporter:v0.1
a25c1d26f1a710c37eed5a21db66de9641e50880f77989598b6b066466524edc
[root@prometheus-node41 tomcat]#
[root@prometheus-node41 tomcat]#
[root@prometheus-node41 tomcat]# ss -ntl | grep 8080
LISTEN 0 100 *:8080 *:*
[root@prometheus-node41 tomcat]#
1.4 访问tomcat应用
http://10.0.0.41:8080/metrics/
http://10.0.0.41:8080/myapp/
2 配置prometheus监控tomcat应用
2.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-tomcat-exporter"
static_configs:
- targets:
- "10.0.0.41:8080"
2.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload
2.3 导入grafana模板
由于官方的支持并不友好,可以在GitHub自行搜索相应的tomcat监控模板。
参考链接:
https://github.com/nlighten/tomcat_exporter/blob/master/dashboard/example.json
插件安装方式
- 安装grafana插件
1 查看dashboard时观察缺少相应的插件而报错
Panel plugin not found: natel-discrete-panel
温馨提示:
根据报错提示,可以看出是缺少"natel-discrete-panel"相关的插件。
2 搜索某个插件关键字
centos环境可以搜索关键字,但Ubuntu系统不支持搜索,可以采取如下的方法。
2.1 下载插件
wget https://grafana.com/api/plugins/natel-discrete-panel/versions/latest/download -O /opt/natel-discrete-panel.zip
2.2 解压软件包到grafana的指定目录
[root@prometheus-node42 ~]# cd /opt/
[root@prometheus-node42 opt]#
[root@prometheus-node42 opt]# apt -y install unzip
[root@prometheus-node42 opt]#
# grafana插件默认路径/var/lib/grafana/plugins/
[root@prometheus-node42 opt]# unzip natel-discrete-panel.zip -d /var/lib/grafana/plugins/
2.3 重启grafana服务
[root@prometheus-node42 ~]# systemctl restart grafana-server
[root@prometheus-node42 ~]# ss -ntl | grep 3000
LISTEN 0 4096 *:3000 *:*
[root@prometheus-node42 ~]#
2.3 导入grafana模板
由于官方的支持并不友好,可以在GitHub自行搜索相应的tomcat监控模板。
参考链接:
https://github.com/nlighten/tomcat_exporter/blob/master/dashboard/example.json
blackbox_exporter的作用和部署
0. 概述
- 监控分类:
黑盒监控:
是从外部监控服务,当服务出现故障时,触发告警,让用户解决问题。
说白了就是问题发生了才告警通知运维。
白盒监控:
是服务内部的监控,是服务自身暴露的监控指标,通过这些指标可以提前预测问题,从而将问题扼杀在摇篮里。
说白了就是问题还没有发生之前就告知运维。
参考链接:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
https://github.com/prometheus/blackbox_exporter
- blackbox_exporter的作用和部署
1 blackbox_exporter概述
blackbox exporter支持基于HTTP, HTTPS, DNS, TCP, ICMP, gRPC协议来对目标节点进行监控。
比如基于http协议我们可以探测一个网站的返回状态码为200判读服务是否正常。
比如基于TCP协议我们可以探测一个主机端口是否监听。
比如基于ICMP协议来ping一个主机的连通性。
比如基于gRPC协议来调用接口并验证服务是否正常工作。
比如基于DNS协议可以来检测域名解析。
2 部署blackbox exporter
2.1 下载blackbox exporter
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.24.0/blackbox_exporter-0.24.0.linux-amd64.tar.gz
2.2 解压软件包
tar xf blackbox_exporter-0.24.0.linux-amd64.tar.gz -C /oldboyedu/softwares/
2.3 启动服务
cd /oldboyedu/softwares/blackbox_exporter-0.24.0.linux-amd64/
./blackbox_exporter
2.4 访问blackbox的webUI
http://10.0.0.41:9115/
1. prometheus基于blackbox的http案例
- prometheus基于blackbox的http案例
1 修改Prometheus配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
# 指定作业的名称,生成环境中,通常是指一类业务的分组配置。
- job_name: 'oldboyedu-blackbox-exporter'
# 修改访问路径,若不修改,默认值为"/metrics"
metrics_path: /probe
# 配置URL的相关参数
params:
# 此处表示使用的是blackbox的http模块,从而判断相应的返回状态码是否为200
module: [http_2xx]
school: [oldboyedu]
class: ["linux89"]
# 静态配置,需要手动指定监控目标
static_configs:
# 需要监控的目标
- targets:
# 支持https协议
- https://www.oldboyedu.com/
# 支持http协议
- http://10.0.0.41
# 支持http协议和自定义端口
- http://10.0.0.31:9090
# 对采集的metrics进行重新打标签一种方式。
relabel_configs:
# 指定源标签,此处的"__address__"表示内置的标签,存储的是被监控目标的IP地址
- source_labels: [__address__]
# 指定目标标签,其实就是在"Endpoint"中加了一个target字段(用于指定监控目标),
target_label: __param_target
# 指定需要执行的动作,默认值为"replace",有效动作为: replace, keep, and drop。
# 将"__address__"传递给target字段。
action: replace
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
# 指定要替换的值,此处我指定为blackbox exporter的主机地址
replacement: 10.0.0.41:9115
2 访问blackbox exporter的WebUI
http://10.0.0.41:9115/
3.导入grafana模板
7587
13659
2. prometheus基于blackbox的ICMP案例
- prometheus基于blackbox的ICMP案例
1 修改Prometheus配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: 'jiaxing-blackbox-exporter-icmp'
metrics_path: /probe
params:
# 如果不指定模块,则默认类型为"http_2xx",不能乱写!乱写监控不到服务啦!
module: [icmp]
static_configs:
- targets:
- 10.0.0.41
- 10.0.0.42
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
# 指定注意的是,如果instance不修改,则instance和"__address__"的值相同
target_label: ip
# target_label: instance
- target_label: __address__
replacement: 10.0.0.41:9115
2 访问blackbox exporter的WebUI
http://10.0.0.41:9115/
3. prometheus基于blackbox的TCP案例
- prometheus基于blackbox的TCP案例
1 修改Prometheus配置文件
vim /jiaxing/softwares/prometheus/prometheus.yml
...
scrape_configs:
...
- job_name: 'oldboyedu-blackox-exporter-tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- 10.0.0.41:80
- 10.0.0.42:22
- 10.0.0.31:9090
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 10.0.0.41:9115
2 访问blackbox exporter的WebUI
http://10.0.0.41:9115/
prometheus监控容器案例-cadvisor
- prometheus监控容器案例-cadvisor
1. 运行测试容器
docker run -d -p 19090:9090 --restart always --name oldboyedu_prometheus_server prom/prometheus:v2.45.3
docker run -d -p 19100:9100 --restart always --name oldboyedu_node-exporter prom/node-exporter:v1.7.0
docker run -d --name=grafana -p 13000:3000 grafana/grafana:10.3.1-ubuntu
2 cAdvisor概述
cAdvisor(Container Advisor)让容器用户了解其运行容器的资源使用情况和性能特征。
它是一个正在运行的守护进程,用于收集、聚合、处理和导出有关正在运行的容器的信息。
具体来说,对于每个容器,它保留资源隔离参数、历史资源使用情况、完整历史资源使用的直方图和网络统计信息。
官网地址:
https://github.com/google/cadvisor
3 部署cAdvisor容器
docker run --volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--network host \
--detach=true \
--name=oldboyedu_cadvisor \
registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/cadvisor:v0.47.2
4 prometheus采集cAdvisor容器
4.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "prometheus-oldboyedu-cAdvisor"
static_configs:
- targets:
- "10.0.0.41:8080"
4.2 重载配置
curl -X POST http://10.0.0.31:9090/-/reload
4.3 访问WebUI验证配置是否生效
http://10.0.0.31:9090/targets
5 导入grafana模板
315
10619
promethus的服务发现配置
1. promethus的服务发现配置-file_sd_configs
- promethus的服务发现配置
1.prometheus 服务发现配置概述
prometheus支持除了支持静态配置(static_configs)外,还支持各种动态的服务发现。
静态配置配置修改prometheus server的配置文件,都需要重新加载配置。
参考连接:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file
2.基于文件的服务发现
2.1 架构说明
略。
2.2 修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: 'oldboyedu-file-service-discovery'
# 基于文件的服务发现
file_sd_configs:
# 指定文件路径
- files:
- /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json
- /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml
2.3 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload
2.4 修改动态配置文件
cat > /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml <<EOF
- targets:
- '10.0.0.41:9100'
- '10.0.0.42:9100'
labels:
"address": "shahe"
"office": "https://www.oldboyedu.com"
EOF
cat > /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json << EOF
[
{
"targets": [ "10.0.0.41:8080","10.0.0.42:8080"],
"labels": {
"school": "oldboyedu", "class": "linux89"
}
}
]
EOF
2.5 访问webUI
http://10.0.0.31:9090/targets
2. prometheus基于consul服务实现自动发现
- prometheus基于consul服务实现自动发现
1 架构说明
官网地址:
https://www.consul.io/
2 部署consul
2.1 下载consul
wget https://releases.hashicorp.com/consul/1.17.2/consul_1.17.2_linux_amd64.zip
2.2 解压consul
apt -y install unzip
unzip consul_1.17.2_linux_amd64.zip -d /usr/local/bin/
3 运行consul 集群
服务端31:
consul agent -server -bootstrap -bind=10.0.0.31 -data-dir=/oldboyedu/softwares/consul -client=10.0.0.31 -ui
客户端32:
consul agent -bind=10.0.0.32 -data-dir=/oldboyedu/softwares/consul -client=10.0.0.32 -ui -retry-join=10.0.0.31
客户端33:
consul agent -server -bind=10.0.0.33 -data-dir=/oldboyedu/softwares/consul -client=10.0.0.33 -ui -retry-join=10.0.0.31
3 使用consul实现自动发现
3.1 修改prometheus的配置文件
vim /oldboyedu/softwares/prometheus/prometheus.yml
...
scrape_configs:
...
- job_name: "oldboyedu-consul-seriver-discovery"
# 配置基于consul的服务发现
consul_sd_configs:
# 指定consul的服务器地址,若不指定,则默认值为"localhost:8500".
- server: 10.0.0.31:8500
- server: 10.0.0.32:8500
- server: 10.0.0.33:8500
relabel_configs:
# 匹配consul的源标签字段,表示服务名称
- source_labels: [__meta_consul_service]
# 指定源标签的正则表达式,若不定义,默认值为"(.*)"
regex: consul
# 执行动作为删除,默认值为"replace",有效值: replace, keep, and drop
action: drop
3.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload
3.3 任意节点在consul集群注册要监控的target节点
[root@harbor250 ~]# curl -X PUT -d '{"id":"prometheus-node41","name":"oldboyedu-prometheus-node41-svc","address":"10.0.0.41","port":9100,"tags":["node-exporter"],"checks": [{"http":"http://10.0.0.41:9100","interval":"5m"}]}' http://10.0.0.31:8500/v1/agent/service/register
[root@harbor250 ~]#
注意,也可以使用POSTMAN直接进行如下操作
{"id":"prometheus-node42","name":"oldboyedu-prometheus-node42-svc","address":"10.0.0.42","port":9100,"tags":["node-exporter"],"checks": [{"http":"http://10.0.0.42:9100","interval":"1m"}]}
3.4 注销节点
curl -X PUT http://10.0.0.31:8500/v1/agent/service/deregister/prometheus-node41
TODO---> 目前有个坑:
你注册时找得哪个节点,那么注销时也要找这个节点注销,待解决...
注意,也可以使用POSTMAN直接进行如下操作,需要使用PUT方法。
prometheus联邦模式
- prometheus联邦模式
1.prometheus联邦模式架构概述
默认情况下,prometheus采集的数据会存储到本地,这意味者prometheus在这种工作模式下,可能会存在单机存储的瓶颈。
为了解决prometheus对于数据的采集压力,我们可以采用联邦模式来部署prometheus。
2.部署联邦模式之prometheus server32配置
2.1 修改prometheus server配置文件
[root@prometheus-server32 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: 'jiaxing-file-service-discovery-32'
# 基于文件的服务发现
file_sd_configs:
# 指定文件路径
- files:
- /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml
2.2 重载prometheus server
curl -X POST http://10.0.0.32:9090/-/reload
2.3 编写yaml文件
cat > /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.yaml <<EOF
- targets:
- '10.0.0.41:9100'
labels:
"address": "shahe"
"office": "www.oldboyedu.com"
"apps": "yaml"
EOF
2.4 验证数据是否采集成功
http://10.0.0.32:9090/targets
3.部署联邦模式之prometheus server33 配置
3.1 修改prometheus server的配置文件
[root@prometheus-server33 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: 'jiaxing-file-service-discovery-33'
# 基于文件的服务发现
file_sd_configs:
# 指定文件路径
- files:
- /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json
3.2 重载prometheus server
curl -X POST http://10.0.0.33:9090/-/reload
3.3 编写json文件
cat > /jiaxing/softwares/prometheus-2.45.3.linux-amd64/oldboyedu-file-sd.json << EOF
[
{
"targets": ["10.0.0.42:9100"],
"labels": {
"school": "oldboyedu",
"class": "linux89",
"apps": "json"
}
}
]
EOF
3.4 验证数据是否采集成功
http://10.0.0.33:9090/targets
4.部署联邦模式之Prometheus server31配置
4.1 修改prometheus server的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "prometheus-federate-32"
metrics_path: "/federate"
# 用于解决标签的冲突问题,有效值为: true和false,默认值为false
# 当设置为true时,将保留抓取的标签以忽略服务器自身的标签。说白了会覆盖原有标签。
# 当设置为false时,则不会覆盖原有标签,而是在标点前加了一个"exported_"前缀。
honor_labels: true
params:
"match[]":
- '{job="promethues"}'
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs:
- targets:
- "10.0.0.32:9090"
- job_name: "prometheus-federate-33"
metrics_path: "/federate"
honor_labels: true
params:
"match[]":
- '{job="promethues"}'
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs:
- targets:
- "10.0.0.33:9090"
4.2 重载prometheus server
curl -X POST http://10.0.0.31:9090/-/reload
4.3 验证数据是否采集成功
http://10.0.0.31:9090/targets
4.4 查询数据
node_cpu_seconds_total{job=~"jiaxing-file-service-discovery-.*"}
prometheus之本地存储模式配置
- Prometheus的存储系统配置之本地存储配置
1.1 常用参数说明
--config.file=/jiaxing/softwares/prometheus/prometheus.yml
指定prometheus的配置文件。
--web.enable-lifecycle
启用web方式热加载。
--storage.tsdb.path="/jiaxing/data/prometheus"
指定prometheus数据存储路径。
--storage.tsdb.retention.time="60d"
指定prometheus数据存储周期。
--web.listen-address="0.0.0.0:9090"
指定prometheus的监听端口。
--web.max-connections=4096
指定最大的连接数。
--storage.tsdb.retention.size="512MB"
指定prometheus数据块的滚动大小,就是单个文件最大容量,达到512MB时则写入到其他文件。
--query.timeout=10s
查询数据的超时时间。
--query.max-concurrency=20
最大并发查询数量。
--log.level=info
指定日志级别。
--log.format=logfmt
指定日志格式。
--web.read-timeout=5m
最大的空闲超时时间。
1.2 修改prometheus的启动脚本
cat > /etc/systemd/system/prometheus-server.service <<EOF
[Unit]
Description=jiaxing Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
ExecStart=/oldboyedu/softwares/prometheus/prometheus \
--config.file=/oldboyedu/softwares/prometheus/prometheus.yml \
--web.enable-lifecycle \
--storage.tsdb.path=/oldboyedu/data/prometheus \
--storage.tsdb.retention.time=60d \
--web.listen-address=0.0.0.0:9090 \
--web.max-connections=4096 \
--storage.tsdb.retention.size=512MB \
--query.timeout=10s \
--query.max-concurrency=20 \
--log.level=info \
--log.format=json \
--web.read-timeout=5m
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl restart prometheus-server
prometheus之远端存储VictoriaMetrics
1 VicoriaMetrics概述
VictoriaMetrics是一个快速、经济高效且可扩展的监控解决方案和时间序列数据库。
官网地址:
https://victoriametrics.com/
官方文档:
https://docs.victoriametrics.com/
GitHub地址:
https://github.com/VictoriaMetrics/VictoriaMetrics
2 部署victoriametrics
2.1 下载victoriametrics
root@prometheus-node41:~# wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.10/victoria-metrics-linux-amd64-v1.93.10.tar.gz
2.2 解压软件包
root@prometheus-node41:~# tar xf victoria-metrics-linux-amd64-v1.93.10.tar.gz -C /usr/local/bin/
2.3 编写启动脚本
root@prometheus-node41:~# cat > /etc/systemd/system/victoria-metrics.service <<EOF
[Unit]
Description=jiaxing VictoriaMetrics Server
Documentation=https://docs.victoriametrics.com/
After=network.target
[Service]
ExecStart=/usr/local/bin/victoria-metrics-prod \
-httpListenAddr=0.0.0.0:8428 \
-storageDataPath=/jiaxing/data/victoria-metrics \
-retentionPeriod=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now victoria-metrics.service
systemctl status victoria-metrics
3.prometheus配置VictoriaMetrics远端存储
3.1 修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
# 在顶级字段中配置VictoriaMetrics地址
remote_write:
- url: http://10.0.0.41:8428/api/v1/write
# 如果prometheus的负载过高,可以考虑使用如下配置,可以顶得住20w/QPS
queue_config:
max_samples_per_send: 10000
capacity: 20000
max_shards: 30
3.2 重新加载prometheus的配置
curl -X POST http://10.0.0.31:9090/-/reload
3.3 验证victoria-metrics是否有数据(我的环境是在联邦模式基础之上配置的)
node_cpu_seconds_total{job=~"jiaxing-file-service-discovery-.*"}
3.4 配置grafana的数据源及URL
# 数据源是prometheus,但是URL得写VictoriaMetric的URL哟。
http://10.0.0.41:8428/
3.5 导入grafana的模板ID并选择数据源
1860
pushgateway组件-自定义监控指标
1. 部署
- pushgateway组件实战案例
1.pushgateway概述
pushgateway用于定义自定义监控指标数据,用户可以将自定义的数据推送到pushgateway中。
而后prometheus server从pushgateway组件中拉取数据,进行监控。
2.部署pushgateway
2.1 下载pushgateway组件
wget https://github.com/prometheus/pushgateway/releases/download/v1.7.0/pushgateway-1.7.0.linux-amd64.tar.gz
2.2 解压软件包
tar xf pushgateway-1.7.0.linux-amd64.tar.gz -C /usr/local/bin/ pushgateway-1.7.0.linux-amd64/pushgateway --strip-components=1
2.3 编写启动脚本
cat > /etc/systemd/system/pushgatway.service <<EOF
[Unit]
Description=jiaxing Pushgateway
After=network.target
[Service]
ExecStart=/usr/local/bin/pushgateway \
--persistence.file=/jiaxing/data/pushgatway.log \
--persistence.interval=5m \
--log.level=info \
--log.format=json
[Install]
WantedBy=multi-user.target
EOF
2.4 启动pushgateway服务
systemctl daemon-reload
systemctl enable --now pushgatway
2.5 访问pushgateway的WebUI
http://10.0.0.41:9091/
3.推送数据到pushgateway
默认push到pushgateway路径:http://<ip>:9091/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>}
3.1 使用curl工具推送测试数据
echo "student_online 35" | curl --data-binary @- http://10.0.0.41:9091/metrics/job/jiaxing/instance/10.0.0.250
echo "student_online 200" | curl --data-binary @- http://10.0.0.41:9091/metrics/job/jiaxing/instance/10.0.0.250
echo "student_online{school=\"oldboyedu\",class=\"linux89\"} 57" | curl --data-binary @- http://10.0.0.41:9091/metrics/job/jiaxing/instance/10.0.0.250
3.2 查看pushgateway的WebUI
http://10.0.0.41:9091/
4.prometheus配置抓取pushgateway数据
4.1 修改prometheus的配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "jiaxing_pushgateway"
honor_labels: true
static_configs:
- targets: ["10.0.0.41:9091"]
4.2 重新加载配置
curl -X POST http://10.0.0.31:9090/-/reload
4.3 查询数据验证
student_online
student_online{class="linux89"}
2. shell脚本自定义监控指标
- prometheus监控tcp的12种状态案例
1.采集指标到pushgateway
1.编写脚本采集12种状态
[root@k8s231.oldboyedu.com ~]# cat /usr/local/bin/tcp_status.sh
#!/bin/bash
# auther: Jason Yin
# school: oldboyedu
# class: linux89
# office: www.oldboyedu.com
# 定义TCP的12种状态
ESTABLISHED_COUNT=0
SYN_SENT_COUNT=0
SYN_RECV_COUNT=0
FIN_WAIT1_COUNT=0
FIN_WAIT2_COUNT=0
TIME_WAIT_COUNT=0
CLOSE_COUNT=0
CLOSE_WAIT_COUNT=0
LAST_ACK_COUNT=0
LISTEN_COUNT=0
CLOSING_COUNT=0
UNKNOWN_COUNT=0
# 定义任务名称
JOB_NAME=tcp_status
# 定义实例名称
INSTANCE_NAME=harbor250
# 定义pushgateway主机
HOST=10.0.0.41
# 定义pushgateway端口
PORT=9091
# TCP的12种状态
ALL_STATUS=(ESTABLISHED SYN_SENT SYN_RECV FIN_WAIT1 FIN_WAIT2 TIME_WAIT CLOSE CLOSE_WAIT LAST_ACK LISTEN CLOSING UNKNOWN)
# 声明一个关联数组,类似于py的dict,go的map
declare -A tcp_status
# 统计TCP的12种状态
for i in ${ALL_STATUS[@]}
do
temp=`netstat -untalp | grep $i | wc -l`
tcp_status[${i}]=$temp
done
# 将统计后的结果发送到pushgateway
for i in ${!tcp_status[@]}
do
data="$i ${tcp_status[$i]}"
# TODO: shell如果想要设计成相同key不同标签的方式存在问题,只会有最后一种状态被发送
# data="oldboyedu_tcp_all_status{status=\"$i\"} ${tcp_status[$i]}"
# echo $data
echo $data | curl --data-binary @- http://${HOST}:${PORT}/metrics/job/${JOB_NAME}/instance/${INSTANCE_NAME}
done
[root@k8s231.oldboyedu.com ~]#
2.编写定时任务推送数据到pushgateway
[root@k8s231.oldboyedu.com ~]# echo "*/5 * * * * /usr/local/bin/tcp_status.sh" >> /var/spool/cron/root
[root@k8s231.oldboyedu.com ~]#
[root@k8s231.oldboyedu.com ~]# crontab -l
*/5 * * * * /usr/local/bin/tcp_status.sh
[root@k8s231.oldboyedu.com ~]#
3.观察pushgateway的WebUI
http://10.0.0.61:9091/
其他补充参考:
[root@harbor250 ~]# cat oldboyedu-tcp-status.sh
#!/bin/bash
# 设置 Pushgateway 的 URL
pushgateway_url="http://10.0.0.41:9091/metrics/job/tcp_status"
time=$(date +%Y-%m-%d+%H:%M:%S)
state="SYN-SENT SYN-RECV FIN-WAIT-1 FIN-WAIT-2 TIME-WAIT CLOSE CLOSE-WAIT LAST-ACK LISTEN CLOSING ESTAB"
for i in $state
do
t=`ss -tan |grep $i |wc -l`
echo tcp_connections{state=\""$i"\"} $t >>/tmp/tcp.txt
done;
cat /tmp/tcp.txt | curl --data-binary @- $pushgateway_url
rm -rf /tmp/tcp.txt
[root@harbor250 ~]#
3. python脚本自定义exporter监控指标
- 使用python程序自定义exporter案例
1.安装pip3工具包
[root@prometheus-node42 ~]# apt update
[root@prometheus-node42 ~]# apt install -y python3-pip
2.创建用户
[root@prometheus-node42 ~]# useradd -m -s /bin/bash python
3.修改配置文件(可选)
[root@prometheus-node42 ~]# su - python
python@prometheus-node42:~$
python@prometheus-node42:~$ vim .bashrc
...
# 取消下面一行的注释,添加颜色显示
force_color_prompt=yes
4.pip配置加速
python@prometheus-node42:~$ mkdir ~/.pip
python@prometheus-node42:~$
python@prometheus-node42:~$ vim ~/.pip/pip.conf
# [global]
# index-url=https://pypi.tuna.tsinghua.edu.cn/simple
# [install]
# trusted-host=pypi.douban.com
[global]
index-url=https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host=mirrors.aliyun.com
python@prometheus-node42:~$
5.安装实际环境中相关模块库
python@prometheus-node42:~$ pip3 install flask prometheus_client
python@prometheus-node42:~$ pip3 list
6.创建代码目录
python@prometheus-node42:~$ mkdir code
7.编写代码
python@prometheus-node42:~$ cd code
python@prometheus-node42:~/code$
python@prometheus-node42:~/code$ cat flask_metric.py
#!/usr/bin/python3
from prometheus_client import start_http_server,Counter, Summary
from flask import Flask, jsonify
from wsgiref.simple_server import make_server
import time
app = Flask(__name__)
# Create a metric to track time spent and requests made
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
COUNTER_TIME = Counter("request_count", "Total request count of the host")
@app.route("/metrics")
@REQUEST_TIME.time()
def requests_count():
COUNTER_TIME.inc()
return jsonify({"return": "success OK!"})
if __name__ == "__main__":
start_http_server(8000)
httpd = make_server( '0.0.0.0', 8001, app )
httpd.serve_forever()
python@prometheus-node42:~/code$
8.启动python程序
python@prometheus-node42:~/code$ python3 flask_metric.py
...
# 当启动客户端测试时,可能会出现如下的信息
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
10.0.0.250 - - [30/Jan/2024 03:56:09] "GET /metrics HTTP/1.1" 200 25
9.客户端测试
python@prometheus-node42:~/code$ cat jiaxing_curl_metrics.sh
#!/bin/bash
URL=http://10.0.0.42:8001/metrics
while true;do
curl_num=$(( $RANDOM%50+1 ))
sleep_num=$(( $RANDOM%5+1 ))
for c_num in `seq $curl_num`;do
curl -s $URL &> /dev/null
done
sleep $sleep_num
done
python@prometheus-node42:~/code$
python@prometheus-node42:~/code$ bash curl_metrics.sh
- prometheus监控自定义的exporter实战
1.编辑配置文件
[root@prometheus-server31 ~]# vim /jiaxing/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "jiaxing_python_custom_metrics"
static_configs:
- targets:
- 10.0.0.42:8000
root@prometheus41:~#
root@prometheus41:~#
2.检查配置文件语法
[root@prometheus-server31 ~]# cd /jiaxing/softwares/prometheus-2.45.3.linux-amd64/
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]#
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: prometheus.yml is valid prometheus config file syntax
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]#
3.重新加载配置文件
curl -X POST http://10.0.0.31:9090/-/reload
4.验证prometheus是否采集到数据
http://10.0.0.31:9090/targets
5.grafana作图展示
request_count_total
apps请求总数。
increase(request_count_total{job="jiaxing_python_custom_metrics"}[1m])
每分钟请求数量曲线QPS。
irate(request_count_total{job="jiaxing_python_custom_metrics"}[1m])
每分钟请求量变化率曲线
request_processing_seconds_sum{job="jiaxing_python_custom_metrics"} / request_processing_seconds_count{job="jiaxing_python_custom_metrics"}
每分钟请求处理平均耗时
4. golang脚本自定义exporter监控指标
- 使用golang程序自定义exporter案例
1.Linux安装golang环境
[root@prometheus-node41 ~]# apt -y install golang
[root@prometheus-node41 ~]#
[root@prometheus-node41 ~]# go version
go version go1.18.1 linux/amd64
[root@prometheus-node41 ~]#
二进制安装:
1.下载软件包
[root@prometheus-node42 ~]# wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
2.解压软件包
[root@prometheus-node42 ~]# tar xf go1.21.6.linux-amd64.tar.gz -C /oldboyedu/softwares/
3.配置环境变量
[root@prometheus-node42 ~]# cat /etc/profile.d/go.sh
#!/bin/bash
export GOPATH=/oldboyedu/code/go
export GOPROXY=https://proxy.golang.org,direct
export GOROOT=/oldboyedu/softwares/go
export PATH=$PATH:$GOROOT/bin
[root@prometheus-node42 ~]#
[root@prometheus-node42 ~]# go version
go version go1.21.6 linux/amd64
[root@prometheus-node42 ~]#
2.编写测试代码
2.1 创建工作目录
[root@prometheus-node41 ~]# mkdir -pv code/
[root@prometheus-node41 ~]#
[root@prometheus-node41 ~]# cd code/
[root@prometheus-node41 code]#
2.2 初始化go.mod依赖包文件
[root@prometheus-node41 code]# go mod init code
go: creating new go.mod: module code
go: to add module requirements and sums:
go mod tidy
[root@prometheus-node41 code]#
[root@prometheus-node41 code]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 30 07:43 ./
drwx------ 8 root root 4096 Jan 30 07:43 ../
-rw-r--r-- 1 root root 21 Jan 30 07:43 go.mod
[root@prometheus-node41 code]#
[root@prometheus-node41 code]# cat go.mod
module code
go 1.18
[root@prometheus-node41 code]#
2.3 配置软件源为国内的
[root@prometheus-node41 code]# go env -w GOPROXY=https://goproxy.cn,direct
[root@prometheus-node41 code]#
[root@prometheus-node41 code]# go env | grep GOPROXY
GOPROXY="https://goproxy.cn,direct"
[root@prometheus-node41 code]#
备选的软件源:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
go env -w GOPROXY=https://goproxy.io,direct
温馨提示:
Go语言在 1.13 版本之后GOPROXY 默认值为"https://proxy.golang.org"。
在国内可能会存在下载慢或者无法访问的情况,所以十分建议大家将GOPROXY设置为国内的 goproxy.cn。
2.4 安装依赖包
[root@prometheus-node41 code]# go get github.com/prometheus/client_golang/prometheus
[root@prometheus-node41 code]# go get github.com/prometheus/client_golang/prometheus/promhttp
[root@prometheus-node41 code]#
[root@prometheus-node41 code]# cat go.mod
module code
go 1.18
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.45.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
golang.org/x/sys v0.15.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
)
[root@prometheus-node41 code]#
2.5 Gauge类型案例
[root@prometheus-node41 code]# cat 01-Gauge.go
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func GaugeDemo() {
queueLength := prometheus.NewGauge(prometheus.GaugeOpts{
/*
指标名称拼接语法: [Namespace]_[Subsystem]_[Name]
*/
Namespace: "oldboyedu",
Subsystem: "linux89",
Name: "queque_length",
// 指标的帮助文档
Help: "The number of items in the queue.",
// 指标的标签
ConstLabels: map[string]string{
"auther": "JasonYin",
},
})
/*
相关方法说明:
- Set:
设置指定的值。
- Inc:
+1
- Dec:
-1
- Add:
+n
- Sub:
-n
*/
queueLength.Set(8000)
// 在默认的注册表中注册该指标,否则看不到咱们自定义的指标哟~
prometheus.MustRegister(queueLength)
// Prometheus 提供了专门的Handler
http.Handle("/metrics", promhttp.Handler())
// 监听8080端口
http.ListenAndServe(":18080", nil)
}
func main() {
GaugeDemo()
}
[root@prometheus-node41 code]#
2.6 编译go程序
[root@prometheus-node41 code]# go build -o oldboyedu-custom-go-prometheus 01-Gauge.go
2.7 运行程序
[root@prometheus-node41 code]# ./oldboyedu-custom-go-prometheus
2.8 校验数据
[root@harbor250 ~]# curl -s http://10.0.0.41:18080/metrics | grep oldboyedu_linux89_queque_length
# HELP oldboyedu_linux89_queque_length The number of items in the queue.
# TYPE oldboyedu_linux89_queque_length gauge
oldboyedu_linux89_queque_length{auther="JasonYin"} 8000
[root@harbor250 ~]#
对于运维工程师而言,只需要完成2.7~2.8步骤即可。
2.9 prometheus监控自定义的exporter实战
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
- job_name: "yinzhengjie_golang_custom_metrics"
static_configs:
- targets:
- 10.0.0.41:18080
2.10 重新加载配置
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
2.11 验证数据是否采集成功
http://10.0.0.31:9090/targets
自定义指标如下:
oldboyedu_linux89_queque_length
altermanager告警功能
1. 部署
- altermanager组件
1.altermanager概述
用于prometheus server的告警功能的组件,目前支持多种告警媒介,包括但不限于邮件告警,钉钉告警,企业微信告警等。
2.部署alermanager组件
2.1 下载软件包
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
2.2 解压软件包
[root@prometheus-server33 ~]# tar xf alertmanager-0.26.0.linux-amd64.tar.gz -C /oldboyedu/softwares/
2.3 创建符号链接
cd /oldboyedu/softwares/ && ln -svf alertmanager-0.26.0.linux-amd64 alertmanager
2.4 修改alermanager的配置文件
cat > alertmanager.yml <<'EOF'
global:
resolve_timeout: 5m
smtp_from: '1271557164@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '1271557164@qq.com'
smtp_auth_password: 'ekpinvxmqsnmfibg'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '1271557164@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
EOF
相关参数说明:
global:
resolve_timeout:
解析超时时间。
smtp_from:
发件人邮箱地址。
smtp_smarthost:
邮箱的服务器的地址及端口,例如: 'smtp.qq.com:465'。
smtp_auth_username:
发送人的邮箱用户名。
smtp_auth_password:
发送人的邮箱密码。
smtp_require_tls:
是否基于tls加密。
smtp_hello:
邮箱服务器,例如: 'qq.com'。
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval:
重复报警的间隔时间,如果没有解即报警问题,则会间隔指定时间一直触发报警,比如:5m。
receiver:
采用什么方式接收报警,例如'email'。
receivers:
- name:
定义接收者的名称,注意这里的name要和上面的route对应,例如: 'email'
email_configs:
- to:
邮箱发给谁。
send_resolved: true
inhibit_rules:
- source_match:
severity:
匹配报警级别,例如: 'critical'。
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
配置文件参考链接:
https://prometheus.io/docs/alerting/latest/configuration/#file-layout-and-global-settings
温馨提示:
163邮箱修改授权码步骤很简单,依次点击"设置" ---> "POP3/SMTP/IMAP" ---> "新增授权密码"
温馨提示:
我的授权码已经更改了,每次讲课需要重新获取最新的授权码哟!!
2.5 启动alermanager并访问webUI
http://10.0.0.33:9093/#/status
3.prometheus配置alermanager作为告警媒介
3.1 修改配置文件
[root@prometheus-server31 ~]# vim /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/prometheus.yml
...
scrape_configs:
...
alerting:
alertmanagers:
- static_configs:
- targets:
- 10.0.0.33:9093
rule_files:
- "/oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml"
...
3.2 修改告警规则
[root@prometheus-server31 ~]# mkdir /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]# cat > /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml << 'EOF'
groups:
- name: oldboyedu-linux89-container-runtime
rules:
- alert: yinzhengjie_golang_custom_metrics-41节点挂掉啦
expr: up{instance="10.0.0.41:18080", job="yinzhengjie_golang_custom_metrics"} == 0
for: 15s
labels:
school: oldboyedu
class: linux89
annotations:
summary: "{{ $labels.instance }} 已停止运行超过 15s!"
- alert: yinzhengjie_python_custom_metrics-42节点的联邦模式挂掉啦
expr: up{instance="10.0.0.42:8000", job="yinzhengjie_python_custom_metrics"} == 0
for: 15s
labels:
school: oldboyedu
class: linux89
annotations:
summary: "{{ $labels.instance }} 已停止运行超过 15s!"
EOF
3.3 重新加载prometheus的配置
curl -X POST http://10.0.0.31:9090/-/reload
3.4 查看prometheus server的WebUI
http://10.0.0.31:9090/alerts
3.5 查看alermanager的WebUI
http://10.0.0.33:9093/#/alerts
2. 自定义监控告警模板
- alermanager自定义告警模板
1.告警模板介绍
默认的告警信息界面有些简单,可以借助告警的模板信息,对告警信息进行丰富,需要借助于Alertmanager的模板功能来实现。
告警模板的使用流程如下:
- 分析关键信息
- 定制模板内容
- Alertmanager加载模板文件
- 告警信息使用模板内容属性
模板文件使用标准Go模板语法,并暴露一些包含时间标签和值的变量。
- 标签引用: {{ $label.<label_name> }}
- 指标样本值引用: {{ $value }}
为了显式效果,需要了解一些html相关技术,参考链接:
https://www.w3school.com.cn/html/index.asp
2.altermanger节点自定义告警模板参考案例
2.1 创建邮件模板文件工作目录
[root@prometheus-server33 ~]# mkdir -pv /oldboyedu/softwares/alertmanager/tmpl
2.2 创建模板实例,工作中可以考虑嵌入公司的logo
[root@prometheus-server33 ~]# cat /oldboyedu/softwares/alertmanager/tmpl/email.tmpl
{{ define "oldboyedu.html" }}
<h1>老男孩IT教育欢迎您: https://www.oldboyedu.com/</h1>
<table border="1">
<tr>
<th>报警项</th>
<th>实例</th>
<th>报警阀值</th>
<th>开始时间</th>
</tr>
{{ range $i, $alert := .Alerts }}
<tr>
<td>{{ index $alert.Labels "alertname" }}</td>
<td>{{ index $alert.Labels "instance" }}</td>
<td>{{ index $alert.Annotations "value" }}</td>
<td>{{ $alert.StartsAt }}</td>
</tr>
{{ end }}
</table>
{{ end }}
[root@prometheus-server33 ~]#
3.alertmanager引用自定义模板文件
[root@prometheus-server33 alertmanager]# vim /oldboyedu/softwares/alertmanager/alertmanager.yml
...
# 加载模板
templates:
- '../tmpl/*.tmpl'
receivers:
- name: 'yinzhengjie_email'
email_configs:
- to: "y1053419035@qq.com"
send_resolved: true
# 添加此行,定制邮件的标题,对于"{{}}"属性用于加载其他信息,需要使用单引号括住。
headers: { Subject: "[WARN] 报警邮件" }
# 添加此行,调用模板显式邮件正文,对于"{}"不需要使用单引号,否则服务启动不成功。
html: '{{ template "oldboyedu.html" . }}'
...
[root@prometheus-server33 alertmanager]#
4.语法检查
[root@prometheus-server33 alertmanager]# pwd
/oldboyedu/softwares/alertmanager
[root@prometheus-server33 alertmanager]#
[root@prometheus-server33 alertmanager]# ./amtool check-config /oldboyedu/softwares/alertmanager/alertmanager.yml
Checking '/oldboyedu/softwares/alertmanager/alertmanager.yml' SUCCESS
Found:
- global config
- route
- 1 inhibit rules
- 1 receivers
- 1 templates
SUCCESS
[root@prometheus-server33 alertmanager]#
5.重新加载配置信息
[root@prometheus-server33 alertmanager]# systemctl reload alertmanager.service
6.查看WebUi观察配置是否生效
http://10.0.0.33:9093/#/status
7.上面我们定制邮件内容中包含阈值的部分,而我们在规则中并没有指定,所以prometheus需要修改以下规则文件。
7.1 修改规则文件
[root@prometheus-server31 ~]# cat /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml
groups:
- name: oldboyedu-linux89-container-runtime
rules:
- alert: yinzhengjie_golang_custom_metrics-41节点挂掉啦
expr: up{instance="10.0.0.41:18080", job="yinzhengjie_golang_custom_metrics"} == 0
for: 15s
labels:
school: oldboyedu
class: linux89
annotations:
summary: "{{ .instance }} 已停止运行超过 15s!"
# 这里注释部分增加了一个value的属性信息,会从Prometheus的默认信息中获取阈值
value: "{{ $value }}"
- alert: yinzhengjie_python_custom_metrics-42节点的联邦模式挂掉啦
expr: up{instance="10.0.0.42:8000", job="yinzhengjie_python_custom_metrics"} == 0
for: 15s
labels:
school: oldboyedu
class: linux89
annotations:
summary: "{{ .instance }} 已停止运行超过 15s!"
# 这里注释部分增加了一个value的属性信息,会从Prometheus的默认信息中获取阈值
value: "{{ $value }}"
[root@prometheus-server31 ~]#
7.2 检查语法
[root@prometheus-server31 ~]# cd /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]#
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# ./promtool check rules rules/oldboyedu-linux89-rules.yaml
Checking rules/oldboyedu-linux89-rules.yaml
SUCCESS: 2 rules found
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]#
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 1 rule files found
SUCCESS: prometheus.yml is valid prometheus config file syntax
Checking /oldboyedu/softwares/prometheus-2.45.3.linux-amd64/rules/oldboyedu-linux89-rules.yaml
SUCCESS: 2 rules found
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]#
7.3 重新加载配置文件
[root@prometheus-server31 prometheus-2.45.3.linux-amd64]# curl -X POST http://10.0.0.31:9090/-/reload
监控k8s集群
1. serviceMonitor服务发现原理
二.ServiceMonitor配置解析
1.什么是ServiceMonitor
传统的部署方式基于"prometheus.yml"配置文件来监控被目标,但是随着监控目标的增多,我们的配置文件就会变得很冗余,可读性就会变差。
于是就有了各种服务发现来减少"prometheus.yml"配置文件的配置,比如: "file_sd_config,consul_sd_config,kubernetes_sd_config,..."等配置。
而"Kube-Prometheus Stack"别具一格,采用了一种名为"ServiceMonitor"的自定义资源进行配置。
如上图所示,这个"ServiceMonitor"自定义资源基于标签来关联services资源,而services资源的ep列表会自动发现关联后端的Pod,然后在自动生成对应的"prometheus.yml"配置文件相匹配的代码块。
说白了,"ServiceMonitor"就是用来配置监控目标的,Prometheus可以识别这些配置并自动将其转换为"prometheus.yml"能识别的配置代码块。
2. prometheus-operator
- 在K8S集群部署kube-prometheus stack
1 基于K8S版本选择合适的prometheus-operator
参考地址:
https://github.com/prometheus-operator/kube-prometheus?tab=readme-ov-file#compatibility
2 下载软件包
wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.11.0.tar.gz
3 解压软件包
tar xf kube-prometheus-0.11.0.tar.gz -C
4 切换工作目录,进入到prometheus-operator主目录
cd kube-prometheus-0.11.0/
5 安装自定义资源
5.1 下载镜像并修改文件
温馨提示:
如果镜像下载失败,所有工作节点可以如下措施:
docker pull registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/prometheus-adapter:v0.9.1
docker tag registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/prometheus-adapter:v0.9.1 k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1
docker pull registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/kube-state-metrics:2.5.0
docker tag registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/kube-state-metrics:2.5.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0
或者修改资源清单,执行如下操作:
[root@master231 kube-prometheus-0.11.0]# vim manifests/prometheusAdapter-deployment.yaml
......
# image: k8s.gcr.io/prometheus-adapter/prometheus-adapter:v0.9.1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/prometheus-adapter:v0.9.1
...
[root@master231 kube-prometheus-0.11.0]# vim manifests/kubeStateMetrics-deployment.yaml
...
# image: k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/kube-state-metrics:2.5.0
[root@master231 kube-prometheus-0.11.0]# vim manifests/grafana-service.yaml
....
spec:
type: NodePort
ports:
- name: http
port: 3000
targetPort: http
nodePort: 30070
[root@master231 kube-prometheus-0.11.0]# vim manifests/alertmanager-service.yaml
...
spec:
type: NodePort
ports:
- name: web
port: 9093
targetPort: web
nodePort: 30080
...
[root@master231 kube-prometheus-0.11.0]# vim manifests/prometheus-service.yaml
....
spec:
type: NodePort
ports:
- name: web
port: 9090
targetPort: web
nodePort: 30090
5.2 部署服务
kubectl apply --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
kubectl apply -f manifests/
5.3 验证服务
[root@master231 05-kube-prometheus-stack]# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 23s
alertmanager-main-1 2/2 Running 0 31s
alertmanager-main-2 2/2 Running 0 35s
blackbox-exporter-746c64fd88-mm684 3/3 Running 0 80m
grafana-5fc7f9f55d-qtvvt 1/1 Running 0 80m
kube-state-metrics-5c5cfbf465-4rmgz 3/3 Running 0 4m26s
node-exporter-56fst 2/2 Running 0 80m
node-exporter-jxv5f 2/2 Running 0 80m
node-exporter-tb578 2/2 Running 0 80m
prometheus-adapter-5b479bc754-6ggqn 1/1 Running 0 80m
prometheus-adapter-5b479bc754-hgc4n 1/1 Running 0 4m25s
prometheus-k8s-0 2/2 Running 0 20s
prometheus-k8s-1 2/2 Running 0 10m
prometheus-operator-f59c8b954-wcfwb 2/2 Running 0 4m26s
[root@master231 05-kube-prometheus-stack]#
[root@master231 kube-prometheus-0.11.0]# kubectl get svc -A | grep 30070
monitoring grafana NodePort 10.200.21.213 <none> 3000:30070/TCP 14m
[root@master231 kube-prometheus-0.11.0]#
[root@master231 kube-prometheus-0.11.0]# kubectl get svc -A | grep 30080
monitoring alertmanager-main NodePort 10.200.231.77 <none> 9093:30080/TCP,8080:38123/TCP 15m
[root@master231 kube-prometheus-0.11.0]#
[root@master231 kube-prometheus-0.11.0]# kubectl get svc -A | grep 30090
monitoring prometheus-k8s NodePort 10.200.53.208 <none> 9090:30090/TCP,8080:20511/TCP 15m
[root@master231 kube-prometheus-0.11.0]#
6.访问测试
http://10.0.0.233:30070/
http://10.0.0.233:30080/
http://10.0.0.233:30090/
7.温馨提示:如下频繁重启,可以考虑如下配置
[root@master231 05-kube-prometheus-stack]# vim kube-prometheus-0.11.0/manifests/alertmanager-alertmanager.yaml
...
spec:
image: quay.io/prometheus/alertmanager:v0.24.0
...
replicas: 1
[root@master231 05-kube-prometheus-stack]# kubectl replace -f kube-prometheus-0.11.0/manifests/alertmanager-alertmanager.yaml
alertmanager.monitoring.coreos.com/main replaced
[root@master231 05-kube-prometheus-stack]#
[root@master231 05-kube-prometheus-stack]# vim kube-prometheus-0.11.0/manifests/prometheus-prometheus.yaml
...
spec:
...
image: quay.io/prometheus/prometheus:v2.36.1
...
replicas: 1
...
[root@master231 05-kube-prometheus-stack]# kubectl apply -f kube-prometheus-0.11.0/manifests/prometheus-prometheus.yaml
prometheus.monitoring.coreos.com/k8s configured
[root@master231 05-kube-prometheus-stack]#
[root@master231 05-kube-prometheus-stack]# kubectl get pods -o wide -n monitoring
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
alertmanager-main-0 2/2 Running 0 4m36s 10.100.2.18 worker233 <none> <none>
blackbox-exporter-746c64fd88-mm684 3/3 Running 0 86m 10.100.1.254 worker232 <none> <none>
grafana-5fc7f9f55d-qtvvt 1/1 Running 0 86m 10.100.1.2 worker232 <none> <none>
kube-state-metrics-5c5cfbf465-4rmgz 3/3 Running 0 10m 10.100.1.171 worker232 <none> <none>
node-exporter-56fst 2/2 Running 0 86m 10.0.0.231 master231 <none> <none>
node-exporter-jxv5f 2/2 Running 0 86m 10.0.0.233 worker233 <none> <none>
node-exporter-tb578 2/2 Running 0 86m 10.0.0.232 worker232 <none> <none>
prometheus-adapter-5b479bc754-6ggqn 1/1 Running 0 86m 10.100.1.3 worker232 <none> <none>
prometheus-adapter-5b479bc754-hgc4n 1/1 Running 0 10m 10.100.1.167 worker232 <none> <none>
prometheus-k8s-0 2/2 Running 0 6m15s 10.100.2.17 worker233 <none> <none>
prometheus-operator-f59c8b954-wcfwb 2/2 Running 0 10m 10.100.1.168 worker232 <none> <none>
[root@master231 05-kube-prometheus-stack]#
3. 监控hpa伸缩状态
如果你只想使用 Prometheus 监控 HPA 的伸缩状态,而不进行 HPA 和 Prometheus 的集成,可以通过 PromQL 查询 HPA 相关的指标。以下是一些基本的 PromQL 示例,可以帮助你监控 HPA 的状态和伸缩情况:
1. 监控 HPA 当前副本数
要监控 HPA 当前的副本数,可以使用以下查询:
kubectl:horizontalpodautoscaler:current_replicas:sum{namespace="<your-namespace>", name="<your-hpa-name>"}
2. 监控 HPA 目标副本数
要监控 HPA 目标的副本数,可以使用以下查询:
kubectl:horizontalpodautoscaler:desired_replicas:sum{namespace="<your-namespace>", name="<your-hpa-name>"}
3. 监控 HPA 的指标(如 CPU 使用率)
如果 HPA 根据 CPU 使用率进行伸缩,可以查询 CPU 使用率:
sum(rate(container_cpu_usage_seconds_total{namespace="<your-namespace>", pod=~"<your-pod-name>.*"}[5m])) by (pod)
4. 监控 HPA 触发的事件
你还可以监控 HPA 触发的事件(如扩展或收缩),虽然这些通常不是通过 PromQL 直接获取的,但可以通过 Kubernetes 事件来监控。
5. 将 HPA 状态可视化
将以上 PromQL 查询添加到你的监控仪表盘(如 Grafana)中,以便可视化 HPA 的状态和性能。这将帮助你实时了解 HPA 的行为和集群的负载状况。
示例 Grafana 配置
在 Grafana 中,你可以创建一个新面板并将以下 PromQL 查询作为数据源,设置适当的图表类型(如时间序列图或单值面板)来显示 HPA 的当前副本数和目标副本数。
通过这些 PromQL 查询,你可以有效监控 HPA 的伸缩状态,而无需将 Prometheus 与 HPA 集成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」