目录

0. 涉及工具

1. 准备镜像

2. K8S容器化部署

2.1 编写yaml文件

2.2 K8S加载

2.3 修改部分内容

2.3.1 检查vts模块

2.3.2 修改Nginx配置

2.3.3 检查Nginx

2.3.4 验证exporter

3. 配置Prometheus

4. 配置Grafana

5. 传统的Prometheus监控Nginx


使用Nginx-vtx-exporter在Prometheus里监控Nginx,网上多数文章都用的编译源码方式部署。

本文采用容器方式在K8S环境里部署,最详细步骤一步一步带着读者配置。

0. 涉及工具

  • nginx-module-vts:Nginx virtual host traffic status module,Nginx的监控模块,能够提供JSON格式的数据产出。
  • nginx-vts-exporter:Simple server that scrapes Nginx vts stats and exports them via HTTP for Prometheus consumption。主要用于收集Nginx的监控数据,并给Prometheus提供监控接口,默认端口号9913。
  • Prometheus:监控Nginx-vts-exporter提供的Nginx数据,并存储在时序数据库中,可以使用PromQL对时序数据进行查询和聚合。

环境说明:本人测试环境K8S、Prometheus、Grafana均在不同主机上,且Prometheus、Grafana不是容器化部署。

1. 准备镜像

既然是容器化部署,直接找带vts模块的Nginx,可以用 https://hub.docker.com/r/skyscrapers/nginx

再找vts-exporter,可以用 https://hub.docker.com/r/arquivei/nginx-vts

docker pull下来,搞到docker harber里,待用。

2. K8S容器化部署

2.1 编写yaml文件

2.1.1 Nginx-vts.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-withvts0422
  namespace: zhongxin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-withvts0422
  template:
    metadata:
      labels:
        app: nginx-withvts0422
    spec:
      containers:
      - name: nginx-withvts
        image: 172.21.9.35:30002/si-tech/skyscrapers/nginx
        ports:
        - containerPort: 80

2.1.2 Nginx-vts-service.yml

apiVersion: v1
kind: Service
metadata:
  name: nginxvts-service0422
  namespace: zhongxin
  labels:
    app: nginx-withvts0422
spec:
  type: NodePort
  selector:
    app: nginx-withvts0422
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32500

2.1.3  exporter-vts.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: exporter-vts0422
  namespace: zhongxin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: exporter-vts0422
  template:
    metadata:
      labels:
        app: exporter-vts0422
    spec:
      containers:
        - name: exporter-vts
          image: 172.21.9.35:30002/si-tech/nginx-vts-exporter:latest
          command: ["/bin/sh", "-c", "--"]
          args: ["nginx-vts-exporter -nginx.scrape_uri=http://100.101.253.136/status/format/json"]

注:args部分本人因为K8S水平有限,采取了hard-code,恳请批评指正! 

2.1.4 exporter-vts-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: export-vts-service0422
  namespace: zhongxin
  labels:
    app: exporter-vts0422
spec:
  type: NodePort
  selector:
    app: exporter-vts0422
  ports:
  - protocol: TCP
    port: 9913
    targetPort: 9913
    nodePort: 32600

2.2 K8S加载

执行命令:

kubectl apply -f Nginx-vts.yml
kubectl apply -f Nginx-vts-service.yml
kubectl apply -f exporter-vts.yaml
kubectl apply -f exporter-vts-service.yaml

检查结果:

kubectl get pods -n zhongxin 
kubectl get service -n zhongxin

可以看到创建的pod和service,说明创建成功。

2.3 修改部分内容

2.3.1 检查vts模块

kubectl -it exec nginx-withvts0422-74658c884f-6fc6f -n zhongxin -- /bin/sh

进入pod内部

执行命令: nginx -V 
# 结果里 找 --add-module=/usr/src/nginx-module-vts 如果有,则装了vts模块

2.3.2 修改Nginx配置

在容器内部:

vi /etc/nginx/ngnix.conf

## http { } 内添加如下内容:
    vhost_traffic_status_zone;                                     
    vhost_traffic_status_filter_by_host on;                                  
    server {                                                     
        location /status {                                                   
             vhost_traffic_status_display;                       
             vhost_traffic_status_display_format html;             
        }                                             
        location / {                            
            root /usr/share/nginx/html;               
            index index.html index.htm;               
        }                                  
    }

注:作者当前K8S不熟练,否则可以直接改docker file或者自己做一个image 

随后执行

/ # /usr/sbin/nginx -s reload
2022/04/24 07:07:53 [notice] 116#116: signal process started

2.3.3 检查Nginx

2.3.3.1 验证Nignx-vts

访问Nginx: http://hostIP:32500/

nginx Remote Address 暴露 nginx exporter_docker

// 中间那段 hahahha 是作者自己加上去的测试...

2.3.3.2 验证vts

访问status: http://hostIP:32500/status

nginx Remote Address 暴露 nginx exporter_kubernetes_02

至此,Nginx-vts验证完毕。

2.3.4 验证exporter

访问metrics: http://hostIP:32600/metrics

nginx Remote Address 暴露 nginx exporter_Nginx_03

出现上面所示结果(部分展示,实际很长,篇幅有限)

至此,Nginx-vts-exporter容器、服务部署正常。

3. 配置Prometheus

3.1 编辑配置

进入Prometheus所在主机,编辑Prometheus.yml文件,

加入如下:

- job_name: 'nginx-vts'
    static_configs:
      - targets: ["172.21.6.22:32600"]

3.2 验证结果:

3.2.1 命令行验证:

# ./promtool check config prometheus.yml

 出现类似如下结果,说明配置无误,可以重启Prometheus
Checking prometheus.yml
  SUCCESS: 0 rule files found

3.2.2 网页端验证:

nginx Remote Address 暴露 nginx exporter_kubernetes_04

 至此,Prometheus部分配置完毕。

4. 配置Grafana

4.1 下载相应json

比如作者用的 2948 的dashboard 

https://grafana.com/api/dashboards/2948/revisions/1/download

4.2 加载 dashboard

nginx Remote Address 暴露 nginx exporter_docker_05

 把刚才下载的2json文件内容直接贴进去

nginx Remote Address 暴露 nginx exporter_容器_06

点击“load”,图形自动加载。

nginx Remote Address 暴露 nginx exporter_kubernetes_07

至此,Grafana配置完毕。记得保存一下Dashboard。  

【完】


5. 传统的Prometheus监控Nginx

Prometheus监控通常需要使用exporter,Nginx的传统方式使用Nginx exporter,默认且常用的

原理:读取 Nginx status;例如:

Active connections: 3

 

server accepts handled requests

 

 8 8 67

 

Reading: 0 Writing: 1 Waiting: 2

解释如下:

指标

含义

server

表示Nginx启动到现在共处理了多少个连接

accepts

表示Nginx启动到现在共成功创建多少次握手

handled requests

表示总共处理了多少次请求

Reading

Nginx 读取到客户端的 Header 信息数

Writing

Nginx 返回给客户端 Header 信息数

Waiting

Nginx 已经处理完正在等候下一次请求指令的驻留链接