胡鹏,开鑫金服数据中心资深工程师,负责工程环境的工具和系统建设、开发、维护、预研工作,包括CI、容器、部分IT公共服务和运维工具。微信号是:njhahp,欢迎交流



 

一、容器的运行方式与VM和HOST的差异

 

Kubernetes是现在最流行的容器编排系统,容器与VM和HOST有着显著不同。怎样对k8s平台上的容器进行监控?首先需要注意容器的运行方式与VM和HOST的不同:

 

1. 运行实例从宏观层面迁移到微观层面

容器运行在私有网络中,通常情况下与外部网络隔离。怎样从外部网络进入到容器私有网络、获取容器的监控数据?

 

2. 运行实例从静态、长生命周期转变成动态、短生命周期

HOST和VM一般是静态IP地址,一旦开机、长期运行。而容器的IP是动态分配的,其创建、销毁、扩容、缩容非常频繁。如何及时发现新创建的容器、获取到它们的监控数据、并在仪表盘上恰当的展现出来?

 

二、容器监控方案概述

 

为了解决上述问题,kubernetes、promethues、influxdata等开源组织相继发布了一些容器监控工具和方案。例如:kubernetes 的 heapster+influxdb+grafana,prometheus的prometheus+alertmanager,influxdata的telegraf+influxdb+kapacitor。

 

我采用的是第一种,即: heapster+influxdb+grafana,实现简单、效果较好。

 

其中,heapster是k8s容器状态的收集、导出工具,influxdb是一种时序数据库,grafana是一种数据展示和报警系统。

 


 

heapster能导出当前时间点的所有容器的状态信息,解决了容器监控信息的采集和导出问题;grafana是功能强大的数据展示和报警工具,它的展示系统支持变量、模板、正则匹配、标签等功能,能把瞬息万变的容器信息有效组织、展示出来,报警系统支持多种方式、还可以基于webhook自己开发,实现短信报警等功能。

 

三、容器监控部署概述

(由于字数限制,不详述,具体请参考官方文档;所有组件都基于容器部署)

1. 部署influxdb

https://github.com/influxdata/influxdb

2. 部署heapster

https://github.com/kubernetes/heapster/tree/master/deploy

command加sink参数,包含influxdb的地址、用户名、密码,例如:

--sink=influxdb:http://influxdb.default:8086?db=heapster&user=heapster&pw=1234

3. 部署grafana

https://github.com/grafana/grafana

部署后请设置数据源datasource,加入influxdb。

四、设置仪表盘

Grafana的仪表盘也就是监控数据的展示界面,可以自己设计,还可以导出共享给别人。我设计了一个容器监控的仪表盘,共享在grafana网站上,地址是:

https://grafana.com/dashboards/3649


在namespace下拉框可以选择k8s容器的命名空间,在pod_name下拉框可以选择容器的匹配名称(前面几个字符或者全名都可以)。

五、建立容器报警

我共享的仪表盘含有两个变量:namespace和pod_name,这样的仪表盘叫:模板。Grafana目前不支持在模板里创建报警。为了创建报警,我们需要再建一个不带变量的仪表盘,然后在时序图的Alert菜单里设置报警,设置报警阀值、通道、内容等信息:



六、建立报警一览图

Grafana自带一个报警管理页面:


我们可以设计一个更清楚的报警一览图,可参考我共享的模板,地址是:

https://grafana.com/dashboards/3489


欢迎一起交流。转载请注明出处:开普勒鑫球


Logo

开源、云原生的融合云平台

更多推荐