为了解决 docker stats 的问题(存储、展示),谷歌开源的 cadvisor 诞生了,cadvisor 不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和 http 接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna 搭配使用。

cAdvisor 可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括 CPU 使用情况、内存使用情况、网络吞吐量及文件系统使用情况。

Cadvisor 使用 Go 语言开发,利用 Linuxcgroups 获取容器的资源使用信息,在 K8S 中集成在 Kubelet 里作为默认启动项,官方标配。

安装

二进制部署

下载二进制:https://github.com/google/cadvisor/releases/latest
本地运行:./cadvisor -port=8080 &>>/var/log/cadvisor.log

使用 docker 部署

1
2
3
4
5
6
7
8
9
10
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 查看指标

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 接口:

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

常见搭配

cAdvisor+Heapster+influxdb

Heapster:在 k8s 集群中获取 metrics 和事件数据,写入 InfluxDBheapster 收集的数据比 cadvisor 多,却全,而且存储在 influxdb 的也少。

Heapster 将每个 Node 上的 cAdvisor 的数据进行汇总,然后导到 InfluxDB

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

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

cAdvisor+Prometheus+Grafana

访问 http://localhost:8080/metrics,可以拿到 cAdvisor 暴露给 Prometheus 的数据