在容器化時代,有效監控叢集的健康和效能至關重要。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 的主要元件

  1. Prometheus 伺服器:負責提取(scrape)和儲存收集到的資料,並執行規則來記錄新的時間序列。它還可以生成診斷警示。
  2. Web UI:Prometheus 與 Grafana 搭配使用,提供高度視覺化和互動式的儀錶板。
  3. Push Gateway:用於短暫服務推播指標資料到 Prometheus,解決提取模式無法應對短暫服務的問題。
  4. Exporters:用於從某些系統中匯出指標資料,例如 HAProxy 和 Memcached。
  5. 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 抓取資料。
  • cadvisor:
    • image: 指定要使用的 Docker 映像,這裡是 google/cadvisor 的 v0.26.1 版本。
    • container_name: 為容器指定一個名稱。
    • volumes: 掛載宿主機的檔案系統和 Docker 資料目錄,讓 cAdvisor 能夠收集詳細的容器度量資料。
    • restart: 組態容器的重啟策略。
    • expose: 暴露容器的 8080 埠,供 Prometheus 抓取資料。

組態 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負責資料視覺化。