使用 cAdvisor 監控 Docker 容器指標

cAdvisor (**c**ontainer **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

備選方案:使用內聯 Docker 配置(遠端部署)

如果您正在管理遠端 Docker 主機,並且更喜歡將所有配置保留在 docker-compose.yml 檔案中(避免需要在主機上管理單獨的配置檔案),則可以使用 Docker 的 configs 特性:

version: '3.8'

configs:
  prometheus_config:
    content: |
      scrape_configs:
        - job_name: 'cadvisor'
          scrape_interval: 5s
          static_configs:
            - targets: ['cadvisor:8080']

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - 9090:9090
    command:
      - --config.file=/etc/prometheus/prometheus.yml
    configs:
      - source: prometheus_config
        target: /etc/prometheus/prometheus.yml
        uid: "65534"    # Required: numeric UID for 'nobody' user
        gid: "65534"    # Required: numeric GID for 'nobody' group
        mode: 0400      # Required: read-only permissions
    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 configs 時,您必須顯式指定 uidgidmode 為數值。

  • uid: "65534" - 數字使用者 ID(65534 = Prometheus 映象中的 nobody 使用者)
  • gid: "65534" - 數字組 ID(65534 = nobody 組)
  • mode: 0400 - 檔案許可權(所有者只讀)

省略這些欄位或使用像 "nobody" 這樣的字串值會導致以下錯誤:

strconv.Atoi: parsing "nobody": invalid syntax

探索 cAdvisor Web UI

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

在表示式瀏覽器中探索指標

cAdvisor 的 Web UI 是一個用於探索 cAdvisor 監控內容的有用介面,但它並不提供探索容器 *指標* 的介面。為此,我們需要使用 Prometheus 的表示式瀏覽器,訪問地址為 https://:9090/graph。您可以在表示式欄中輸入 Prometheus 表示式,它看起來像這樣:

Prometheus expression bar

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

注意暴露給 Prometheus 的 cAdvisor 收集的容器指標的完整列表可以在 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 容器指標。

本頁內容