隨著容器化技術的普及,監控容器的執行狀況和資源使用情況變得至關重要。cAdvisor 作為單機容器監控工具,能有效收集容器的 CPU、記憶體、網路等指標。Heapster 則專注於 Kubernetes 叢集監控,整合 cAdvisor 資料並提供更全面的叢集視角。Prometheus 作為更通用的監控和警示系統,適用於各種雲端和實體基礎設施,並提供強大的查詢語言 PromQL 進行資料分析。在 Kubernetes 環境中,Kubelet 內建的 cAdvisor 會收集容器資料,Heapster 再將這些資料聚合後送到後端儲存系統,如 InfluxDB 和 Grafana,進行視覺化分析。Prometheus 則採用主動提取模式收集指標資料,其元件包含 Prometheus Server、Web UI、Push Gateway、Exporters 和 Alertmanager,構成完整的監控和警示體系。實際應用中,可結合 Node Exporter 和 cAdvisor 收集容器指標,並透過 Grafana 進行資料視覺化,最後整合 Alertmanager 進行警示通知,構建全面的容器監控解決方案。

叢集級容器監控與管理

在現代的雲端環境中,有效管理容器化應用程式的效能和健康狀況已成為關鍵課題。隨著 Docker 和 Kubernetes 的普及,容器監控工具如 cAdvisor、Heapster 和 Prometheus 成為了技術人員必備的利器。本篇文章將探討這些工具的功能、使用方法及其在實務上的應用。

cAdvisor:容器資源監控工具

cAdvisor 是一款由 Google 開發的開源工具,專門用於監控 Docker 容器的資源使用情況。它能夠自動發現並收集主機上的所有容器資訊,包括 CPU、記憶體、網路等指標。cAdvisor 不僅提供命令列介面,還內建了直觀的圖形化介面,方便技術人員即時檢視容器的執行狀況。

以下是如何使用 Docker 在本地機器上快速啟動 cAdvisor 的範例:

sudo docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

內容解密:

此程式碼使用 Docker 執行 cAdvisor 的最新版本映像,並將必要的主機目錄掛載到容器中以便 cAdvisor 能夠存取所有容器資訊。--publish=8080:8080 指令將 cAdvisor 的 Web UI 暴露在本地主機的 8080 頭,並且 --detach=true 啟動後台執行模式。使用者可以透過瀏覽器存取 http://localhost:8080 檢視 cAdvisor 提供的圖形化介面。

Heapster:Kubernetes 叢集監控

Heapster 是由 Google 開發的一款專為 Kubernetes 叢集設計的監控工具。它利用 cAdvisor 收集節點上的容器效能資料,並將這些資料聚合後轉送到後端儲存系統進行視覺化分析。Heapster 支援多種後端儲存系統,例如 InfluxDB 和 Grafana,這使得它在 Kubernetes 環境中的應用非常靈活。

在 Kubernetes 中,cAdvisor 已經整合到 Kubelet 二進位制檔案中。Kubelet 會從 cAdvisor 收集所有容器的資源使用統計資料,並透過 REST API 提供給 Heapster。Heapster 則對這些資料進行處理和分組,最終推播到組態好的後端系統進行視覺化。

  graph TD;
    A[Kubernetes Node] --> B[cAdvisor];
    B --> C[Kubelet];
    C --> D[Heapster];
    D --> E[InfluxDB];
    D --> F[Grafana];

內容解密:

此圖示展示了 Heapster 在 Kubernetes 叢集中的運作流程。Kubernetes Node 上執行的 Kubelet 會透過 cAdvisor 收集容器的效能資料,這些資料再透過 REST API 提供給 Heapster。Heapster 則將這些資料處理後推播到 InfluxDB 或 Grafana 作為後端儲存系統進行視覺化分析。

Prometheus:多功能監控與警示系統

Prometheus 是一個強大且靈活的開源監控與警示系統,適用於多種雲端和物理基礎設施。它採用主動提取(pull-based)模式來收集目標(targets)上的指標資料。Prometheus 的設計使得它可以靈活組態和擴充套件,並且提供強大的查詢語言 PromQL 用於資料分析。

Prometheus 的主要元件包括:

  • Prometheus Server:負責提取目標資料並儲存。
  • Web UI:利用 Grafana 提供圖形化介面。
  • Push Gateway:允許短暫服務推播指標資料。
  • Exporters:用於從特定系統匯出指標資料。
  • Alertmanager:處理和路由警示。

以下是如何使用 Docker Compose 啟動 Prometheus 的範例:

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"

內容解密:

這段 Docker Compose 檔案定義了一個名為 pk_prometheus 的 Prometheus 應用程式服務。它從官方映像 prom/prometheus 啟動容器並設定一個橋接網路 pk_network,以便不同服務之間可以通訊。Volumes 用來掛載組態檔案和資料儲存路徑。command 指令則設定 Prometheus 的啟動引數。

以下是 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']

內容解密:

此組態檔案定義了 Prometheus 的全域設定和抓取組態。scrape_intervalevaluation_interval 分別設定抓取目標和評估規則的頻率。external_labels 用來為圖表新增額外標籤。scrape_configs 段落則定義了需要抓取的目標及其相關設定。

叢集級監控工具應用案例

Prometheus 在實際應用中非常靈活且強大。以下是如何在 Docker 應用中設定 Prometheus 的範例流程:

  1. 啟動 Prometheus Server:使用 Docker Compose 啟動 Prometheus 應用。
  2. 增加 Node Exporter 和 cAdvisor:這些工具會從容器中收集指標資料。
  3. 組態目標:將 Node Exporter、cAdvisor 和 Prometheus 自身作為監控目標。
  4. 組態 Grafana:利用 Grafana 作為前端圖形化介面。
  5. 檢視統計資料:透過 Grafana 檢視收集到的資料。
  6. 整合 Alertmanager:組態警示以便及時接收系統異常通知。

叢集監控工具的管理與佈署

在現代的雲端運算環境中,監控和管理容器化應用程式的效能和健康狀況是至關重要的。本篇文章將探討如何使用 Docker 和 Prometheus 來建立一個完整的監控系統,並將其與 Grafana 整合以進行資料視覺化。

Docker 與 Prometheus 的基本設定

首先,我們需要確保 Docker 環境已經正確設定並且執行。接下來,我們將使用 docker-compose 來佈署 Prometheus。以下是佈署 Prometheus 的基本步驟:

docker-compose up -d

在這個命令執行過程中,你可能會看到一個警告訊息提示 Docker 正在以 Swarm 模式執行,但這對於我們的目的來說並不影響。我們需要提取最新的 Prometheus 映像並建立相應的容器。

Pulling prometheus (prom/prometheus:latest)...
latest: Pulling from prom/prometheus
...
Digest: sha256:4f6d3a525f030e598016be765283c6455c3c830997a5c916b27a5d727be718e1
Status: Downloaded newer image for prom/prometheus:latest
Creating prometheus ...
Creating prometheus ... done

內容解密:

這段程式碼展示瞭如何使用 docker-compose 命令來啟動 Prometheus 容器。首先,docker-compose up -d 命令會在後台執行指定的服務。警告訊息提醒我們 Docker 正在以 Swarm 模式執行,但這不影響我們的佈署。接著,Pulling prometheus 的步驟顯示了 Docker 正在提取最新的 Prometheus 映像,並且成功建立了 Prometheus 容器。

驗證 Prometheus 的執行狀態

要確認 Prometheus 是否正常執行,我們可以使用以下命令:

docker ps

這將顯示所有正在執行的容器,包括我們剛剛啟動的 Prometheus 容器。

CONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS         PORTS                    NAMES
48d1efc55881   prom/prometheus      "/bin/promethus -..."     54 seconds ago  Up 53 seconds  0.0.0.0:9090->9090/tcp  promethus

內容解密:

這段程式碼展示瞭如何使用 docker ps 命令來檢查正在執行的 Docker 容器。從輸出可以看出,Prometheus 容器已經成功啟動並且正在監聽本機的 9090 測試碼。

新增 Node Exporter 和 cAdvisor

接下來,我們需要新增 Node Exporter 和 cAdvisor 作為我們監控系統的一部分。這些工具將會收集應用程式容器的度量資料。

nodeexporter:
  image: prom/node-exporter
  container_name: pk_nodeexporter
  restart: unless-stopped
  expose:
    - 9100
  networks:
    - pk_network
  labels:
    org.label-schema.group: "monitoring for PK containers"

cadvisor:
  image: google/cadvisor:v0.26.1
  container_name: pk_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:
    - pk_network
  labels:
    org.label-schema.group: "monitoring for PK containers"

節點 Exporter 和 cAdvisor 的作用

Node Exporter 是一個簡單的工具,用於從節點硬體和作業系統收集指標。它能夠提供 CPU、記憶體、磁碟空間等資源的使用情況。

nodeexporter:

cAdvisor 的作用

cAdvisor 是 Google 開發的一個分析工具,用於收集和展示容器中執行應用程式的資源使用情況。它能夠提供詳細的 CPU、記憶體、網路和磁碟I/O等資源消耗資訊。

cadvisor:

與 Prometheus 的整合

接下來,我們需要將這些新增的目標組態到 Prometheus 中:

scrape_configs:
- job_name: 'pk_nodeexporter'
  scrape_interval: 15s
  static_configs:
    - targets: ['nodeexporter:9100']
- job_name: 'pk_cadvisor'
  scrape_interval: 20s
  static_configs:
    - targets: ['cadvisor:8080']

新增 Grafana 用於資料視覺化

為了能夠更直觀地檢視收集到的資料,我們需要新增 Grafana 作為我們監控系統的一部分:

grafana:
  image: grafana/grafana
  container_name: grafana
  volumes:
    - grafana_data:/var/lib/grafana
    env_file:
      - user.config
    restart: unless-stopped
    expose:
      - 3000
      ports:
        - "3000":3000"
      networks:
        - pk_network"
      labels:
        org.label-schema.group:"monitoring for PK containers"

同時,我們還需要建立一個使用者組態檔案來設定 Grafana 的管理員帳號:

GF_SECURITY_ADMIN_USER=admin GF_SECURITY_ADMIN_PASSWORD=admin GF_USERS_ALLOW_SIGN_UP=false"

新增資料來源

登入 Grafana 控制檯後,我們需要新增 Prometheus 作為資料來源:

  • 名稱: Prometheus。
  • 型別: Prometheus。
  • URL: http://prometheus:9090。
  • 存取模式: Proxy。

確認儲存後,Grafana 和 Prometheus 應該就能夠成功連線了。