使用 cAdvisor 監控 Docker 容器指標

cAdvisorcontainer Advisor 的縮寫)分析並公開來自執行中容器的資源使用率和效能資料。cAdvisor 開箱即用地公開 Prometheus 指標。在本指南中,我們將

  • 建立一個本地多容器 Docker Compose 安裝,其中包括分別執行 Prometheus、cAdvisor 和 Redis 伺服器的容器
  • 檢視由 Redis 容器產生、由 cAdvisor 收集並由 Prometheus 抓取的某些容器指標

Prometheus 設定

首先,您需要設定 Prometheus 以從 cAdvisor 抓取指標。建立一個 prometheus.yml 檔案,並使用此設定填充它

scrape_configs:
- job_name: cadvisor
  scrape_interval: 5s
  static_configs:
  - targets:
    - cadvisor:8080

Docker Compose 設定

現在我們需要建立一個 Docker Compose 設定,指定哪些容器是我們安裝的一部分,以及每個容器公開哪些端口、使用哪些卷等等。

在您建立 prometheus.yml 檔案的同一個資料夾中,建立一個 docker-compose.yml 檔案,並使用此 Docker Compose 設定填充它

version: '3.2'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
    - 9090:9090
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    depends_on:
    - cadvisor
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
    - redis
  redis:
    image: redis:latest
    container_name: redis
    ports:
    - 6379:6379

此設定指示 Docker Compose 執行三項服務,每項服務都對應一個 Docker 容器

  1. prometheus 服務使用本地 prometheus.yml 設定檔案(透過 volumes 參數匯入到容器中)。
  2. cadvisor 服務公開端口 8080(cAdvisor 指標的預設端口),並依賴於各種本地卷(//var/run 等)。
  3. redis 服務是一個標準的 Redis 伺服器。cAdvisor 將自動從此容器收集容器指標,即無需任何進一步的設定。

要執行安裝

docker-compose up

如果 Docker Compose 成功啟動所有三個容器,您應該看到類似這樣的輸出

prometheus  | level=info ts=2018-07-12T22:02:40.5195272Z caller=main.go:500 msg="Server is ready to receive web requests."

您可以使用 ps 命令驗證所有三個容器是否正在執行

docker-compose ps

您的輸出將看起來像這樣

   Name                 Command               State           Ports
----------------------------------------------------------------------------
cadvisor     /usr/bin/cadvisor -logtostderr   Up      8080/tcp
prometheus   /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp
redis        docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp

探索 cAdvisor Web UI

您可以透過 http://localhost:8080 存取 cAdvisor Web UI。您可以在 http://localhost:8080/docker/<container> 中探索我們安裝中特定 Docker 容器的統計資訊和圖表。例如,Redis 容器的指標可以在 http://localhost:8080/docker/redis 存取,Prometheus 在 http://localhost:8080/docker/prometheus 存取,依此類推。

在運算式瀏覽器中探索指標

cAdvisor 的 Web UI 是一個有用的介面,用於探索 cAdvisor 監控的各種內容,但它不提供探索容器指標的介面。為此,我們需要 Prometheus 運算式瀏覽器,它位於 http://localhost:9090/graph。您可以將 Prometheus 運算式輸入到運算式欄中,如下所示

Prometheus expression bar

讓我們從探索 container_start_time_seconds 指標開始,它記錄容器的啟動時間(以秒為單位)。您可以使用 name="<container_name>" 運算式按名稱選擇特定容器。容器名稱對應於 Docker Compose 設定中的 container_name 參數。例如,container_start_time_seconds{name="redis"} 運算式顯示 redis 容器的啟動時間。

注意:cAdvisor 文件中可以找到向 Prometheus 公開的 cAdvisor 收集的容器指標的完整列表。

其他運算式

下表列出了一些其他範例運算式

運算式 描述 適用於
rate(container_cpu_usage_seconds_total{name="redis"}[1m]) 過去一分鐘內 cgroup 的 CPU 使用率 redis 容器
container_memory_usage_bytes{name="redis"} cgroup 的總記憶體使用量(以位元組為單位) redis 容器
rate(container_network_transmit_bytes_total[1m]) 過去一分鐘內,容器每秒透過網路傳輸的位元組數 所有容器
rate(container_network_receive_bytes_total[1m]) 過去一分鐘內,容器每秒透過網路接收的位元組數 所有容器

總結

在本指南中,我們在單個安裝中使用 Docker Compose 執行了三個獨立的容器:一個 Prometheus 容器從 cAdvisor 容器抓取指標,而 cAdvisor 容器又收集了由 Redis 容器產生的指標。然後,我們使用 Prometheus 運算式瀏覽器探索了一些 cAdvisor 容器指標。

此文件是開源的。請透過提交 issue 或 pull request 來幫助改進它。