6.prometheus監控--監控docker

杨梅冲發表於2024-04-24

4.監控docker

為了能夠獲取到Docker容器的執行狀態,使用者可以透過Docker的stats命令獲取到當前主機上執行容器的統計資訊,可以檢視容器的CPU利用率、記憶體使用量、網路IO總量以及磁碟IO總量等資訊。

docker stats

# 除了使用命令以外,使用者還可以透過Docker提供的HTTP API檢視容器詳細的監控統計資訊

4.1 使用CAdvisor

CAdvisor是Google開源的一款用於展示和分析容器執行狀態的視覺化工具。透過在主機上執行CAdvisor使用者可以輕鬆的獲取到當前主機上容器的執行統計資訊,並以圖表的形式向使用者展示。

docker run -d \
  --restart=always \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --name=cadvisor \
  google/cadvisor:latest
4.1.1 Docker-compose安裝
mkdir /data/cadvisor

cd /data/cadvisor

#透過cat新建docker-compose.yaml檔案
cat > docker-compose.yaml <<"EOF"
version: '3.3'
services:
  cadvisor:
    image: google/cadvisor:latest
    #image: lagoudocker/cadvisor:v0.37.0 #支援ubuntu22.04
    container_name: cadvisor
    restart: always
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - 8080:8080
EOF

啟動:docker-compose up -d

檢視訪問:http://192.168.10.100:8080/containers/

訪問http://192.168.10.100:8080/metrics即可獲取到標準的Prometheus監控樣本輸出

4.2 Prometheus配置

配置prometheus去採集(拉取)cAdvisor的監控樣本資料

cd /data/docker-prometheus 

#在scrape_configs(搜刮配置):下面增加如下配置:

cat >> prometheus/prometheus.yml << "EOF"
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['192.168.10.100:8080']
      labels:
        instance: test伺服器
EOF

# 由於之前prometheus上已經安裝新增了cadvisor,所以現在用新增的方式

  - job_name: 'cadvisor'
    scrape_interval: 15s
    static_configs:
    - targets: ['cadvisor:8080']
      labels:
        instance: Prometheus伺服器
    - targets: ['192.168.10.100:8080']
      labels:
        instance: test伺服器

重新載入配置

curl -X POST http://localhost:9090/-/reload

檢查:

http://192.168.10.14:9090/targets?search=#pool-cadvisor

4.3 常用監控指標

CAdvisor典型監控指標

container_

指標名稱

型別

含義

container_cpu_load_average_10s

gauge

過去10秒容器CPU的平均負載

container_cpu_usage_seconds_total

counter

容器在每個CPU核心上的累積佔用時間 (單位:秒)

container_cpu_system_seconds_total

counter

System CPU累積佔用時間(單位:秒)

container_cpu_user_seconds_total

counter

User CPU累積佔用時間(單位:秒)

container_fs_usage_bytes

gauge

容器中檔案系統的使用量(單位:位元組)

container_fs_limit_bytes

gauge

容器可以使用的檔案系統總量(單位:位元組)

container_fs_reads_bytes_total

counter

容器累積讀取資料的總量(單位:位元組)

container_fs_writes_bytes_total

counter

容器累積寫入資料的總量(單位:位元組)

container_memory_max_usage_bytes

gauge

容器的最大記憶體使用量(單位:位元組)

container_memory_usage_bytes

gauge

容器當前的記憶體使用量(單位:位元組

container_spec_memory_limit_bytes

gauge

容器的記憶體使用量限制

machine_memory_bytes

gauge

當前主機的記憶體總量

container_network_receive_bytes_total

counter

容器網路累積接收資料總量(單位:位元組)

container_network_transmit_bytes_total

counter

容器網路累積傳輸資料總量(單位:位元組)

4.4 docker觸發器告警規則配置

6.prometheus監控--監控docker
cat >> prometheus/rules/docker.yml <<"EOF"
groups:
- name: DockerContainers
  rules:
  - alert: ContainerKilled
    expr: time() - container_last_seen > 60
    for: 0m
    labels:
      severity: warning
    annotations:
      isummary: "Docker容器被殺死 容器:{{ $labels.instance }}"
      description: "{{ $value }}個容器消失了"
  # This rule can be very noisy in dynamic infra with legitimate container start/stop/deployment.
  - alert: ContainerAbsent
    expr: absent(container_last_seen)
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "無容器 容器: {{ $labels.instance }}"
      description: "5分鐘檢查容器不存在,值為:{{ $value }}"
  - alert: ContainerCpuUsage
    expr: (sum(rate(container_cpu_usage_seconds_total{name!=""}[3m])) BY (instance, name) * 100) > 300
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "容器cpu使用率告警 容器: {{ $labels.instance }}"
      description: "容器cpu使用率超過300%,當前值為:{{ $value }}"
  - alert: ContainerMemoryUsage
    expr: (sum(container_memory_working_set_bytes{name!=""}) BY (instance, name) / sum(container_spec_memory_limit_bytes > 0) BY (instance, name) * 100) > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "容器記憶體使用率告警 容器: {{ $labels.instance }}"
      description: "容器記憶體使用率超過80%,當前值為:{{ $value }}"
  - alert: ContainerVolumeIoUsage
    expr: (sum(container_fs_io_current{name!=""}) BY (instance, name) * 100) > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "容器儲存io使用率告警 容器: {{ $labels.instance }}"
      description: "容器儲存io使用率超過 80%,當前值為:{{ $value }}"
  - alert: ContainerHighThrottleRate
    expr: rate(container_cpu_cfs_throttled_seconds_total[3m]) > 1
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "容器限制告警 容器:{{ $labels.instance }}"
      description: "容器被限制,當前值為:{{ $value }}"
EOF
docker告警規則

重新載入配置並檢查:

curl -X POST http://localhost:9090/-/reload

http://192.168.10.14:9090/rules

http://192.168.10.14:9090/alerts?search=

4.5 dashboard顯示

grafana展示prometheus收集到的cadvisor的資料

https://grafana.com/grafana/dashboards/11600-docker-container/
http://192.168.10.14:3000/
https://grafana.com/grafana/dashboards/11600-docker-container/

相關文章