07.容器监控
容器监控完全指南:从基础到实战
文章目录
- 容器监控完全指南:从基础到实战
- 一、容器监控基础概念
- 1.1 为什么需要容器监控?
- 1.2 容器监控的核心指标
- 二、Docker 原生监控命令
- 2.1 查看容器基本状态
- 2.2 查看容器资源使用历史
- 2.3 查看容器日志(间接监控)
- 2.4 查看容器进程信息
- 2.5 检查容器健康状态
- 三、进阶监控工具:cAdvisor
- 3.1 安装和运行 cAdvisor
- 3.2 使用 cAdvisor 监控容器
- 四、企业级监控方案:Prometheus + Grafana
- 4.1 部署 Prometheus + Grafana + cAdvisor
- 4.2 配置 Prometheus
- 4.3 启动监控栈
- 4.4 配置 Grafana 可视化
- 4.5 常用 PromQL 查询示例
- 4.6 配置告警规则
- 五、Kubernetes 容器监控
- 5.1 Kubernetes 监控架构
- 5.2 使用 Helm 部署监控栈
- 5.3 访问 Kubernetes 中的监控界面
- 5.4 Kubernetes 常用监控指标
- 六、容器监控最佳实践
- 6.1 选择合适的监控粒度
- 6.2 确定关键监控指标
- 6.3 设置合理的告警阈值
- 6.4 日志与监控结合
- 6.5 定期审查和优化监控策略
- 七、常见问题与解决方案
- 7.1 监控数据不完整或缺失
- 7.2 监控系统占用过多资源
- 7.3 告警风暴
- 7.4 容器快速销毁导致监控数据不完整
- 八、总结
容器技术的普及带来了部署效率的提升,但也增加了监控的复杂性。与传统服务器监控不同,容器具有生命周期短、动态迁移、资源隔离等特点,需要专门的监控策略和工具。本文将从基础命令到高级监控系统,全面讲解容器监控的实现方法。
一、容器监控基础概念
1.1 为什么需要容器监控?
容器环境相比传统环境更复杂,主要体现在:
- 容器生命周期短,可能频繁创建和销毁
- 容器密度高,一台物理机可能运行数百个容器
- 资源隔离严格,需要监控容器级别的 CPU、内存等使用情况
- 容器间网络复杂,需要监控容器间通信
有效的容器监控可以帮助我们:
- 实时了解容器运行状态
- 提前发现并解决资源瓶颈
- 快速定位故障根源
- 优化资源配置,降低成本
1.2 容器监控的核心指标
容器监控需要关注的关键指标可分为四大类:
指标类型 | 核心指标 | 说明 |
---|---|---|
资源使用率 | CPU 使用率、内存使用量、内存使用率、磁盘 I/O、网络 I/O | 反映容器对宿主机资源的占用情况 |
容器状态 | 运行状态、启动时间、重启次数、健康状态 | 反映容器本身的生命周期和健康状况 |
应用性能 | 响应时间、错误率、请求量 | 反映容器内运行的应用程序性能 |
宿主机状态 | 整体 CPU、内存、磁盘使用率,节点健康状态 | 反映容器运行的底层环境状况 |
二、Docker 原生监控命令
Docker 自带了一些基础命令,可以快速查看容器的运行状态和资源使用情况,适合简单场景和临时排查问题。
2.1 查看容器基本状态
# 列出所有容器(包括停止的)
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 查看容器资源使用历史
# 查看容器的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 查看容器日志(间接监控)
# 查看容器日志(前面章节已详细介绍)
docker logs <容器ID或名称># 实时跟踪日志并显示时间戳
docker logs -f -t <容器ID或名称># 查看最后100行日志
docker logs --tail 100 <容器ID或名称>
2.4 查看容器进程信息
# 查看容器内运行的进程
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 检查容器健康状态
如果容器定义了健康检查,可以通过以下命令查看:
# 查看容器健康状态
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
# 使用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 监控容器
-
访问 cAdvisor 的 Web 界面:
http://<宿主机IP>:8080
-
cAdvisor 提供的主要信息:
- 主机概览:显示宿主机的总体资源使用情况
- 容器列表:显示所有容器及其基本资源使用情况
- 容器详情:点击特定容器可以查看详细指标
- 指标图表:CPU、内存、网络、磁盘 I/O 等指标的历史趋势
-
通过 API 获取监控数据:
# 获取所有容器的基本信息 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 快速部署:
version: '3.8'services:# cAdvisor负责收集容器指标cadvisor:image: gcr.io/cadvisor/cadvisor:latestcontainer_name: cadvisorrestart: alwaysvolumes:- /:/rootfs:ro- /var/run:/var/run:ro- /sys:/sys:ro- /var/lib/docker/:/var/lib/docker:roports:- "8080:8080"networks:- monitoring# Prometheus负责存储和查询指标prometheus:image: prom/prometheus:latestcontainer_name: prometheusrestart: alwaysvolumes:- ./prometheus.yml:/etc/prometheus/prometheus.yml- prometheus_data:/prometheuscommand:- '--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:- monitoringdepends_on:- cadvisor# Grafana负责可视化和告警grafana:image: grafana/grafana:latestcontainer_name: grafanarestart: alwaysvolumes:- grafana_data:/var/lib/grafanaenvironment:- GF_SECURITY_ADMIN_USER=admin- GF_SECURITY_ADMIN_PASSWORD=admin- GF_USERS_ALLOW_SIGN_UP=falseports:- "3000:3000"networks:- monitoringdepends_on:- prometheusnetworks:monitoring:driver: bridgevolumes:prometheus_data:grafana_data:
4.2 配置 Prometheus
创建prometheus.yml
配置文件:
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 启动监控栈
# 启动所有服务
docker-compose up -d# 查看服务状态
docker-compose ps# 查看日志
docker-compose logs -f
4.4 配置 Grafana 可视化
- 访问 Grafana:
http://<宿主机IP>:3000
,使用用户名admin
和密码admin
登录 - 添加 Prometheus 数据源:
- 点击左侧菜单的 “Configuration” -> “Data Sources”
- 点击 “Add data source”,选择 “Prometheus”
- 在 “URL” 字段输入
http://prometheus:9090
- 点击 “Save & Test”,确认连接成功
- 导入容器监控仪表盘:
- 点击左侧菜单的 “+” -> “Import”
- 输入仪表盘 ID:
893
(这是一个受欢迎的 Docker 监控仪表盘) - 选择刚刚添加的 Prometheus 数据源
- 点击 “Import”
- 查看监控仪表盘:
- 导入成功后,你将看到一个包含多个面板的仪表盘
- 面板包括:容器列表、CPU 使用率、内存使用量、网络 I/O、磁盘 I/O 等
- 可以通过右上角的时间范围选择器调整时间范围
4.5 常用 PromQL 查询示例
PromQL 是 Prometheus 的查询语言,以下是一些常用的容器监控查询:
# 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 中配置告警规则,当指标超过阈值时触发告警:
- 创建
alert.rules.yml
文件:
groups:
- name: container_alertsrules:- alert: HighCpuUsageexpr: sum(rate(container_cpu_usage_seconds_total{name=~".+"}[5m])) by (name) * 100 > 80for: 5mlabels:severity: warningannotations:summary: "High CPU usage for container {{ $labels.name }}"description: "Container {{ $labels.name }} has high CPU usage (current value: {{ $value }})"- alert: HighMemoryUsageexpr: (container_memory_usage_bytes{name=~".+"} / container_spec_memory_limit_bytes{name=~".+"}) * 100 > 90for: 5mlabels:severity: criticalannotations:summary: "High memory usage for container {{ $labels.name }}"description: "Container {{ $labels.name }} has high memory usage (current value: {{ $value }})"
- 在
prometheus.yml
中添加规则文件:
rule_files:- "alert.rules.yml"
- 配置 Alertmanager(需要额外部署)来处理和发送告警。
五、Kubernetes 容器监控
在 Kubernetes 环境中,容器监控更加复杂,通常使用以下方案:
5.1 Kubernetes 监控架构
Kubernetes 监控通常包含以下组件:
- kube-state-metrics:收集 Kubernetes 对象的状态指标
- node-exporter:收集节点的硬件和操作系统指标
- cAdvisor:内置在 kubelet 中,收集容器指标
- Prometheus:收集和存储所有指标
- Grafana:可视化指标和创建仪表盘
5.2 使用 Helm 部署监控栈
# 添加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 中的监控界面
# 端口转发访问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 常用监控指标
# 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 监控栈,有多种工具和方案可供选择。
选择适合自己需求的监控方案,并遵循最佳实践,可以帮助你:
- 实时掌握容器和应用的运行状态
- 提前发现并解决潜在问题
- 快速定位和排查故障
- 优化资源配置,提高系统可靠性和性能
随着容器技术的不断发展,监控工具和策略也在持续演进,保持对新技术的关注,并不断优化监控系统,是容器化运维的重要工作。