当前位置:首页 > 问答 > 正文

混合云里用Kubernetes监控那些事儿,怎么做才靠谱又实用

说到在混合云里用Kubernetes监控,这事儿确实挺让人头疼的,你想想,一部分应用跑在自己公司的机房里,另一部分又跑到阿里云、腾讯云这些公有云上,整个环境就像一盘散沙,监控要是没做好,出了问题简直就是灾难,你根本不知道是该找自家运维团队,还是打电话去骂云厂商,怎么把这摊子事儿管明白,做到既靠谱又实用,是关键。

混合云里用Kubernetes监控那些事儿,怎么做才靠谱又实用

最要紧的一点,是别搞一大堆乱七八糟的监控工具,这是很多团队容易踩的坑,看到Prometheus流行就装一个,看到云厂商自带的监控控制台功能挺炫又用上一个,最后可能还有一堆遗留的Zabbix、Nagios,结果就是,运维人员得在好几个屏幕之间来回切换,数据对不上,报警规则还不一样,人都搞晕了,靠谱的做法是,尽可能建立一个统一的监控视图,不是说只能用一种工具,而是要想办法把数据汇集到一个地方来看,你可以把Prometheus作为核心,因为它和Kubernetes是天生的好搭档,不管你的应用是跑在本地机房还是公有云上,都想办法让它们的监控数据(比如指标Metrics)能够被这个中心的Prometheus收集到,对于云厂商提供的监控服务,比如阿里云的云监控,你可以用它的 exporter 或者API,把关键数据抓取到你的Prometheus里,这样一来,你就在一个界面上看到了全局的情况。(这个思路参考了像“Rancher实验室”或“Kubernetes官方博客”中关于多集群管理的讨论)

混合云里用Kubernetes监控那些事儿,怎么做才靠谱又实用

要抓重点,别眉毛胡子一把抓,Kubernetes本身层级就多,从底层的节点(Node),到Pod,再到里面的容器和应用,可监控的点太多了,全监控的话,数据量巨大,成本高,而且噪音太多,真正有用的信号反而被埋没了,实用的策略是分层监控:

  1. 基础设施层:这包括你的物理机、虚拟机(不管是本地的还是云上的),主要看CPU、内存、磁盘空间和网络流量,这部分其实云厂商已经做得不错了,你重点确保这些基础指标是可达、可用的就行。
  2. Kubernetes平台层:这是关键,你要监控节点的状态(是不是Ready)、Pod的运行状态(是不是CrashLoopBackOff了)、API服务器的响应速度等,一个节点突然NotReady,或者一堆Pod老是重启,这肯定是平台出了大问题,需要立刻报警。
  3. 应用层:这是最核心的,因为所有技术栈最终都是为业务应用服务的,你要监控应用的四个黄金指标:延迟(请求响应时间多长)、流量(每秒请求数是多少)、错误(错误率有多高)、饱和度(应用是不是快忙不过来了,比如线程池满了),把这些和应用本身的业务指标(比如订单成功率、支付耗时)结合起来,你才能真正知道你的服务是不是健康的。(“四个黄金指标”的概念在Google SRE的相关书籍和实践中被广泛提及)

再说说报警,报警不能做成“狼来了”,如果你的手机一天到晚响个不停,全是无关紧要的警告,最后你就会麻木,等真的大事发生时,你可能反而忽略了,报警一定要设置得有水平。报警的意义是让人去处理问题,而不是通知人出了问题,要做到这一点,报警规则要精细,不要节点CPU刚冲到80%就报警,可以设置成“连续5分钟超过90%”再报,更关键的是,报警信息必须清晰明了,要直接告诉你:是什么出了问题、出问题的具体对象是哪个、可能的原因是什么、第一步该怎么去查,报警信息应该是“生产环境-用户服务Pod在集群A的Node-3上重启次数5分钟内超过10次,请立即检查该节点资源或服务日志”,而不是简单地发一个“Pod重启频繁”。

日志和链路追踪也得纳入监控体系,当指标报警告诉你某个服务变慢了,你下一步肯定要去看日志和调用链,定位是哪个环节、哪行代码出的问题,在混合云环境下,日志收集会更复杂,因为日志分散在各个地方,实用的办法是使用像Elasticsearch、Fluentd、Kibana(EFK)这样的组合,或者在云上直接用托管的日志服务(如阿里云SLS),但同样要遵循统一收集的原则,把所有环境的日志都汇聚到一个地方进行分析。

在混合云里搞Kubernetes监控,想靠谱又实用,就记住三句话:工具要统一,减少复杂度;监控抓重点,分层看问题;报警要精准,信息够清晰,别追求大而全的完美方案,从一个核心监控平台开始,先把关键的业务应用和Kubernetes平台本身监控起来,保证线上稳定,然后再逐步优化细节,这才是最实在的做法。

混合云里用Kubernetes监控那些事儿,怎么做才靠谱又实用