基于consul对接prometheus监控docker容器资源

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于consul对接prometheus监控docker容器资源相关的知识,希望对你有一定的参考价值。

部署 cAdvisor

在被监控的Docker节点机器上启动cAdvisor服务,启动方式使用Docker启动:

docker run \\
  --volume=/:/rootfs:ro \\
  --volume=/var/run:/var/run:rw \\
  --volume=/sys:/sys:ro \\
  --volume=/var/lib/docker/:/var/lib/docker:ro \\
  --publish=8080:8080 \\
  --detach=true \\
  --name=cadvisor \\
  google/cadvisor:latest

参数说明:

  • –publish:端口映射,等价于 -p

  • –detach=true:后台运行,等价于 -d

检查服务是否正常启动:docker ps |grep cadvisor

页面访问:http://IP:8080

prometheus 自动发现

感兴趣的同学可以参考Prometheus Operator 通过 consul 实现自动服务发现文章中“ 配置 Prometheus 实现自动服务发现 ”章节。

consul服务

上面步骤中,我们已经完成cadvisor服务部署,我们现在现在使用consul api接口将信息存入 consul 中。

cat > wutf-test-docker-metrics.sh << EOF
#! /bin/bash
## cosul地址填写自己真实的地址,支持http/https
curl --location --request PUT  http://consul.middle:8500/v1/agent/service/register?replace-existing-checks=1 \\
 --header Content-Type: application/json \\
## token填写自己真实的信息
 --header "X-Consul-Token: fe48c9a4-1234-abcd-81df-9f28303012af" \\
 --data 
## 服务器名字
  "ID": "wutf-test",
## prometheus自动发现server name               
  "Name": "consul_exporter",   
  "Tags": [
## prometheus自动发现 tag
    "devops-ci"                  
  ],
## 被监控服务器地址
  "Address": "192.168.1.1", 
## cAdvisor服务监控接口        
  "Port": 8080,
## 自定义标签信息
  "Meta": 
    ## 定义项目信息                      
    "account": "tsp",
    ## 定义服务环境信息,dev/uat/prod
    "group": "dev",
    ## 定义路由报警标签
    "region": "docker-container",
    ## 服务器所在区,园区/公有云
    "vendor": "Newrizon",
    ## grafana看板使用的变量
    "addr": "192.168.1.1"
  ,
  "EnableTagOverride": false,
  "Check": 
## 被监控服务器监控指标获取
    "HTTP": "http://192.168.1.1:8080/metrics",
    "Interval": "10s"
  ,
  "Weights": 
    "Passing": 10,
    "Warning": 1
  

EOF

执行上面脚本:

sh wutf-test-docker-metrics.sh

成功后,我们登入consulconsulmanager即可看到consul_exporter下被监控主机的信息。

Grafana 数据看板

可参考使用docker container & OS node(node_exporter, cadvisor),按照自己实际情况进行更改。

主机部分监控

该主机上 docker 容器监控

告警规则

规则样例consul-docker-container-rules.yaml如下,有需要的同学可以参考下:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    app.kubernetes.io/name: kube-prometheus
    app.kubernetes.io/part-of: kube-prometheus
    prometheus: k8s
    role: alert-rules
  name: consul-docker-container-rules
  namespace: kubesphere-monitoring-system
spec:
  groups:
    - name: docker-container
      rules:
        - alert: ContainerCpuUsage
          expr: (sum by(account, group, region, vendor, instance, name) (rate(container_cpu_usage_seconds_totaljob="consul-endpoints", name=~.+[2m])) * 100) > 90
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: docker容器CPU使用率超过 90% 。
            description: 主机:  $labels.instance  上的 docker 容器  $labels.name  CPU使用率超过了 90%, 当前值:  $value 。

        #容器内存使用率高: 各个容器内存占用各自容器设置最大限制总内存的比例,(容器已经使用的/限制容器的最大使用内存),>90%
        - alert: ContainerMemoryUsage-各容器占用各自最大限制值比例
          expr: (sum(container_memory_working_set_bytesjob=consul-endpoints, name=~.+) by (account, group, region, vendor, instance, name) / sum(container_spec_memory_limit_bytesjob=consul-endpoints, name=~.+) by (account, group, region, vendor, instance, name) * 100 != +Inf)  > 90
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: Container Memory usaged 占用限制容器最大内存值超过了 90% 。
            description: 主机:  $labels.instance  上的 docker 容器  $labels.name   Memory usage占用限制容器最大内存比例超过90%,当前值:  $value 。

        #容器内存使用率高: 所有容器已使用的内存总和占用宿主机总内存的比例,(所有容器已经使用的总和/宿主机的总内存),>80%
        - alert: ContainerMemoryUsageAll-all容器已使用内存总和占用宿主机总内存比例
          expr: sum (container_memory_working_set_bytesjob=consul-endpoints, name=~.+) by(instance)/sum (machine_memory_bytes) by(instance) *100 > 80
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 所有容器内存总和占用宿主机总内存超过 80% 。
            description: 所有容器内存总和占用宿主机 $labels.instance 总内存比例超过了80%, 当前值:  $value 。
        #注意: 只有上面表达式中加入了 by (instance),即by (标签名),下面 $labels.instance  才能调用到相关的某个主机实例的值

        #容器网络入口(接收)流量速率高(单位:字节/秒),每秒网卡接收多少字节数据,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Netowork-receiveRate-各容器网络接收流量速率(流入速率)
          expr: sum(rate(container_network_receive_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, interface)/1024/1024 > 100
          #上面也可使用类似表达式: sum(rate(container_network_receive_bytes_totalimage!=""[1m])) without (interface)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器入口(接收)流量过高。
            description: "容器名 $labels.name  的网卡接口 $labels.interface 在实例主机 $labels.instance  每秒入口流量过高,大于100M,当前值为: $value M "

        #容器网络出口(传输)流量速率高(单位:字节/秒),每秒网卡流出(传输)多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Netowork-trasmitRate-各容器网络传输流量速率(流出速率)
          expr: sum(rate(container_network_transmit_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, interface)/1024/1024  > 100
          #上面也可使用类似表达式: sum(rate(container_network_transmit_bytes_totalimage!=“”[1m])) without (interface)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器出口(传输)流量过高。
            description: "容器名 $labels.name  的网卡接口 $labels.interface 在实例主机 $labels.instance  每秒出口(传输)流量过高,大于100M,当前值为: $value M。 "

        #容器文件系统磁盘读取速率高(单位:字节/秒),每秒读取多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Disk-Read-Rate-各容器文件系统磁盘读取速率
          expr: sum(rate(container_fs_reads_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, device)/1024/1024 > 50
          #上面也可使用类似表达式: sum(rate(container_fs_reads_bytes_totalimage!=""[2m])) without (device)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器文件系统磁盘读取速率过高。
            description: "容器名 $labels.name  的磁盘分区 $labels.device 在实例主机 $labels.instance  每秒读取速率过高,大于50M,当前值为: $value M "

        #容器文件系统磁盘写入速率高(单位:字节/秒),每秒写入多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值
        - alert: Disk-Write-Rate-各容器文件系统磁盘写入速率
          expr: sum(rate(container_fs_writes_bytes_totaljob="consul-endpoints", image!=""[2m])) by (account, group, region, vendor, instance, name, device)/1024/1024 > 50
          #上面也可使用类似表达式: sum(rate(container_fs_writes_bytes_totalimage!=“”[1m])) without (device)
          for: 2m
          labels:
            severity: 警告
          annotations:
            summary: 容器文件系统磁盘写入速率过高。
            description: "容器名 $labels.name  的磁盘分区 $labels.device 在实例主机 $labels.instance  每秒写入速率过高,大于50M,当前值为: $value M "

        #运行容器的数量高(单位:个),实例宿主机上容器数量大于100个报警
        - alert: ContainerNumbers
          expr: count(container_last_seenjob="consul-endpoints", image!="") by (instance) > 100
          for: 1m
          labels:
            severity: 警告
          annotations:
            summary: 实例宿主机上运行容器数量过多。
            description: "实例宿主机 $labels.instance 上运行的容器数量过多,大于100个,当前值为: $value 个。"

部署上述规则文件:

kubectl apply -f consul-docker-container-rules.yaml

报警信息

告警对接飞书,钉钉或微信,可参考我原先的博客文章,这里不再重复叙述。

参考文档

以上是关于基于consul对接prometheus监控docker容器资源的主要内容,如果未能解决你的问题,请参考以下文章

prometheus+grafana+consul+supervisor搭建监控系统之supervisor搭建

Prometheus + consul + grafana 监控体系搭建1

Prometheus + consul + grafana 监控体系搭建1

2. prometheus服务发现机制

20230315_使用ConsulManager管理监控系列

Jenkins对接Prometheus实现系统指标监控