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 监控栈,有多种工具和方案可供选择。

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

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

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

相关推荐
zcz16071278212 小时前
自动化运维工具 Ansible 集中化管理服务器
linux·运维·服务器
三坛海会大神5552 小时前
Ansible详解(一)Ansible简介和基础命令及操作
运维·ansible
東雪蓮☆2 小时前
Ansible Playbook 编写与模块详解
linux·运维·网络·ansible
和光同尘20232 小时前
CentOS7搭建ELK日志分析系统
运维·elasticsearch·云原生·kubernetes·centos·kibana·logstash
苦逼IT运维2 小时前
Windows 作为 Ansible 节点的完整部署流程(含 Docker 部署 Ansible)
windows·docker·ansible
科技那些事儿3 小时前
海外代理IP软件哪家好?高性价比海外代理IP服务商平台
服务器·网络·tcp/ip
神秘面具男033 小时前
NFS 服务器 iSCSI 服务器
运维·服务器
iconball3 小时前
个人用云计算学习笔记 --17(DNS 服务器)
linux·运维·笔记·学习·云计算
iconball3 小时前
个人用云计算学习笔记 --16(DHCP 服务器)
linux·运维·笔记·学习·云计算