- 大型网站运维:从系统管理到SRE
- 顾贤杰 徐赟 颜中冠
- 978字
- 2021-10-15 18:24:35
3.5 容器监控
随着容器技术的不断成熟和应用,监控系统对容器监控的需求也越来越强烈。提到容器监控,不得不说的是Prometheus,虽然该系统并不只支持容器监控,但其与K8S良好的亲和性,以及符合云原生的设计,在容器监控环境下得到了广泛使用。Prometheus是一款完全开源的监控系统,当前仍由社区推动持续更新,主体使用 Go 语言,没有外部依赖,部署简单轻量,便于运维。Prometheus实现了一套本地时序数据库存储引擎,同时支持驱动远端独立时序数据库实现数据读写。Prometheus定义了一套数据查询语法,称为PromQL。PromQL支持维度过滤、时间选择、查询嵌套、内置功能函数等,能够实现多种多样的时序数据查询需求。
Prometheus定义了监控数据上报格式,其主体是一行包含多维度的单指标数值内容。Prometheus格式监控数据生产端称为Exporter节点,服务端通常使用HTTP,以主动拉取的方式从Exporter节点获得监控数据。Exporter节点的自动发现有多种途径,包括配置文件刷新、Consul服务监听、K8S节点探测等,具体内容和使用方式可以参考官方文档。
Prometheus也能借助其他系统实现很好的监控数据展示和监控报警。监控数据展示主要依托于 Grafana,这是一款类似监控大盘的监控数据展示平台,能够灵活地拼接视图展示页面,并利用PromQL为配置的视图提供监控数据支撑。Prometheus能通过配置报警规则的方式检查数据源健康状态和生成报警事件,但其并不具有复杂的报警管理能力,这部分工作依托AlertManager 来实现。AlertManager 是非常有用的报警功能组件,AlertManager支持报警抑制、报警静默、报警分组等,可以为用户带来更友好的报警体验。
Prometheus面向各种各样的监控场景,虽然在系统设计上存在很强的通用性,但缺少面向业务的功能定制和性能优化。在面临线上环境海量节点的监控场景时,对服务可用性、水平扩展能力、数据有效性等方面的要求也会增加Prometheus服务运维部署的负担。除此之外,Prometheus侧重于提供一套监控解决方案,但缺少对高效运维的支撑。例如,当线上产品有上百个应用和近万个节点时,若脱离其他运维系统,仅使用 Prometheus+Grafana+AlertManager的方式组织这些资源会是一件非常困难的事。
传统监控系统在接入容器资源时或多或少都会存在问题,一方面容器资源存在形式与传统虚拟机大有不同,运维的方式也有很大变化;另一方面,在容器场景下的监控范围不再局限于容器资源本身,还包含容器编排工具,如K8S、Swarn等,这是容器场景下运维最小资源单位被抽象、功能服务相互剥离造成的。新增监控维度会对结构化的监控体系带来冲击,需要基于容器运维经验更合理的监控组合,更全面地支撑容器环境下的服务稳定性。