Kubernetes 监控
简介
本文介绍kubernetes的监控方案,先从监控类型讲起,一步步进行演进对比分析。
cAdvisor + Heapster + InfluxDB + Grafana
cAdvisor
- cAdvisor并不是被部署在每个pod中,而是在节点级别上。它能够自动发现计算机上所有正在运行的容器,并收集到诸如内存、CPU等系统网络指标
- 部署在各个节点
Heapster
- Heapster是一个收集者,Heapster可以收集Node节点上的cAdvisor数据,将每个Node上的cAdvisor的数据进行汇总,还可以按照kubernetes的资源类型来集合资源,比如Pod、Namespace,可以分别获取它们的CPU、内存、网络和磁盘的metric。默认的metric数据聚合时间间隔是1分钟。还可以把数据导入到第三方工具(如InfluxDB)
InfluxDB
- InfluxDB(时序数据库),常用的一种使用场景:监控数据统计。每毫秒记录一下电脑内存的使用情况,然后就可以根据统计的数据,利用图形化界面(InfluxDB V1一般配合Grafana)制作内存使用情况的折线图。
- InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
Grafana
- Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。
Kube-state-metrics + Node_exporter + Metric-server + Prometheus + Grafana + AlertManager
Kube-state-metrics
- 通过监听 API Server 生成有关资源对象的状态指标
- 只是简单提供一个 metrics 数据,并不会存储这些指标数据
- 本质上是不断轮询api-server
- 通过比较resource version来保证event的顺序
Node_exporter
- Exporter是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。
- node-exporter用于采集服务器层面的运行指标,包括机器的loadavg、filesystem、meminfo等基础监控,类似于传统主机监控维度的zabbix-agent
- 如果是windows系统,可以使用WMI exporter
- 如果是采集NVIDIA的GPU指标,可以使用prometheus-dcgm
- diskstats 支持 Darwin, Linux
- cpu 支持Darwin, Dragonfly, FreeBSD, Linux, Solaris等
Metric-server
- 是一个集群范围内的资源数据聚合工具,是 Heapster 的替代品,主要给k8s集群内使用,如kubectl,hpa,scheduler等;
- Metrics server定时从Kubelet的Summary API(类似/ap1/v1/nodes/nodename/stats/summary)采集指标信息,这些聚合过的数据将存储在内存中,且以metric-api的形式暴露出去
- metrics-server 只是显示数据,并不提供数据存储服务
- 通过kube-aggregator将请求到api-server的/apis/metrics 转发给Metrics Server
- metric-server是扩展的apiserver,依赖于kube-aggregator,因此需要在apiserver中开启相关参数
- Metrics API 只可以查询当前的度量数据,并不保存历史数据
-
Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护
-
Metrics Server的资源占用量会随着集群中的Pod数量的不断增长而不断上升,因此需要addon-resizer垂直扩缩这个容器
- addon-resizer依据集群中节点的数量线性地扩展Metrics Server,以保证其能够有能力提供完整的metrics API服务
Prometheus
- Prometheus 是一个开源的服务监控系统和时间序列数据库
Grafana
- Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。
AlertManager
- Alertmanager处理客户端应用程序(如Prometheus服务器)发送的警报。它负责重复数据消除、分组,并将它们路由到正确的接收器集成,如email、PagerDuty或opsgenei。它还负责警报的静音和抑制。