容器监控实践—cAdvisor

54次阅读

共计 2826 个字符,预计需要花费 8 分钟才能阅读完成。

概述
为了解决 docker stats 的问题 (存储、展示),谷歌开源的 cadvisor 诞生了,cadvisor 不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和 http 接口,方便其他组件如 Prometheus 进行数据抓取,或者 cadvisor + influxdb + grafna 搭配使用。
cAdvisor 可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括 CPU 使用情况、内存使用情况、网络吞吐量及文件系统使用情况
Cadvisor 使用 Go 语言开发,利用 Linux 的 cgroups 获取容器的资源使用信息,在 K8S 中集成在 Kubelet 里作为默认启动项,官方标配。
安装
1. 使用二进制部署
下载二进制:https://github.com/google/cadvisor/releases/latest
本地运行:./cadvisor -port=8080 &>>/var/log/cadvisor.log
2. 使用 docker 部署
docker run \
–volume=/:/rootfs:ro \
–volume=/var/run:/var/run:rw \
–volume=/sys:/sys:ro \
–volume=/var/lib/docker/:/var/lib/docker:ro \
–volume=/dev/disk/:/dev/disk:ro \
–publish=8080:8080 \
–detach=true \
–name=cadvisor \
google/cadvisor:latest
注意:

在 Ret Hat,CentOS, Fedora 等发行版上需要传递如下参数,因为 SELinux 加强了安全策略:

–privileged=true

启动后访问:http://127.0.0.1:8080 查看页面,/metric 查看指标

* 常见指标:http://yjph83.iteye.com/blog/2394091
* 指标分析:https://luoji.live/cadvisor/cadvisor-source-code-metrics-20160927.html`
3.kubernetes 中使用
* Daemonset 部署:https://github.com/google/cadvisor/tree/master/deploy/kubernetes
* kubelet 自带 cadvisor 监控所有节点,可以设置 –cadvisor-port=8080 指定端口(默认为 4194)
* kubernetes 在 2015-03-10 这个提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中 cAdvisor 开始集成在 kubelet 中,目前的 1.6 及以后均存在
注意:
从 v1.7 开始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一个独立的 API 接口:

* Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics

* Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics/cadvisor

cadvisor 监听的端口将在 v1.12 中删除,建议所有外部工具使用 Kubelet Metrics API 替代。

常用搭配
1.cAdvisor+Heapster+influxdb

Heapster:在 k8s 集群中获取 metrics 和事件数据,写入 InfluxDB,heapster 收集的数据比 cadvisor 多,却全,而且存储在 influxdb 的也少。
Heapster 将每个 Node 上的 cAdvisor 的数据进行汇总,然后导到 InfluxDB。

Heapster 的前提是使用 cAdvisor 采集每个 node 上主机和容器资源的使用情况,
再将所有 node 上的数据进行聚合。

这样不仅可以看到 Kubernetes 集群的资源情况,
还可以分别查看每个 node/namespace 及每个 node/namespace 下 pod 的资源情况。
可以从 cluster,node,pod 的各个层面提供详细的资源使用情况。

InfluxDB:时序数据库,提供数据的存储,存储在指定的目录下。
Grafana:提供了 WEB 控制台,自定义查询指标,从 InfluxDB 查询数据并展示。

cAdvisor+Prometheus+Grafana
访问 http://localhost:8080/metrics,可以拿到 cAdvisor 暴露给 Prometheus 的数据
其他内容参考后续的 prometheus 文章
深入解析
cAdvisor 结构图
cadvisor 地址:https://github.com/google/cad…
主函数逻辑:(cadvisor/cadvisor.go)
通过 new 出来的 memoryStorage 以及 sysfs 实例,创建一个 manager 实例,manager 的 interface 中定义了许多用于获取容器和 machine 信息的函数
核心函数:
生成 manager 实例的时候,还需要传递两个额外的参数,分别是

maxHousekeepingInterval:存在内存的时间,默认 60s
allowDynamicHousekeeping:是否允许动态配置 housekeeping,也就是下一次开始搜集容器信息的时间,默认 true

因为需要暴露服务,所以在 handler 文件中,将上面生成的 containerManager 注册进去(cadvisor/http/handler.go),之后就是启动 manager,运行其 Start 方法,开始搜集信息,存储信息的循环操作。
以 memory 采集为例:
具体的信息还是通过 runc/libcontainer 获得,libcontainer 是对 cgroup 的封装。在 /sys/fs/cgroup/memory 中包含大量的了 memory 相关的信息(参考 docker 原生监控文章)

Prometheus 的收集器(cadvisor/metrics/prometheus.go)
更多源码参考文章:https://luoji.live/categories…
总结
优缺点:

优点:谷歌开源产品,监控指标齐全,部署方便,而且有官方的 docker 镜像。
缺点:是集成度不高,默认只在本地保存 1 分钟数据,但可以集成 InfluxDB 等存储

备注:
爱奇艺参照 cadvisor 开发的 dadvisor,数据写入 graphite,
等同于 cadvisor+influxdb,但 dadvisor 并没有开源
container-monitor-book 系列 : https://yasongxu.gitbook.io/container-monitor/

正文完
 0