Kubernetes内部监控集成: Grafana+Heapster+Influxdb

2018-06-03 Update: 在官方发布1.10.0 版本的ChangeLog中,--cadvisor-port被标记为Deprecation,其将于 1.12 版本中被默认置为关闭(可手动开启), 并在 1.13 版本中被移除.

简介

容器的出现使得应用服务变得更加扁平易扩展,从而导致监控对象的碎片化,使得监控实现更加困难.

得益于 Kubernetes / Swarm / Rancher / Mesos 等编排技术的出现,让开发人员有了相对统一的手段去监控这些运行在容器的服务,并收集数据.

而 Kubernetes 通过建立抽象层,比如 pods 和 services, 简化了容器的管理,让我们无需关心容器运行过程和它的资源消耗.但为了确保集群更安全,应用服务更高性能,因此我们需要监控我们的应用,容器,以及 Kubernetes 本身.

当下对于容器监控的主流方法是用来自的谷歌的 cAdvisor 搜集数据.

cAdvisor是一个用Go编写的服务,它会收集当前节点以及运行容器的监控数据: cpu, memory, filesystem, network, uptime

Kubernetes 的 kubelet 组件自 1.0 正式版本起就集成了cAdvisor这个容器监控的服务,并提供了--cadvisor-port参数,默认是4194.

因此只要是 Kubernetes 中的 Node,并且向外暴露了端口,则都可以通过 http://<hostname>:<port> 访问其 Web 页面,查看该节点的情况,也可以使用 REST API:http://<hostname>:<port>/api/<version>/<request> 自行调用需要的数据展示.

有了监控数据的入口,则需要相应的工具组合,使得监控数据能更快速的收集,更安全的存储,更优雅的展示,即后端存储+数据可视化. Kubernetes 官方也推荐了一套工具来实现这些需求,就那就是: Grafana+Heapster+InfluxDB

数据采集者 Heapster

Doc: https://github.com/kubernetes/heapster/blob/master/docs/model.md

Metrics: https://github.com/kubernetes/heapster/blob/master/docs/storage-schema.md

Heapster 服务首先从 Kubenretes Master 获取集群中所有 Node 的信息,然后通过这些 Node 上的 kubelet 的获取有用数据,而 kubelet 本身的数据则是从 cAdvisor 得到.

Heapster 支持提取长达15分钟的数据,所有获取到的数据都被推到 Heapster 配置的后端存储中,如 InfluxDB , 默认 Metric 数据聚合时间间隔是1分钟, 指定--metric_resolution参数可以自定义数据收集间隔.

时序数据库 InfluxDB

InfluxDB 是一个开源的时序数据库,同样是由 Go 编写.

时序数据库关键一点就是数据字段中必然包含 Timestamp, 并以 Timestamp 顺序进行存储,它代表了该时刻的一些指标,比如 CPU 使用率, 内存使用率, IOPS等等.

InfluxDB它有三大特性:

  1. 时序(Time Series): 与时间相关的函数的灵活使用(诸如最大、最小、求和等)

  2. 度量(Metrics): 对实时大量数据进行计算

  3. 事件(Event): 支持任意的事件数据

同时,它有以下几大特点:

  • schemaless(无结构),支持任意数量的列

  • min, max, sum, count, mean, median 一系列函数,方便统计

  • 原生 HTTP 服务支持, 可以通过 HTTP 读写

  • 支持强大的查询语句

  • 自带管理工具

数据可视化 Grafana

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

  1. 展示方式: 快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图 / 折线图 / 图表等多种展示方式

  2. 数据源: Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等

  3. 通知提醒: 以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack, PagerDuty等获得通知

  4. 混合展示: 在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源

  5. 注释: 使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记

  6. 过滤器: Ad-hoc 过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询

部署

curl -O https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/grafana.yaml

curl -O https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml

curl -O https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml

curl -O https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml

可以修改 influxdb.yaml 中的volumes字段的值,设置为本地目录挂载或远程NFS挂载等.

然后可以修改 grafana.yaml 中 Service 的 Port,设置为指定的端口,或暴露类型.

最后使用用命令kubectl apply -f . 创建所有对象.