部署 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_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
报警信息
告警对接飞书,钉钉或微信,可参考我原先的博客文章,这里不再重复叙述。