目录
一、promethues 采集 tomcat 监控数据
1.1 制作 tomcat 镜像
1.2 基于上面的镜像创建一个 tomcat 实例
1.3 采集数据
二、promethues 采集 redis 监控数据
2.1 配置一个 Redis 的 exporter
2.2 查看 Prometheus
2.3 grafana 导入模板
三、Prometheus 监控 mysql
3.1 安装 mysql
3.2 安装 mysql_exporter
3.3 登陆 mysql 为 mysql_exporter 创建账号并授权
3.4 创建 mysql 配置文件,运行时可免密码连接数据库
3.5 启动 mysql_exporter 客户端
3.6 修改 prometheus-alertmanager-cfg.yaml 文件
3.7 访问 Prometheus
四、Prometheus 监控 Nginx
4.1 下载 nginx-module-vts 编译模块
4.2 安装 nginx
4.3 安装 nginx-vts-exporter
4.4 修改 prometheus-alertmanager-cfg.yaml 文件
4.5 grafana 界面导入 nginx 监控模板
五、prometheus 监控 mongodb
5.1 下载 mongodb 和 mongodb_exporter 镜像
5.2 启动 mongodb
5.3 启动 mongo_exporter
5.4 修改 prometheus-alertmanager-cfg.yaml 文件
六、Pushgateway
6.1 Pushgateway 简介
6.2 Pushgateway 优点
6.3 Pushgateway 缺点
6.4 安装 Pushgateway
6.5 修改 prometheus-alertmanager-cfg.yaml 文件
6.6 测试推送数据到 pushgateway
6.7 把数据上报到 pushgateway
本篇文章所用到的资料文件下载地址:Prometheus常规服务-kubernetes文档类资源-CSDN下载
一、promethues 采集 tomcat 监控数据
tomcat_exporter 项目地址:GitHub - nlighten/tomcat_exporter: A Prometheus exporter for Apache Tomcat
把上面这几个文件上传到控制节点 master
[root@k8s-master1 tomcat]# pwd
/root/prometheus/tomcat
[root@k8s-master1 tomcat]# ls
metrics.war simpleclient_common-0.8.0.jar simpleclient_servlet-0.8.0.jar tomcat_exporter_servlet-0.0.12.war
simpleclient-0.8.0.jar simpleclient_hotspot-0.8.0.jar tomcat_exporter_client-0.0.12.jar
1.1 制作 tomcat 镜像
[root@k8s-master1 tomcat]# vim Dockerfile
FROM tomcat:8.5-jdk8-corretto
ADD metrics.war /usr/local/tomcat/webapps/
ADD simpleclient-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_common-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_hotspot-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_servlet-0.8.0.jar /usr/local/tomcat/lib/
ADD tomcat_exporter_client-0.0.12.jar /usr/local/tomcat/lib/
# 构建镜像
[root@k8s-master1 tomcat]# docker build -t='k8s/tomcat_prometheus:v1' .
# 打包镜像
[root@k8s-master1 tomcat]# docker save -o tomcat_exporter.tar.gz k8s/tomcat_prometheus:v1
# 传输到 node1、node2 节点
[root@k8s-master1 tomcat]# scp tomcat_exporter.tar.gz root@192.168.78.144:/root
[root@k8s-master1 tomcat]# scp tomcat_exporter.tar.gz root@192.168.78.145:/root
# 在工作节点解压
[root@k8s-node1 ~]# docker load -i tomcat_exporter.tar.gz
[root@k8s-node2 ~]# docker load -i tomcat_exporter.tar.gz
1.2 基于上面的镜像创建一个 tomcat 实例
[root@k8s-master1 tomcat]# vim deploy-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
namespace: default
spec:
selector:
matchLabels:
app: tomcat
replicas: 2
template:
metadata:
labels:
app: tomcat
annotations:
prometheus.io/scrape: 'true'
spec:
containers:
- name: tomcat
image: k8s/tomcat_prometheus:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
securityContext:
privileged: true
[root@k8s-master1 tomcat]# kubectl apply -f deploy-tomcat.yaml
[root@k8s-master1 tomcat]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-deployment-b8cdddf47-828fg 1/1 Running 0 12s 10.244.169.147 k8s-node2 <none> <none>
tomcat-deployment-b8cdddf47-g5485 1/1 Running 0 12s 10.244.36.86 k8s-node1 <none> <none>
1.3 采集数据
[root@k8s-master1 tomcat]# kubectl get pods -n monitor-sa
NAME READY STATUS RESTARTS AGE
node-exporter-98zvk 1/1 Running 6 (22h ago) 2d23h
node-exporter-9qb2g 1/1 Running 6 (22h ago) 2d23h
node-exporter-t7q4g 1/1 Running 6 (22h ago) 2d23h
prometheus-server-bf4569646-plh6p 2/2 Running 2 (22h ago) 24h
# 动态修改 Prometheus
[root@k8s-master1 tomcat]# kubectl edit pods -n monitor-sa prometheus-server-bf4569646-plh6p
······
apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/podIP: 10.244.36.82/32
cni.projectcalico.org/podIPs: 10.244.36.82/32
prometheus.io/scrape: "true" # 把 false 改为 true,表示允许被 Prometheus 抓取数据
······
在 promethues 上可以看到监控到的 tomcat 的两个 pod:
二、promethues 采集 redis 监控数据
2.1 配置一个 Redis 的 exporter
我们通过 redis 进行暴露监控:
[root@k8s-master1 redis]# pwd
/root/prometheus/redis
[root@k8s-master1 redis]# vim redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:4
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
- name: redis-exporter
image: oliver006/redis_exporter:latest
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 9121
---
kind: Service
apiVersion: v1
metadata:
name: redis
namespace: kube-system
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9121"
spec:
selector:
app: redis
ports:
- name: redis
port: 6379
targetPort: 6379
- name: prom
port: 9121
targetPort: 9121
[root@k8s-master1 redis]# kubectl apply -f redis.yaml
[root@k8s-master1 redis]# kubectl get pods -n kube-system | grep redis
redis-bd78c4cb5-6gbqb 2/2 Running 0 70s
redis 这个 Pod 中包含了两个容器,一个就是 redis 本身的主应用,另外一个容器就是redis_exporter;由于 Redis 服务的 metrics 接口在 redis-exporter 9121 上,所以我们添加了prometheus.io/port=9121 这样的 annotation 在 prometheus 就会自动发现 redis 了。
2.2 查看 Prometheus
已经监控到 redis:
2.3 grafana 导入模板
在 grafana 导入 redis 的 json 文件:Redis Cluster-1571393212519.json,监控界面如下:
三、Prometheus 监控 mysql
3.1 安装 mysql
方式一:
[root@k8s-master1 mysql]# pwd
/root/prometheus/mysql
[root@k8s-master1 mysql]# yum install -y mysql mariadb
[root@k8s-master1 mysql]# systemctl start mariadb
我 yum 安装 mysql 不成功,启动不起来,故使用方式二!
方式二:
可以查看我的这篇文章:CentOS 7 安装&卸载 MySQL 8 详细图文教程_Stars.Sky的博客-CSDN博客_centos7卸载mysql8
3.2 安装 mysql_exporter
# 上传 mysqld_exporter-0.10.0.linux-amd64.tar.gz 文件
[root@k8s-master1 mysql]# ls
mysqld_exporter-0.10.0.linux-amd64.tar.gz
[root@k8s-master1 mysql]# tar -zxvf mysqld_exporter-0.10.0.linux-amd64.tar.gz
[root@k8s-master1 mysql]# cd mysqld_exporter-0.10.0.linux-amd64/
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# cp -ar mysqld_exporter /usr/local/bin/
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# chmod +x /usr/local/bin/mysqld_exporter
3.3 登陆 mysql 为 mysql_exporter 创建账号并授权
[root@k8s-master1 mysql]# mysql -uroot -p
# 创建数据库用户
mysql> CREATE USER 'mysql_exporter'@'localhost' IDENTIFIED BY 'Abcdef123!.';
Query OK, 0 rows affected (0.01 sec)
# 对 mysql_exporter 用户授权
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'localhost';
Query OK, 0 rows affected (0.01 sec)
# exit 退出mysql
mysql> exit
Bye
3.4 创建 mysql 配置文件,运行时可免密码连接数据库
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# pwd
/root/prometheus/mysql/mysqld_exporter-0.10.0.linux-amd64
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# vim my.cnf
[client]
user=mysql_exporter
password=Abcdef123!.
3.5 启动 mysql_exporter 客户端
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# nohup ./mysqld_exporter --config.my-cnf=./my.cnf &
# mysqld_exporter 的监听端口是 9104
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# tail nohup.out
time="2023-01-16T11:09:07+08:00" level=info msg="Starting mysqld_exporter (version=0.10.0, branch=master, revision=80680068f15474f87847c8ee8f18a2939a26196a)" source="mysqld_exporter.go:460"
time="2023-01-16T11:09:07+08:00" level=info msg="Build context (go=go1.8.1, user=root@3b0154cd9e8e, date=20170425-11:24:12)" source="mysqld_exporter.go:461"
time="2023-01-16T11:09:07+08:00" level=error msg="Error pinging mysqld: this authentication plugin is not supported" source="mysqld_exporter.go:268"
time="2023-01-16T11:09:07+08:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:479"
3.6 修改 prometheus-alertmanager-cfg.yaml 文件
[root@k8s-master1 prometheus]# pwd
/root/prometheus
# 添加如下内容
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······
- job_name: 'mysql'
static_configs:
- targets: ['192.168.78.143:9104'] # 安装 mysql 的 节点 ip
rules.yml: |
groups:
- name: example
······
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml
[root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
3.7 访问 Prometheus
四、Prometheus 监控 Nginx
4.1 下载 nginx-module-vts 编译模块
# 把 nginx-module-vts-master.zip 上传到 master 节点
[root@k8s-master1 nginx]# pwd
/root/prometheus/nginx
[root@k8s-master1 nginx]# ls
nginx-module-vts-master.zip
[root@k8s-master1 nginx]# unzip nginx-module-vts-master.zip
[root@k8s-master1 nginx]# mv nginx-module-vts-master /usr/local/
4.2 安装 nginx
# 上传 nginx-1.15.7.tar.gz 安装包
[root@k8s-master1 nginx]# tar -zxvf nginx-1.15.7.tar.gz
[root@k8s-master1 nginx]# cd nginx-1.15.7/
[root@k8s-master1 nginx-1.15.7]# ./configure --prefix=/usr/local/nginx --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-file-aio --with-http_realip_module --add-module=/usr/local/nginx-module-vts-master
[root@k8s-master1 nginx-1.15.7]# make && make install
# 修改 nginx 配置文件
[root@k8s-master1 nginx-1.15.7]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
vhost_traffic_status_zone;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
# 测试 nginx 配置文件是否正确
[root@k8s-master1 nginx-1.15.7]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# 启动 nginx
[root@k8s-master1 nginx-1.15.7]# /usr/local/nginx/sbin/nginx
访问 http://192.168.78.143/status 可以看到 nginx 监控数据:
4.3 安装 nginx-vts-exporter
GitHub 项目地址:GitHub - hnlq715/nginx-vts-exporter: Simple server that scrapes Nginx vts stats and exports them via HTTP for Prometheus consumption
# 上传 nginx-module-vts-master.zip 文件
[root@k8s-master1 nginx]# pwd
/root/prometheus/nginx
[root@k8s-master1 nginx]# ls
nginx-1.15.7 nginx-1.15.7.tar.gz nginx-module-vts-master.zip nginx-vts-exporter-0.5.zip
[root@k8s-master1 nginx]# unzip nginx-vts-exporter-0.5.zip
[root@k8s-master1 nginx]# mv nginx-vts-exporter-0.5 /usr/local/
[root@k8s-master1 nginx]# chmod +x /usr/local/nginx-vts-exporter-0.5/bin/nginx-vts-exporter
[root@k8s-master1 nginx]# cd /usr/local/nginx-vts-exporter-0.5/bin/
[root@k8s-master1 bin]# nohup ./nginx-vts-exporter -nginx.scrape_uri http://192.168.78.143/status/format/json &
注意:http://192.168.78.143/status/format/json 这个地方的 ip 地址是 nginx 的 IP 地址;nginx-vts-exporter 的监听端口是 9913。
4.4 修改 prometheus-alertmanager-cfg.yaml 文件
# 添加如下 job
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······
- job_name: 'nginx'
scrape_interval: 5s
static_configs:
- targets: ['192.168.78.143:9913']
······
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml
[root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
注意: - targets: ['192.168.124.16:9913'] 这个 ip 地址是 nginx-vts-exporter 程序所在机器的 ip 地址。
4.5 grafana 界面导入 nginx 监控模板
查看 Prometheus
在 grafana 导入 nginx-vts-stats_rev2.json 模板
五、prometheus 监控 mongodb
5.1 下载 mongodb 和 mongodb_exporter 镜像
[root@k8s-master1 mongodb]# docker pull mongo
[root@k8s-master1 mongodb]# docker pull percona/mongodb_exporter:0.34.0
5.2 启动 mongodb
[root@k8s-master1 mongodb]# pwd
/root/prometheus/mongodb
[root@k8s-master1 mongodb]# docker run -d --name mongodb -p 27017:27017 -v /root/prometheus/mongodb:/data/db mongo
# 创建 mongo 账号密码,给 mongodb_exporter 连接 mongo 用
# 登录到容器
[root@k8s-master1 mongodb]# docker exec -it 6c1168199b09 mongo admin
# 设置密码
> use admin
> db.createUser({ user: 'admin', pwd: 'admin111111', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
> exit
5.3 启动 mongo_exporter
[root@k8s-master1 mongodb]# docker run -d --name mongodb_exporter -p 30056:9216 percona/mongodb_exporter:0.34.0 --mongodb.uri mongodb://admin:admin111111@192.168.78.143:27017
注:admin:admin111111 这个就是上面启动 mongodb 后设置的密码,@ 后面接 mongodb 的 ip 和端口。
5.4 修改 prometheus-alertmanager-cfg.yaml 文件
# 添加一个 job_name
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······
- job_name: 'mongodb'
scrape_interval: 5s
static_configs:
- targets: ['192.168.78.143:30056']
······
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml
[root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
访问 Prometheus:
六、Pushgateway
6.1 Pushgateway 简介
Pushgateway 是 prometheus 的一个组件,prometheus server 默认是通过 exporter 主动获取数据(默认采取 pull 拉取数据),pushgateway 则是通过被动方式推送数据到 prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给 pushgateway, 然后pushgateway 再把数据发送给 Prometheus server。
6.2 Pushgateway 优点
Prometheus 默认采用定时 pull 模式拉取 targets 数据,但是如果不在一个子网或者防火墙,prometheus 就拉取不到 targets 数据,所以可以采用各个 target 往 pushgateway 上 push 数据,然后 prometheus 去 pushgateway 上定时 pull 数据。
在监控业务数据的时候,需要将不同数据汇总, 汇总之后的数据可以由 pushgateway 统一收集,然后由 Prometheus 统一拉取。
6.3 Pushgateway 缺点
- Prometheus 拉取状态只针对 pushgateway,不能对每个节点都有效;
- Pushgateway 出现问题,整个采集到的数据都会出现问题;
- 监控下线,prometheus 还会拉取到旧的监控数据,需要手动清理 pushgateway不要的数据。
6.4 安装 Pushgateway
# 安装 pushgateway
[root@k8s-master1 prometheus]# docker pull prom/pushgateway
# 启动容器
[root@k8s-master1 prometheus]# docker run -d --name pushgateway -p 9091:9091 prom/pushgateway
在浏览器访问 192.168.78.143:9091 出现如下 ui 界面:
6.5 修改 prometheus-alertmanager-cfg.yaml 文件
# 添加如下 job
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······
- job_name: 'pushgateway'
scrape_interval: 5s
static_configs:
- targets: ['192.168.78.143:9091']
honor_labels: true
······
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml
[root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml
[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
在 prometheus 的 targets 列表可以看到 pushgateway:
6.6 测试推送数据到 pushgateway
# 向 {job="test_job"} 添加单条数据
[root@k8s-master1 prometheus]# echo "metric 3.6" | curl --data-binary @- http://192.168.78.143:9091/metrics/job/test_job
注:--data-binary 表示发送二进制数据,它是使用 POST 方式发送的!
查看 pushgateway,这三个指标都可以在 Prometheus 看到:
# 添加复杂数据
cat <<EOF | curl --data-binary @- http://192.168.78.143:9091/metrics/job/test_job/instance/test_instance
#TYPE node_memory_usage gauge
node_memory_usage 36
# TYPE memory_total gauge
node_memory_total 36000
EOF
# 删除某个组下某个实例的所有数据
curl -X DELETE http://192.168.78.143:9091/metrics/job/test_job/instance/test_instance
# 删除某个组下的所有数据
curl -X DELETE http://192.168.78.143:9091/metrics/job/test_job
6.7 把数据上报到 pushgateway
在被监控服务所在的机器配置数据上报,想要把 192.168.78.143 这个机器的内存数据上报到pushgateway,下面步骤需要在 192.168.78.143 操作:
# 编写脚本
[root@k8s-master1 prometheus]# vim push.sh
#!/bin/bash
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.78.143"
cat <<EOF | curl --data-binary @- http://192.168.78.143:9091/metrics/job/$job_name/instance/$instance_name
#TYPE node_memory_usages gauge
node_memory_usages $node_memory_usages
EOF
# 设置计划任务,定时上报数据
[root@k8s-master1 prometheus]# chmod +x push.sh
[root@k8s-master1 prometheus]# crontab -e
*/1 * * * * /usr/bin/bash /root/prometheus/push.sh
打开 pushgateway web ui 界面,可看到如下:
注意:从上面配置可以看到,我们上传到 pushgateway 中的数据有 job 也有 instance,而prometheus 配置 pushgateway 这个 job_name 中也有 job 和 instance。这个 job 和 instance 是指pushgateway 实例本身,添加 honor_labels: true 参数,可以避免 promethues 的 targets 列表中的 job_name 是 pushgateway 的 job 、instance 和上报到 pushgateway 数据的 job 和 instance 冲突。
上一篇文章:【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(上)_Stars.Sky的博客-CSDN博客