07.容器监控

容器监控完全指南:从基础到实战

文章目录

  • 容器监控完全指南:从基础到实战
    • 一、容器监控基础概念
      • [1.1 为什么需要容器监控?](#1.1 为什么需要容器监控?)
      • [1.2 容器监控的核心指标](#1.2 容器监控的核心指标)
    • [二、Docker 原生监控命令](#二、Docker 原生监控命令)
      • [2.1 查看容器基本状态](#2.1 查看容器基本状态)
      • [2.2 查看容器资源使用历史](#2.2 查看容器资源使用历史)
      • [2.3 查看容器日志(间接监控)](#2.3 查看容器日志(间接监控))
      • [2.4 查看容器进程信息](#2.4 查看容器进程信息)
      • [2.5 检查容器健康状态](#2.5 检查容器健康状态)
    • 三、进阶监控工具:cAdvisor
      • [3.1 安装和运行 cAdvisor](#3.1 安装和运行 cAdvisor)
      • [3.2 使用 cAdvisor 监控容器](#3.2 使用 cAdvisor 监控容器)
    • [四、企业级监控方案:Prometheus + Grafana](#四、企业级监控方案:Prometheus + Grafana)
      • [4.1 部署 Prometheus + Grafana + cAdvisor](#4.1 部署 Prometheus + Grafana + cAdvisor)
      • [4.2 配置 Prometheus](#4.2 配置 Prometheus)
      • [4.3 启动监控栈](#4.3 启动监控栈)
      • [4.4 配置 Grafana 可视化](#4.4 配置 Grafana 可视化)
      • [4.5 常用 PromQL 查询示例](#4.5 常用 PromQL 查询示例)
      • [4.6 配置告警规则](#4.6 配置告警规则)
    • [五、Kubernetes 容器监控](#五、Kubernetes 容器监控)
      • [5.1 Kubernetes 监控架构](#5.1 Kubernetes 监控架构)
      • [5.2 使用 Helm 部署监控栈](#5.2 使用 Helm 部署监控栈)
      • [5.3 访问 Kubernetes 中的监控界面](#5.3 访问 Kubernetes 中的监控界面)
      • [5.4 Kubernetes 常用监控指标](#5.4 Kubernetes 常用监控指标)
    • 六、容器监控最佳实践
      • [6.1 选择合适的监控粒度](#6.1 选择合适的监控粒度)
      • [6.2 确定关键监控指标](#6.2 确定关键监控指标)
      • [6.3 设置合理的告警阈值](#6.3 设置合理的告警阈值)
      • [6.4 日志与监控结合](#6.4 日志与监控结合)
      • [6.5 定期审查和优化监控策略](#6.5 定期审查和优化监控策略)
    • 七、常见问题与解决方案
      • [7.1 监控数据不完整或缺失](#7.1 监控数据不完整或缺失)
      • [7.2 监控系统占用过多资源](#7.2 监控系统占用过多资源)
      • [7.3 告警风暴](#7.3 告警风暴)
      • [7.4 容器快速销毁导致监控数据不完整](#7.4 容器快速销毁导致监控数据不完整)
    • 八、总结

容器技术的普及带来了部署效率的提升,但也增加了监控的复杂性。与传统服务器监控不同,容器具有生命周期短、动态迁移、资源隔离等特点,需要专门的监控策略和工具。本文将从基础命令到高级监控系统,全面讲解容器监控的实现方法。

一、容器监控基础概念

1.1 为什么需要容器监控?

容器环境相比传统环境更复杂,主要体现在:

  • 容器生命周期短,可能频繁创建和销毁
  • 容器密度高,一台物理机可能运行数百个容器
  • 资源隔离严格,需要监控容器级别的 CPU、内存等使用情况
  • 容器间网络复杂,需要监控容器间通信

有效的容器监控可以帮助我们:

  • 实时了解容器运行状态
  • 提前发现并解决资源瓶颈
  • 快速定位故障根源
  • 优化资源配置,降低成本

1.2 容器监控的核心指标

容器监控需要关注的关键指标可分为四大类:

指标类型 核心指标 说明
资源使用率 CPU 使用率、内存使用量、内存使用率、磁盘 I/O、网络 I/O 反映容器对宿主机资源的占用情况
容器状态 运行状态、启动时间、重启次数、健康状态 反映容器本身的生命周期和健康状况
应用性能 响应时间、错误率、请求量 反映容器内运行的应用程序性能
宿主机状态 整体 CPU、内存、磁盘使用率,节点健康状态 反映容器运行的底层环境状况

二、Docker 原生监控命令

Docker 自带了一些基础命令,可以快速查看容器的运行状态和资源使用情况,适合简单场景和临时排查问题。

2.1 查看容器基本状态

bash 复制代码
# 列出所有容器(包括停止的)
docker ps -a

# 只显示运行中的容器
docker ps

# 查看容器详细信息(包括配置、网络、挂载等)
docker inspect <容器ID或名称>

# 查看容器的资源使用统计信息(实时更新)
docker stats

docker stats命令输出详解:

  • CONTAINER ID/NAME:容器 ID 和名称
  • CPU %:容器使用的 CPU 百分比
  • MEM USAGE / LIMIT:内存使用量 / 限制
  • MEM %:内存使用率
  • NET I/O:容器的网络输入 / 输出
  • BLOCK I/O:容器的磁盘块输入 / 输出
  • PIDS:容器内的进程数

2.2 查看容器资源使用历史

bash 复制代码
# 查看容器的CPU和内存使用历史(需要cAdvisor或其他工具)
# 以下是使用docker stats的一些实用参数

# 只显示特定容器的统计信息
docker stats <容器1> <容器2>

# 以精简模式显示(只显示容器ID和资源使用情况)
docker stats --no-stream --format "table {{.ID}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 以JSON格式输出(便于程序处理)
docker stats --no-stream --format json

2.3 查看容器日志(间接监控)

bash 复制代码
# 查看容器日志(前面章节已详细介绍)
docker logs <容器ID或名称>

# 实时跟踪日志并显示时间戳
docker logs -f -t <容器ID或名称>

# 查看最后100行日志
docker logs --tail 100 <容器ID或名称>

2.4 查看容器进程信息

bash 复制代码
# 查看容器内运行的进程
docker top <容器ID或名称>

# 示例输出:
# UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
# root                12345               12320               0                   09:00               ?                   00:00:05            nginx: master process nginx -g daemon off;

2.5 检查容器健康状态

如果容器定义了健康检查,可以通过以下命令查看:

bash 复制代码
# 查看容器健康状态
docker inspect --format '{{json .State.Health}}' <容器ID或名称> | jq

# 示例输出:
{
  "Status": "healthy",
  "FailingStreak": 0,
  "Log": [
    {
      "Start": "2023-10-01T09:00:00.000000000Z",
      "End": "2023-10-01T09:00:01.000000000Z",
      "ExitCode": 0,
      "Output": "HTTP/1.1 200 OK..."
    }
  ]
}

三、进阶监控工具:cAdvisor

cAdvisor(Container Advisor)是 Google 开发的容器监控工具,可以收集、聚合、处理和导出容器的运行时指标。它支持 Docker 容器,并且可以集成到其他监控系统中。

3.1 安装和运行 cAdvisor

bash 复制代码
# 使用Docker运行cAdvisor
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  gcr.io/cadvisor/cadvisor:latest

# 如果无法访问gcr.io,可以使用国内镜像
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  registry.cn-hangzhou.aliyuncs.com/google_containers/cadvisor:latest

3.2 使用 cAdvisor 监控容器

  1. 访问 cAdvisor 的 Web 界面:http://<宿主机IP>:8080

  2. cAdvisor 提供的主要信息:

    • 主机概览:显示宿主机的总体资源使用情况
    • 容器列表:显示所有容器及其基本资源使用情况
    • 容器详情:点击特定容器可以查看详细指标
    • 指标图表:CPU、内存、网络、磁盘 I/O 等指标的历史趋势
  3. 通过 API 获取监控数据:

    bash 复制代码
    # 获取所有容器的基本信息
    curl http://localhost:8080/api/v1.3/containers/
    
    # 获取特定容器的详细指标(需要替换容器ID)
    curl http://localhost:8080/api/v1.3/containers/docker/<容器ID>
    
    # 获取主机的整体指标
    curl http://localhost:8080/api/v1.3/machine

四、企业级监控方案:Prometheus + Grafana

对于生产环境,推荐使用 Prometheus + Grafana 的组合进行容器监控。Prometheus 负责收集和存储指标,Grafana 负责可视化和告警。

4.1 部署 Prometheus + Grafana + cAdvisor

使用 Docker Compose 快速部署:

bash 复制代码
version: '3.8'

services:
  # cAdvisor负责收集容器指标
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    restart: always
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - "8080:8080"
    networks:
      - monitoring

  # Prometheus负责存储和查询指标
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    ports:
      - "9090:9090"
    networks:
      - monitoring
    depends_on:
      - cadvisor

  # Grafana负责可视化和告警
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
    ports:
      - "3000:3000"
    networks:
      - monitoring
    depends_on:
      - prometheus

networks:
  monitoring:
    driver: bridge

volumes:
  prometheus_data:
  grafana_data:

4.2 配置 Prometheus

创建prometheus.yml配置文件:

bash 复制代码
global:
  scrape_interval: 15s # 每15秒收集一次数据
  evaluation_interval: 15s # 每15秒评估一次规则

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

4.3 启动监控栈

bash 复制代码
# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

4.4 配置 Grafana 可视化

  1. 访问 Grafana:http://<宿主机IP>:3000,使用用户名admin和密码admin登录
  2. 添加 Prometheus 数据源:
    • 点击左侧菜单的 "Configuration" -> "Data Sources"
    • 点击 "Add data source",选择 "Prometheus"
    • 在 "URL" 字段输入http://prometheus:9090
    • 点击 "Save & Test",确认连接成功
  3. 导入容器监控仪表盘:
    • 点击左侧菜单的 "+" -> "Import"
    • 输入仪表盘 ID:893(这是一个受欢迎的 Docker 监控仪表盘)
    • 选择刚刚添加的 Prometheus 数据源
    • 点击 "Import"
  4. 查看监控仪表盘:
    • 导入成功后,你将看到一个包含多个面板的仪表盘
    • 面板包括:容器列表、CPU 使用率、内存使用量、网络 I/O、磁盘 I/O 等
    • 可以通过右上角的时间范围选择器调整时间范围

4.5 常用 PromQL 查询示例

PromQL 是 Prometheus 的查询语言,以下是一些常用的容器监控查询:

promql 复制代码
# 1. 所有容器的CPU使用率(百分比)
sum(rate(container_cpu_usage_seconds_total{name=~".+"}[5m])) by (name) * 100

# 2. 特定容器的CPU使用率
sum(rate(container_cpu_usage_seconds_total{name="my-container"}[5m])) by (name) * 100

# 3. 所有容器的内存使用量(MB)
container_memory_usage_bytes{name=~".+"} / 1024 / 1024

# 4. 所有容器的网络接收速率(MB/s)
sum(rate(container_network_receive_bytes_total{name=~".+"}[5m])) by (name) / 1024 / 1024

# 5. 所有容器的网络发送速率(MB/s)
sum(rate(container_network_transmit_bytes_total{name=~".+"}[5m])) by (name) / 1024 / 1024

# 6. 所有容器的磁盘读取速率(MB/s)
sum(rate(container_fs_reads_bytes_total{name=~".+"}[5m])) by (name) / 1024 / 1024

# 7. 所有容器的磁盘写入速率(MB/s)
sum(rate(container_fs_writes_bytes_total{name=~".+"}[5m])) by (name) / 1024 / 1024

# 8. 运行中的容器数量
count(container_last_seen{name=~".+",status="running"})

4.6 配置告警规则

在 Prometheus 中配置告警规则,当指标超过阈值时触发告警:

  1. 创建alert.rules.yml文件:
yaml 复制代码
groups:
- name: container_alerts
  rules:
  - alert: HighCpuUsage
    expr: sum(rate(container_cpu_usage_seconds_total{name=~".+"}[5m])) by (name) * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage for container {{ $labels.name }}"
      description: "Container {{ $labels.name }} has high CPU usage (current value: {{ $value }})"
  
  - alert: HighMemoryUsage
    expr: (container_memory_usage_bytes{name=~".+"} / container_spec_memory_limit_bytes{name=~".+"}) * 100 > 90
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High memory usage for container {{ $labels.name }}"
      description: "Container {{ $labels.name }} has high memory usage (current value: {{ $value }})"
  1. prometheus.yml中添加规则文件:
yaml 复制代码
rule_files:
  - "alert.rules.yml"
  1. 配置 Alertmanager(需要额外部署)来处理和发送告警。

五、Kubernetes 容器监控

在 Kubernetes 环境中,容器监控更加复杂,通常使用以下方案:

5.1 Kubernetes 监控架构

Kubernetes 监控通常包含以下组件:

  • kube-state-metrics:收集 Kubernetes 对象的状态指标
  • node-exporter:收集节点的硬件和操作系统指标
  • cAdvisor:内置在 kubelet 中,收集容器指标
  • Prometheus:收集和存储所有指标
  • Grafana:可视化指标和创建仪表盘

5.2 使用 Helm 部署监控栈

bash 复制代码
# 添加Prometheus社区Helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 创建命名空间
kubectl create namespace monitoring

# 安装kube-prometheus-stack(包含所有必要组件)
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set grafana.adminPassword=admin \
  --set prometheus.retention=15d \
  --set alertmanager.persistentVolume.size=10Gi \
  --set prometheus.persistentVolume.size=50Gi

5.3 访问 Kubernetes 中的监控界面

bash 复制代码
# 端口转发访问Grafana
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80

# 端口转发访问Prometheus
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090

# 端口转发访问Alertmanager
kubectl port-forward -n monitoring svc/kube-prometheus-stack-alertmanager 9093:9093

然后访问http://localhost:3000即可打开 Grafana,使用用户名admin和密码admin登录。

5.4 Kubernetes 常用监控指标

promql 复制代码
# 1. 所有Pod的CPU使用率
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod)

# 2. 所有Pod的内存使用量
sum(container_memory_usage_bytes{container!=""}) by (pod)

# 3. 节点CPU使用率
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (node) * 100

# 4. 节点内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 by (node)

# 5. 容器重启次数
kube_pod_container_status_restarts_total

# 6. 部署的可用副本数
kube_deployment_status_available_replicas

# 7. 每个命名空间的Pod数量
count(kube_pod_info) by (namespace)

# 8. 节点网络接收速率
sum(rate(node_network_receive_bytes_total[5m])) by (node)

# 9. 节点网络发送速率
sum(rate(node_network_transmit_bytes_total[5m])) by (node)

六、容器监控最佳实践

6.1 选择合适的监控粒度

  • 开发 / 测试环境:可以使用基础命令或 cAdvisor 进行简单监控
  • 生产环境:建议使用 Prometheus + Grafana 的完整方案
  • Kubernetes 环境:推荐使用 kube-prometheus-stack

6.2 确定关键监控指标

根据业务需求确定需要重点监控的指标,避免收集过多无关指标:

  • 基础资源指标:CPU、内存、网络、磁盘 I/O
  • 应用特定指标:根据应用类型选择(如请求量、响应时间、错误率)
  • 业务指标:与业务相关的指标(如订单量、用户注册数)

6.3 设置合理的告警阈值

告警阈值设置过高会漏掉问题,设置过低会导致告警疲劳:

  • 根据历史数据确定基准值
  • 考虑业务高峰期的资源使用情况
  • 设置多级告警(警告、严重、紧急)
  • 为不同环境设置不同的阈值(生产、测试、开发)

6.4 日志与监控结合

监控和日志是相辅相成的:

  • 监控可以快速发现异常
  • 日志可以深入分析异常原因
  • 考虑使用 ELK Stack 或 Loki + Grafana 组合管理日志

6.5 定期审查和优化监控策略

  • 定期检查监控指标的有效性
  • 根据业务变化调整监控范围
  • 优化存储策略,避免监控数据占用过多磁盘空间
  • 定期演练告警响应流程

七、常见问题与解决方案

7.1 监控数据不完整或缺失

问题:某些容器的监控数据缺失或不完整

解决方案

  • 检查 cAdvisor 是否正常运行:docker logs cadvisor
  • 确认容器是否正确挂载了必要的卷
  • 检查容器是否有特殊的安全配置阻止了监控
  • 重启监控组件:docker-compose restart prometheus cadvisor

7.2 监控系统占用过多资源

问题:Prometheus 或 cAdvisor 占用过多 CPU 或内存

解决方案

  • 调整 Prometheus 的抓取间隔(增大scrape_interval
  • 缩短数据保留时间(减小--storage.tsdb.retention.time
  • 配置数据采样和聚合规则
  • 为监控组件设置资源限制

7.3 告警风暴

问题:短时间内收到大量告警,难以处理

解决方案

  • 调整告警阈值和持续时间
  • 设置告警抑制规则,避免相关告警同时触发
  • 对告警进行分组和优先级排序
  • 实现告警聚合,将相关告警合并为一个

7.4 容器快速销毁导致监控数据不完整

问题:短期运行的容器(如 CI/CD 任务)销毁后,监控数据丢失

解决方案

  • 配置足够长的监控数据保留时间
  • 实现容器生命周期事件捕获
  • 对短期任务设置特殊的监控策略
  • 使用集中式存储确保数据不丢失

八、总结

容器监控是容器化环境稳定运行的关键保障,从简单的docker stats命令到复杂的 Prometheus + Grafana + Kubernetes 监控栈,有多种工具和方案可供选择。

选择适合自己需求的监控方案,并遵循最佳实践,可以帮助你:

  • 实时掌握容器和应用的运行状态
  • 提前发现并解决潜在问题
  • 快速定位和排查故障
  • 优化资源配置,提高系统可靠性和性能

随着容器技术的不断发展,监控工具和策略也在持续演进,保持对新技术的关注,并不断优化监控系统,是容器化运维的重要工作。

相关推荐
LCMICRO-133108477461 小时前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
Leinwin6 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382506 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇7 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7597 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣7 小时前
智能体选型实战指南
运维·人工智能
yy55277 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ8 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔10 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密10 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器