写点什么

22 Prometheus 之 Docker 监控简述

  • 2022 年 1 月 22 日
  • 本文字数:2261 字

    阅读完需:约 7 分钟

22 Prometheus之Docker监控简述

Docker 原生监控常用的方式有:docker ps/top/logs、docker stats、DockerRemote API、Docker 伪文件系统。


1.docker stats 该命令默认以流式方式输出,如果想打印出最新的数据并立即退出,可以使用 no-stream=true 参数。可以指定一个已停止的容器,但是停止的容器不返回任何数据。监控容器性能度量指标有多种方法,简单的如通过 Docker 的 CPU、内存、网络及磁盘的使用情况进行监测。


2.Docker Remote API 是一个取代远程命令行界面(rcli)的 REST API,如 curlhttp://127.0.0.1:4243/containers/json。可以使用 API 来获取监控数据并集成到其他系统,注意不要给 Docker daemon 带来性能负担,如果一台主机上有很多容器,频繁地采集可能会占据大量 CPU。


3.伪文件系统。docker stats 的数据来自/sys/fs/cgroup 下的文件:

一般情况下,cgroup 文件夹下的内容包括 CPU、内存、磁盘、网络等信息,下面列出常用的指标说明。

  • devices:设备权限控制。

  • cpuset:分配指定的 CPU 和内存节点。

  • cpu:控制 CPU 占用率。

  • cpuacct:统计 CPU 使用情况。

  • memory:限制内存的使用上限。

  • freezer:冻结(暂停)cgroup 中的进程。

  • net_cls:配合 tc(traffic controller)限制网络带宽。

  • net_prio:设置进程的网络流量优先级。

  • huge_tlb:限制 HugeTLB 的使用。

  • perf_event:允许 Perf 工具基于 cgroup 分组做性能监测。


在 memory 中常用的指标说明如下。

  • memory.usage_in_bytes:已使用的内存量(包含 cache 和 buffer),相当于 used_mem。

  • memory.limit_in_bytes:限制的内存总量(字节),相当于 Linux 的 total_mem。

  • memory.failcnt:申请内存失败次数计数。

  • memory.memsw.usage_in_bytes:已使用的内存和 swap 容量(字节)。

  • memory.memsw.limit_in_bytes:限制的内存和 swap 容量(字节)。

  • memory.memsw.failcnt:申请内存和 swap 失效次数计数。

  • memory.stat:内存相关状态。


DockerStats 是 Docker 本身提供的,用于监控容器资源使用情况,直接输入命令行即可查看,还可提供远程 API 接口,易于操作,但没有图形界面。

Scout 可聚合多主机容器的监控,并且提供告警,但无法显示容器的详细信息,更多的是偏向于主机资源的监控,为收费项目。

Data Dog 监控功能较为强大,可以获得运行和停止的容器计数以及镜像数量等,可整合集群主机数据和容器数据,但使用成本较高。Sensu 监控部署较为复杂。

cAdvisor 可提供数据的可视化界面,并且可监控容器所在宿主机中的资源使用情况。


cAdvisor 为容器用户提供了对其运行容器的资源使用和性能特征的理解。它是一个运行守护程序,用于收集、聚合、处理和导出有关正在运行的容器的信息,同时它消耗的资源也比较少。cAdvisor 不仅可以搜集一台机器上所有运行的容器的信息,还提供基础查询界面和 http 接口,方便其他组件(如 Prometheus)进行数据抓取,或者 cAdvisor+Influxdb+Grafna 搭配使用。可以导出资源使用情况和完整历史资源使用的直方图,通过快速预览压力表(pressure gauge)可了解集群是否需要额外的资源。


但是使用 cAdvisor 也有一定的局限性,即只能监控一个 Docker 主机。对于多节点的场景,就需要在所有的主机上都各安装一个 cAdvisor。另外,在图表中的数据仅仅显示时长为 2 分钟,并没有查看长期数据趋势的方法。它也没有生成告警的机制,如果资源使用率较高则可能存在风险。采用 cAdvisor 与 Prometheus 结合的解决方案是一个非常不错的选择。


只需在宿主机上部署 cAdvisor 容器,用户就可通过 Web 界面或 REST 服务访问当前节点和容器的详尽性能数据(CPU、内存、网络、磁盘、文件系统等)。cAdvisor 支持:

  • 容器基础指标。

  • 容器内进程查看。

  • 容器状态实践。

  • 监控数据 push 到第三方存储介质。

  • 通过 Prometheus 采集自定义指标。

  • 通过容器标签采集应用自定义指标。

  • Collector 可扩展开发其他标准类型,如数据库、Kafka、Redis 等,当前只支持 http 方式采集应用自定义指标。

  • Storage 可扩展开发其他介质。


cAdvisor 主要包括 API 层、Handler、Manager、Collector,具体说明如下:

  • API 层:提供节点信息、容器运行状态信息、自定义指标信息、容器 spec 信息、事件信息、容器进程列表、文件系统信息的查询 API。

  • Handler:提供 rkt、Docker 的容器 spec 以及 Storage 栈信息。内置有 rkt、Docker 的适配器被 Manager 调用。

  • Manager:总控,实例化 Storage,为周期任务,通过 Handler 获取容器列表,自动发现容器的增/删等。

  • Collector:内置两种采集器,即 Prometheus 和自定义指标采集器。


cAdvisor 提供一些运行时参数供用户配置使用:

  • 4 个--volume 挂载操作不能省略,如果不挂载,将无法连接到 Docker deamon,ro 表示只读。

  • --detach 操作是为了在创建后不进入容器内部,让其自动完成监视功能。

  • 在 Ret Hat/CentOS/Fedora 等发行版上需要传递 privileged 参数,因为 SELinux 加强了安全策略:--privileged=true。

  • --storage_duration 保存在内存中的数据时间段长度,默认为 2min,即保存 2 分钟的数据。

  • --allow_dynamic_housekeeping 依据容器的活跃程度,动态调整读取容器监控数据的时间间隔。

  • --global_housekeeping_interval 检测是否有新增容器的时间周期。

  • --housekeeping_interval 统计每个容器数据的时间周期,默认每秒取 1 次数据,取统计到的最近的 60 个数据。


1.cAdvisor+Heapster+influxDB 组合

Heapster 把在 Kubernetes 集群中获取 metrics 和事件数据写入 InfluxDB,Heapster 收集的数据比 cAdvisor 更多更全。也就是 Heapster 将每个节点上的 cAdvisor 的数据进行汇总,然后导入 InfluxDB。

2.cAdvisor+Prometheus+Grafana 组合

通过 Node exporter 抓取物理主机运行的状态,容器则通过 cAdvisor 对 Docker 引擎抓取容器的运行状态,然后汇总到 Prometheus,再通过 AlertManager 实现告警,形成完整的解决方案。


用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
22 Prometheus之Docker监控简述