06、基于Alertmanager发送报警到多个接收方(下)

目录

一、promethues 采集 tomcat 监控数据

1、 1制作tomcat镜像;

1、 2基于上面的镜像创建一个tomcat实例;

1、 3采集数据;

二、promethues 采集 redis 监控数据

2、 1配置一个Redis的exporter;

2、 2查看Prometheus;

2、 3grafana导入模板;

三、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、 5grafana界面导入nginx监控模板;

五、prometheus 监控 mongodb

5、 1下载mongodb和mongodb_exporter镜像;

5、 2启动mongodb;

5、 3启动mongo_exporter;

5、 4修改prometheus-alertmanager-cfg.yaml文件;

六、Pushgateway

6、 1Pushgateway简介;

6、 2Pushgateway优点;

6、 3Pushgateway缺点;

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博客

下一篇文章:【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(上)_Stars.Sky的博客-CSDN博客