👻創作者:丶重明
👻創作時間:2025年8月23日
👻擅長領域:運維
目錄
- 前言
- 什么是Prometheus和cAdvisor
- Prometheus
- cAdvisor
- 部署操作
- 部署cAdvisor
- 部署Prometheus
- 指標說明
- cpu相關指標
- 內存相關指標
- 磁盤相關指標
- 網絡相關指標
- 其他相關指標
前言
在現代微服務架構中,容器化技術已成為應用部署的標準方式。隨著Docker容器數量的增長,監控容器資源使用情況和性能指標變得至關重要。本文將介紹如何使用Prometheus和cAdvisor搭建一個完整的Docker容器監控解決方案,所有組件都通過Docker容器部署。
什么是Prometheus和cAdvisor
Prometheus
Prometheus
是一款開源的系統監控和警報工具包,以其強大的多維數據模型、靈活的查詢語言和高效的時序數據庫而聞名。它采用拉取模式
從目標收集指標,非常適合監控容器化環境。
cAdvisor
cAdvisor(Container Advisor)
是Google開源的容器資源使用和性能分析工具。它能夠自動收集、聚合、處理并導出運行中容器的資源隔離參數、資源使用情況和歷史性能數據。
部署操作
部署cAdvisor
cAdvisor作為數據收集器,需要訪問宿主機的各種資源信息。
docker pull spcodes/cadvisor:v0.47.2
docker run -d \--name=cadvisor \--volume=/:/rootfs:ro \--volume=/var/run:/var/run:ro \--volume=/sys:/sys:ro \--volume=/var/lib/docker/:/var/lib/docker:ro \--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \--volume=/dev/disk/:/dev/disk:ro \--volume=/var/run/docker.sock:/var/run/docker.sock \--publish=8080:8080 \--detach=true \--privileged \--device=/dev/kmsg \spcodes/cadvisor:v0.47.2
參數解釋:
-
--volume
:將宿主機目錄掛載到容器中,使cadvisor可以訪問系統資源 -
--publish=8080:8080
:將容器內端口8080映射到宿主機端口8080 -
--privileged和--device
:授予容器訪問系統設備的權限
部署完成后可通過ip:8080
訪問cadvisor的web界面
部署Prometheus
首先準備好prometheus的配置文件,方便一會掛載使用
mkdir /prom/prometheus -p
vim prometheus.yml# prometheus.yml內容
global:scrape_interval: 15sevaluation_interval: 15sscrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']- job_name: 'cadvisor'static_configs:- targets: ['192.168.10.13:8080']
拉取鏡像并啟動prometheus容器
docker pull prom/prometheus:v3.5.0
docker run -d \-p 9090:9090 \-v /prom/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \--name prometheus \prom/prometheus:v3.5.0
參數解釋:
-v /prom/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
:掛載自定義配置文件到容器內
運行成功后可以通過ip:9090
訪問到Prometheus的web頁面
點擊Status >> Target health
可以查看兩個實例的運行情況
指標說明
cpu相關指標
指標名稱 | 指標類型 | 指標含義 |
---|---|---|
container_cpu_usage_seconds_total | counter | 容器啟動以來總消耗cpu時間 |
container_cpu_system_seconds_total | counter | 容器啟動以來內核態消耗cpu時間 |
container_cpu_user_seconds_total | counter | 容器啟動以來用戶態消耗cpu時間 |
案例:計算每個運行中的容器在過去1分鐘的平均cpu使用率
sum (rate(container_cpu_usage_seconds_total{name!=""}[1m])) by (instance,job,name) * 100
內存相關指標
指標名稱 | 指標類型 | 指標含義 |
---|---|---|
container_memory_usage_bytes | gauge | 容器當前正在使用的總內存量 |
container_memory_working_set_bytes | gauge | 容器“工作集”內存大小 |
container_spec_memory_limit_bytes | gauge | 容器內存使用上限 |
machine_memory_bytes | gauge | 當前主機總內存量 |
案例:獲取每個容器內存實際使用量(單位:MB)
sum (container_memory_working_set_bytes{name!=""}) by (increase,name) / 1024 / 1024
案例:計算所有容器的內存和占物理內存的比例
sum(container_memory_working_set_bytes{name!=""}) / sum(machine_memory_bytes) * 100
磁盤相關指標
指標名稱 | 指標類型 | 指標含義 |
---|---|---|
container_fs_reads_bytes_total | counter | 容器讀入總大小 |
container_fs_writes_bytes_total | counter | 容器寫入總大小 |
container_fs_reads_total | counter | 容器啟動以來文件系統IO讀操作總次數 |
container_fs_writes_total | counter | 容器啟動以來文件系統IO寫操作總次數 |
案例:計算每個容器每秒磁盤寫入吞吐量(單位:MB)
sum (rate(container_fs_writes_bytes_total{name!=""}[1m])) by (increase,name) /1024 /1024
網絡相關指標
指標名稱 | 指標類型 | 指標含義 |
---|---|---|
container_network_transmit_bytes_total | counter | 發送的網絡流量的總量 |
container_network_receive_bytes_total | counter | 接收的網絡流量的總量 |
案例:查詢每個容器“接收”的總流量大小(單位:MB)
sum (container_network_receive_bytes_total{name!=""}) by (instance,job,name) /1024 /1024
其他相關指標
指標名稱 | 指標類型 | 指標含義 |
---|---|---|
container_last_seen | gauge | 容器最后一次被探到的時間戳 |
container_tasks_state | gauge | 跟蹤不同狀態容器額數量 |
container_start_time_seconds | gauge | 容器啟動的時間戳 |
案例:查詢正在運行的容器數量
count(container_tasks_state{name!="",state="running"})
案例:查詢每個容器運行的時長(單位:小時)
sum (time() - container_start_time_seconds{name!=""}) by (instance,name) /3600