背景信息:
在现代企业运营中,Prometheus 已被广泛部署用于监控 Kubernetes 集群、中间件以及服务器,以实现快速的问题定位和预警。尽管 Prometheus 与 cAdvisor 结合使用可以收集一台机器上所有运行的容器信息,对节点机器上的 CPU 使用情况、内存使用情况、网络吞吐量及文件系统使用情况进行实时监控和性能数据采集,但这种监控方式存在一定的局限性。在监控单个主机内运行容器的服务健康状态方面存在不足。这种局限性可能导致在服务出现故障时无法及时感知,影响服务的连续性和稳定性
目的:
有效地监控主机内运行的 Docker 容器运行状态,建立一个全面的监控和告警系统,预防服务中断,确保服务的高可用性和业务连续性
解决方案:
编写GO脚本使用Docker Engine API的/stats端点来获取获取CPU,内存,容器运行状态,进程数。结合 nvidia_gpu_exporter 收集 GPU 指标,并通过 VictoriaMetrics 和 Grafana 实现监控与告警(因有的容器内需要手动激活环境后,启动服务,所以只监控容器状态不能确保容器存活,启动服务不是主进程容器不会挂掉,采用进程的方式更合理)
废弃方案:通过cAdvisor的container_processes指标获取进程数量进行监控,但是发现手动安装的没有该指标,k8s的kubelet是有该指标的。
部署Docker_process_exporter
机器ip和docker版本:
10.1.16.250 Version: 24.0.7
#把脚本上传到服务器上执行 |
采集的指标格式
使用curl http://localhost:9190/metrics 可以看到当前采集的指标
#cpu使用率 |
配置采集
新建job,把需要监控的主机和采集间隔填写进去
root@VM-victoria-metrics:~# vi /data/victoria-metrics/vmagent-victoriametrics.yaml |
加载配置文件
root@VM-victoria-metrics:~# kubectl apply -f vmagent-victoriametrics.yaml -n victoria-metrics |
验证是否采集
使用victoriametrics的vmui页面进行查询 |
配置图表
配置变量
通过CVM变量来过滤监控的机器,ContainerName变量来过滤机器内运行的容器配置面板
CPU使用率docker_container_cpu_usage{instance="$CVM:9190",status="running",containerName="$ContainerName"}
内存使用率
docker_container_mem_usage{instance="$CVM:9190",status="running",containerName="$ContainerName"}
磁盘使用率
sum(docker_instance_disk_usage{instance="$CVM:9190"}) by (device,mountPath)
GPU
#GPU温度
nvidia_smi_temperature_gpu{instance="$CVM:9835"}
#GPU显存使用量
nvidia_smi_memory_used_bytes{instance="$CVM:9835"}
#GPU显存总量
nvidia_smi_memory_total_bytes{instance="$CVM:9835"}
#GPU使用率
(nvidia_smi_memory_used_bytes{instance="$CVM:9835"} / nvidia_smi_memory_total_bytes{instance="$CVM:9835"})* 100容器异常运行状态
#退出状态的容器条数
count(docker_container_info{instance="$CVM:9190",status="exited"}) by (status)
#运行中状态的容器条数
count(docker_container_info{instance="$CVM:9190",status="running"}) by (status)容器运行进程数
#容器内启动的命令+pid+容器名称
count(docker_container_process_info{instance="$CVM:9190",containerName="$ContainerName"}) by (command,pid,containerName)