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

时间:2023-02-08 21:14:45

部署 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),按照自己实际情况进行更改。

主机部分监控

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

该主机上 docker 容器监控

基于consul对接prometheus监控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_total{job="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_bytes{job='consul-endpoints', name=~'.+'}) by (account, group, region, vendor, instance, name) / sum(container_spec_memory_limit_bytes{job='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_bytes{job='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_total{job="consul-endpoints", image!=""}[2m])) by (account, group, region, vendor, instance, name, interface)/1024/1024 > 100
          #上面也可使用类似表达式: sum(rate(container_network_receive_bytes_total{image!=""}[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_total{job="consul-endpoints", image!=""}[2m])) by (account, group, region, vendor, instance, name, interface)/1024/1024  > 100
          #上面也可使用类似表达式: sum(rate(container_network_transmit_bytes_total{image!=“”}[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_total{job="consul-endpoints", image!=""}[2m])) by (account, group, region, vendor, instance, name, device)/1024/1024 > 50
          #上面也可使用类似表达式: sum(rate(container_fs_reads_bytes_total{image!=""}[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_total{job="consul-endpoints", image!=""}[2m])) by (account, group, region, vendor, instance, name, device)/1024/1024 > 50
          #上面也可使用类似表达式: sum(rate(container_fs_writes_bytes_total{image!=“”}[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_seen{job="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

报警信息

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

参考文档