分享程式代碼相關筆記
目前文章總數:190 篇
最後更新:2025年 07月 26日
本篇會用到 Grafana、Prometheus、cAdvisor 組成可視覺化的監控
上述的組件都可參考之前的文章,都有詳細介紹與說明
相關參考:0014. Ubuntu 上 Docker 容器化搭建監控平台:Grafana + Prometheus + Node Exporter 監控 CPU & 記憶體
相關參考:0009. 使用 Google cAdvisor 監控 Docker 容器資源:輕量級監控工具搭建與教學
目標 : 可以透過 Grafana 監控已安裝 cAdvisor 的機器,並且該機器-容器(Container)的 CPU,記憶體資源變成持久化資料(歷史資料),因此整體的架構如圖:
對應圖片,由用戶發起查詢有以下對應流程:
1. 用戶進行查詢 |
2. 機器收到後呼叫 Grafana 服務 |
3. Grafana 服務收到後呼叫 Prometheus |
4. Prometheus 服務收到後將紀錄資料回傳給 Grafana |
5. 最終用戶可以看到查詢的結果 |
其中 Prometheus 會持續向 cAdvisor 索取資料,來進行紀錄
整個架構圖與之前文章相比是將 Node Exporter 組件改為 cAdvisor
實際上在生產環境中,可能有 SLB (負載均衡),這時會有多台機器的情況,因此我們會模擬出 2 台機器
並且只在一台機器上安裝 Grafana (備註:通常監控機器應會在另 1 台 Server 獨立安裝,這邊為了演示,安裝在其中一台機器)
以下是 2 台機器的工作:
192.168.51.93 主機 工作內容 |
---|
1. 安裝 Grafana |
2. 安裝 Prometheus |
3. 安裝 cAdvisor |
192.168.51.94 主機 工作內容 |
---|
1. 安裝 cAdvisor |
實際維運時所有被監控機器都要安裝 cAdvisor ,只有 Grafana 監控機器需安裝 Prometheus
以下 docker-compose.yml 是 Grafana + Prometheus + cAdvisor 3 種容器的合成,可以協助一鍵部署
以下 .yml 檔案,需注意開啟的 Port 號,Prometheus 的 Port:9090 ; grafana 的 Port:6060
使用者應依照自己的環境而更換 Port 號,避免與現有使用的 Port 產生衝突
version: '3.8'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "6060:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg
command:
- '--housekeeping_interval=10s'
- '--storage_duration=60m'
- '--docker_only=true'
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
prometheus_data:
grafana_data:
延續 Step 1. 其中 Prometheus 因為需要針對監控的機器,因此獨立拉出 .yml 檔案便於說明與使用
以下是 prometheus.yml 的內容,每 10s 進行輪詢
並且依照 監控目標 的不同,而有不同的設定
job_name | 說明 |
---|---|
192.168.51.93_Monitor | Prometheus 安裝於此機器,因此需要定義 |
192.168.51.93_Slave | 監控 192.168.51.93 使用 Port:6060 的 cAdvisor |
192.168.51.94_Slave | 監控 192.168.51.94 使用 Port:6060 的 cAdvisor |
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: '192.168.51.93_Monitor'
static_configs:
- targets: ['192.168.51.93:9090']
- job_name: '192.168.51.93_Slave'
static_configs:
- targets: ['192.168.51.93:6060']
labels:
machine: 'machine-51.93'
location: '192.168.51.93'
scrape_interval: 10s
metrics_path: /metrics
- job_name: '192.168.51.94_Slave'
static_configs:
- targets: ['192.168.51.94:6060']
labels:
machine: 'machine-51.94'
location: '192.168.51.94'
scrape_interval: 10s
metrics_path: /metrics
將 Step 1, Step 2. 產生的 docker-compose.yml 與 prometheus.yml 放到遠端的 Ubuntu 主機上
備註:我這邊用主機是內部主機 192.168.51.93
到檔案存放的目錄下 -> 輸入以下 Shell 指令進行一鍵安裝,至此 192.168.51.93 監控機(含被監控)安裝完成
docker-compose up -d
另一台被監控機 192.168.51.94 ,只負責被監控容器,因此只需要安裝 cAdvisor 即可,以下是 .yml 檔案內容
version: '3.8'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "6060:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
privileged: true
devices:
- /dev/kmsg
command:
- '--housekeeping_interval=10s'
- '--storage_duration=60m'
- '--docker_only=true'
將 Step 5. 的 docker-compose.yml 放到遠端的 Ubuntu 主機上
備註:我這邊用主機是內部主機 192.168.51.94
到檔案存放的目錄下 -> 輸入以下 Shell 指令進行一鍵安裝,至此 192.168.51.94 被監控機安裝完成
docker-compose up -d
可以進入安裝的主機確認是否已安裝成功
http://192.168.51.93:6060
http://192.168.51.94:6060
如下圖,若連到 WebUI 表示 cAdvisor 已 Running
若有安裝 Portainer 也可以檢視到所有安裝的容器是否運行
首次安裝完成 Grafana 後,預設帳號密碼為 admin / admin
http://192.168.51.93:3000
左側 Connections -> Data Sources -> 選擇 Prometheus
Name 可以依自己方便分辨設定,Port 來源依照 docker-compose.yml 中配置的主機 + Port 號
http://192.168.51.93:9090
完成後保存,即設定完成
可以去Grafna Dashboard網站找尋合適的儀錶板
只要是符合組件 Grafana + Prometheus + cAdvisor 都可以匯入,找尋符合團隊需求的面板來監控
這邊推薦用 ID : 21361 的儀錶板,有包含針對 cAdvisor 的 CPU、記憶體、Network 做監控,都符合我們的目標
並且還提供了,當前監控機器的容器是否保持運行的監控
依序填入 ID -> Load -> Import
資料來源使用 Prometheus 就會蒐集所有監控機器的 cAdvisor 的容器資源狀況
左側選擇 DashBoard -> 進入我們剛剛建立的儀表板 (Grafana DashBoard ID: 21361)
可以看到完整的資源的歷史紀錄,這是單純用 cAdvisor 無法實現的事情
補充:這邊看到的畫面與匯入的 DashBoard 有關係,若不是 21361 會有不同的畫面
儀錶板的上方有 Dropdown List ,可以選擇想要檢視的機器,預設為 All
這邊選擇 192.168.51.93
選擇機器後,還可以針對個別容器進行監控檢查,這邊隨意選擇一項 Container
可以清楚的知道單一容器的 CPU、Memory、Network
並且拉到最下方,可以檢視到該機器(當前 192.168.51.93) 有在 Running 的容器
Grafana + Prometheus + cAdvisor 組合的實現,讓生產維運的穩定性更高,並且也解決單純用 cAdvisort 無法保持監控歷史紀錄、資源趨勢的問題
未來在生產維運出現系統異常時,更容易讓開發團隊協助排查原因。
組合 | 是否適合壓力測試與歷史分析? | 原因 |
---|---|---|
✅ Grafana + Prometheus + cAdvisor | 非常適合 | 即時顯示 + 歷史查詢 + 自定告警 |
❌ 單獨 cAdvisor | 不適合 | 沒有歷史紀錄、查詢能力、告警能力 |