在容器化時代,有效監控叢集的健康和效能至關重要。Heapster 作為 Kubernetes 原生監控方案,與 cAdvisor 深度整合,能有效收集容器資源使用資料,但其侷限性在於對 Kubernetes 的依賴。Prometheus 則以其靈活性和強大的 PromQL 查詢語言著稱,支援提取模式,適用於各種服務和環境,但需要額外組態和整合。選擇哪種工具取決於具體需求和環境。對於 Kubernetes 叢集,Heapster 提供了更便捷的整合方案,而 Prometheus 則更具通用性和擴充套件性。實務上,常使用 Prometheus 結合 Node Exporter 和 cAdvisor 監控 Docker 容器,並透過 Grafana 視覺化資料。透過 Docker Compose,可以簡化佈署和管理流程,快速搭建一套完整的監控系統。組態 Prometheus 抓取目標、設定 Grafana 資料來源等步驟,確保監控資料的準確性和視覺化效果。
叢集範圍監控工具的選擇與實作
在現代的容器化環境中,監控和管理叢集內部的運作狀況至關重要。透過叢集範圍的監控工具,我們可以更全面地掌握容器的資源使用情況、效能表現以及網路流量等資料。以下,玄貓將探討兩個常見的開源叢集監控工具:Heapster 和 Prometheus,並提供具體的實作步驟和技術深度分析。
Heapster:Kubernetes 的叢集監控解決方案
Heapster 是由 Google 開發的一個叢集範圍監控工具,專門為 Kubernetes 設計。它大量依賴 cAdvisor 來收集和處理容器的使用資料,並將這些資料推播到組態好的後端進行視覺化。目前,Heapster 支援的後端包括 InfluxDB 和 Grafana。
Heapster 的工作原理
在 Kubernetes 中,cAdvisor 已經整合到 Kubelet 二進位制檔案中。Kubelet 會從 cAdvisor 收集到所有容器的使用資料,然後透過 REST API 將這些資料暴露給 Heapster。Heapster 會處理和分組這些資料,並推播到組態好的後端進行視覺化。
Heapster 的優缺點
- 優點:
- 嚴密整合 Kubernetes,適合作為 Kubernetes 的標準監控工具。
- 支援多種後端視覺化工具,如 InfluxDB 和 Grafana。
- 缺點:
- 目前僅支援 Kubernetes 和 CoreOS,適應性較差。
- 組態較為複雜,需要對 Kubernetes 有深入瞭解。
Prometheus:靈活且強大的監控解決方案
Prometheus 是一個開源的叢集監控和警示解決方案,以其靈活性和強大的查詢語言 PromQL 語言而聞名。它採用提取模式(pull-based model),即監控代理會定期提取目標資料進行收集和儲存。
Prometheus 的主要元件
- Prometheus 伺服器:負責提取(scrape)和儲存收集到的資料,並執行規則來記錄新的時間序列。它還可以生成診斷警示。
- Web UI:Prometheus 與 Grafana 搭配使用,提供高度視覺化和互動式的儀錶板。
- Push Gateway:用於短暫服務推播指標資料到 Prometheus,解決提取模式無法應對短暫服務的問題。
- Exporters:用於從某些系統中匯出指標資料,例如 HAProxy 和 Memcached。
- Alertmanager:處理來自 Prometheus 伺服器和其他應用程式的警示,並進行去重、分組和路由。
Prometheus 與 Docker 的整合
以下是如何在 Docker 中設定 Prometheus 來監控容器的步驟:
第一步:執行 Prometheus
首先,我們需要啟動 Prometheus 伺服器作為 Docker 容器。以下是 docker-compose.yml 檔案:
version: '2'
networks:
- pk_network:
driver: bridge
volumes:
prometheus_data: {}
services:
prometheus:
image: prom/prometheus
container_name: pk_prometheus
volumes:
- ./prometheus/:/etc/prometheus/
- prometheus_data:/prometheus
command:
- '-config.file=/etc/prometheus/prometheus.yml'
- '-storage.local.path=/prometheus'
- '-storage.local.memory-chunks=100000'
restart: unless-stopped
expose:
- 9090
ports:
- 9090:9090
networks:
- pk_network
labels:
org.label-schema.group: "monitoring for PK containers"
這段程式碼建立了一個橋接網路 pk_network,並啟動了 Prometheus 容器。我們還映射了組態檔案 prometheus.yml 和暴露了所需的埠。
第二步:組態 Prometheus
接下來是 prometheus.yml 組態檔案:
global:
scrape_interval: 20s
evaluation_interval: 20s
external_labels:
monitor: 'Docker-pk-monitor'
scrape_configs:
- job_name: 'pk_prometheus'
scrape_interval: 25s
static_configs:
- targets: ['localhost:9090']
這段程式碼設定了抓取(scrape)間隔和評估間隔,並將 Prometheus 本身設為目標以進行自我監控。
請輸入「Chapter11_Systems Monitoring and Logging」
使用Docker Compose 管理容器:Prometheus、Node Exporter、cAdvisor 與 Grafana
在現代雲端運算環境中,監控是確保系統穩定執行的關鍵。透過Docker Compose,我們可以輕鬆地佈署和管理多個監控工具,例如 Prometheus、Node Exporter、cAdvisor 和 Grafana。以下是玄貓實際案例分享,這些工具如何協同工作,提供全面的監控解決方案。
佈署 Prometheus
首先,我們需要佈署 Prometheus 來收集和儲存監控資料。Prometheus 是一個強大的開源監控系統,專注於實時資料收集和查詢。
version: '3'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
內容解密:
- image: 指定要使用的 Docker 映像,這裡是
prom/prometheus的最新版本。 - container_name: 為容器指定一個名稱,方便後續管理。
- restart: 組態容器的重啟策略,這裡設定為除非手動停止否則總是重啟。
- ports: 對映容器的 9090 埠到主機的 9090 埠,這樣我們可以透過主機的 9090 埠存取 Prometheus 的 UI。
- volumes: 搭配本地
prometheus.yml檔案到容器內,這樣我們可以自定義 Prometheus 的組態。
新增 Node Exporter 和 cAdvisor
接下來,我們需要佈署 Node Exporter 和 cAdvisor 來收集節點和容器的度量資料。
nodeexporter:
image: prom/node-exporter
container_name: nodeexporter
restart: unless-stopped
expose:
- "9100"
networks:
- monitoring
cadvisor:
image: google/cadvisor:v0.26.1
container_name: cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
restart: unless-stopped
expose:
- "8080"
networks:
- monitoring
內容解密:
- nodeexporter:
- image: 指定要使用的 Docker 映像,這裡是
prom/node-exporter。 - container_name: 為容器指定一個名稱。
- restart: 組態容器的重啟策略。
- expose: 暴露容器的 9100 埠,供 Prometheus 抓取資料。
- image: 指定要使用的 Docker 映像,這裡是
- cadvisor:
- image: 指定要使用的 Docker 映像,這裡是
google/cadvisor的 v0.26.1 版本。 - container_name: 為容器指定一個名稱。
- volumes: 掛載宿主機的檔案系統和 Docker 資料目錄,讓 cAdvisor 能夠收集詳細的容器度量資料。
- restart: 組態容器的重啟策略。
- expose: 暴露容器的 8080 埠,供 Prometheus 抓取資料。
- image: 指定要使用的 Docker 映像,這裡是
組態 Prometheus 抓取目標
我們需要更新 prometheus.yml 檔案,將 Node Exporter 和 cAdvisor 新增為抓取目標。
scrape_configs:
- job_name: 'nodeexporter'
scrape_interval: 15s
static_configs:
- targets: ['nodeexporter:9100']
- job_name: 'cadvisor'
scrape_interval: 20s
static_configs:
- targets: ['cadvisor:8080']
內容解密:
- scrape_configs: 組態 Prometheus 的抓取任務。
- job_name: 每個抓取任務的一個唯一識別符號。
- scrape_interval: 抓取間隔時間,單位為秒。
- static_configs: 需要抓取的靜態目標列表。
新增 Grafana
最後,我們需要佈署 Grafana 作為資料視覺化工具。
grafana:
image: grafana/grafana
container_name: grafana
volumes:
grafana_data:/var/lib/grafana
env_file:
user.config
restart: unless-stopped
ports:
"3000:3000"
networks:
monitoring
volumes:
grafana_data:
networks:
monitoring:
內容解密:
- image: 指定要使用的 Docker 映象,這裡是
grafana/grafana。 - container_name: 連結給該 Grafana 的名稱。方便管理及維護。
- volumes: 掛載本地儲存到 Grafana 的資料目錄中以保持持久化。
- env_file: 指定環境變數檔案來設定 Grafana 的組態選項(例如管理員使用者名稱和密碼)。
- restart:設定為除非手動停止否則總是重啟,以提高服務可用性。
- ports:將宿主機埠3000對映到Grafana服務執行時使用的3000埠上。
組態 Grafana 資料來源
在 Grafana 中新增 Prometheus 作為資料來源:
Name: Prometheus
Type: Prometheus
URL: http://prometheus:9090
Access: proxy
內容解密:
- Name: 資料來源名稱。這裡命名為
Prometheus。 - Type: 資料來源型別。選擇
Prometheus。 - URL:Prometheus服務地址。這裡設定為 http://prometheus:9090 。
- Access:設定存取許可權。選擇代理存取方式以確保資料安全。
檢視統計資料
完成以上步驟後,我們可以透過瀏覽器存取 Grafana 的 UI(通常是 http://localhost:3000/),並檢視從 Prometheus 收集到的統計資料。Grafana 提供了豐富的圖表和儀錶板功能,可以幫助我們更直觀地瞭解系統執行狀況。
內容解密:
此圖示展示了不同元素之間互相影響及連動關係。首先由Docker Compose來統合所有監控工具,而Promethues, Node Exporter, cAdvisor, Grafana之間互相共同作用而形成一套完整且功能豐富之監控系統。其中主要由Promethues, Node Exporter及cAdvisor負責資料收集,而Grafana負責資料視覺化。