【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(下)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s

“【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(下)” 的相关文章