背景信息:

在现代企业运营中,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

#把脚本上传到服务器上执行
root@VM-ubuntu:~# rz
root@VM-ubuntu:~# chmod +x Docker_process_exporter_v24.0.7
root@VM-ubuntu:~# nohup ./Docker_process_exporter_v24.0.7 &

采集的指标格式

使用curl http://localhost:9190/metrics 可以看到当前采集的指标

#cpu使用率
docker_container_cpu_usage{
containerId="142b0b391a1862f101623ba4739afa7e2dd45254fef4344fdf1d37cc2adde3e0",
containerName="ailabel",
image="ailabel:v1.9.5",
instance="10.1.16.250:9190",
job="go-process-exporter",
status="running",
vmagent_ha="victoria-metrics/vmagent-ha"
}

#内存使用率
docker_container_mem_usage{
containerId="142b0b391a1862f101623ba4739afa7e2dd45254fef4344fdf1d37cc2adde3e0",
containerName="ailabel",
image="ailabel:v1.9.5",
instance="10.1.16.250:9190",
job="go-process-exporter",
status="running",
vmagent_ha="victoria-metrics/vmagent-ha"
}

#磁盘使用率
docker_instance_disk_usage{
device="/dev/vda1",
instance="10.1.16.250:9190",
job="go-process-exporter",
mountPath="/",
vmagent_ha="victoria-metrics/vmagent-ha"
}

#容器运行状态
docker_container_info{
containerId="142b0b391a1862f101623ba4739afa7e2dd45254fef4344fdf1d37cc2adde3e0",
containerName="ailabel",
image="ailabel:v1.9.5",
instance="10.1.16.250:9190",
job="go-process-exporter",
status="running",
vmagent_ha="victoria-metrics/vmagent-ha"
}

#容器进程信息
docker_container_process_info{
command="python OpenPCDet/tools/predict_openpcdet_produce.py"
containerId="142b0b391a1862f101623ba4739afa7e2dd45254fef4344fdf1d37cc2adde3e0",
containerName="ailabel",
image="ailabel:v1.9.5",
instance="10.1.16.250:9190",
job="go-process-exporter",
pid="14781",
vmagent_ha="victoria-metrics/vmagent-ha"
}

配置采集

新建job,把需要监控的主机和采集间隔填写进去

root@VM-victoria-metrics:~# vi /data/victoria-metrics/vmagent-victoriametrics.yaml
- job_name: go-process-exporter
scrape_interval: 15s
static_configs:
- targets: ['10.1.7.151:9190','10.1.7.67:9190','10.1.16.154:9190','10.1.16.250:9190']

加载配置文件

root@VM-victoria-metrics:~# kubectl apply -f vmagent-victoriametrics.yaml -n victoria-metrics
vmagent.operator.victoriametrics.com/vmagent-ha unchanged

验证是否采集

使用victoriametrics的vmui页面进行查询
http://<vmselect>:8481/select/<accountID>/vmui/

或者使用grafana的Explore进行查询

配置图表

  • 配置变量
    通过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)

最终效果图: