一、容器的运行方式与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
欢迎一起交流。转载请注明出处:开普勒鑫球
领取专属 10元无门槛券
私享最新 技术干货