基于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
成功后,我们登入consul
或consulmanager
即可看到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