有道Kubernetes容器API监控系统设计和实践
监控配置和存储部分:一是制定容器服务Service级别监控命名规则:集群.项目.命名空间.服务;(和Kubernetes集群目录树保持一致,方便根据Service生成Pod监控),二是根据Service监控和Kubernetes集群信息动态生成Pod级别监控
监控执行调度器部分不用改动
信息展示部分,增加了趋势图和错误汇总图表
告警部分,和其它告警使用统一告警组。
单API:一个服务只需要加一条case用
多API:如果一个服务需要加多条功能case
docker-dict:告警组,订阅后会收到告警消息
k8s-prod-th:集群
dict:项目
dict:命名空间
data-server:workload名字
data-server-5b7d996f94-sfjwn:Pod名字
{}:接口返回内容,即:response.content
http://dockermonitor.xxx.youdao.com/monitorLog?guid=61bbe71eadf849558344ad57d843409c&name=k8s-prod-th.dict.dict.data-server.data-server-5b7d996f94-sfjwn:告警详细链接
给Pod Monitor(改框架是Java语言编写的),增加一个Java模块,用来同步Kubernetes信息到Pod Monitor中。考虑到修改Pod Monitor中数据这个行为,本身是可以独立于框架的,可以不修改框架任何一行代码就能实现数据动态更新。
对比Pod Monitor数据库和Kubernetes集群中的信息,不一致的数据,通过增删改查DB,增加Pod的监控。由于数据之间存在关联性,有些任务添加完没有例行运行,故采用了方法三。
对比Pod Monitor数据库和Kubernetes集群中的信息,不一致的数据,通过调用Pod Monitor内部接口添加/删除一项监控,然后调接口enable /disable job等。按照可操作性难易, 我们选择了方法三。
对于表中存在要插入Pod的监控信息记录,并且enable状态为1。则认为该Pod的监控不需要改变
对于表中存在要插入Pod的监控信息记录(删除操作并不会删除源数据信息),并且enable状态为0。则认为该Pod的监控已被删除或者被停止。调用删除操作, 清空QRTZ (例行任务插件)表中的响应内容, 调用delete db操作清出监控信息相关表中的内容(使得监控记录不至于一直在增长)
对于表中不存在Pod相关信息记录, 则需要新增加的一个Pod。调用post创建监控任务接口(根据Service监控配置), 并调用get请求设置接口为监控enabled状态。
xx上线误操作
依赖服务xxxlib版本库问题
DNS server解析问题
xxx服务OOM问题
xxx服务堆内存分配不足问题
xx线上压测问题
多个业务服务日志写满磁盘问题
各类功能不可用问题
……
自动同步Kubernetes服务健康检查到docker-monitor系统,保证每一个服务都有监控。
集成到容器监控大盘中,可以利用大盘中Kubernetes资源目录树,更快查找指定服务,以及关联服务的Grafana指标等监控。
自动恢复服务,比如在上线指定时间内,发生API监控告警,则自动回滚到上一版本,我们希望监控不仅能发现问题,还能解决问题。