写点什么

360 容器平台基于 Prometheus 的监控实践

2018 年 12 月 12 日

360容器平台基于Prometheus的监控实践

背景


360 在做容器化平台之前,有一个基于小米开源的 Open-Falcon 进行二次开发的老监控系(Wonder),这个系统承揽了公司所有的物理机和虚拟机的监控任务。随着容器技术的普及,以容器的方式在创建应用时,由于 Kubernetes 容器编排系统部署的服务具有弹性扩容的特性,而老的监控系统无法感知这些动态创建的服务,已经不适合容器化的场景,所以 360 团队就搭建了一套可以支持服务发现的新监控系统。


目前 360 一共有 5 个 k8s 线上集群,分布在北京上海和深圳,此外还有一些 GPU 集群。


容器平台构建以后带来了以下几个方面的好处:


  • 节省资源。传统一台物理机只能部署一个实例,虚拟机能部署几个服务,而使用容器一台机器上能部署几十个服务。

  • 提高效率。1. 缩短流程。老系统要增加机器需要提前申请,而使用 Kubernetes 容器平台只要整个资源池里有充足的资源,不用提交预算就可以直接使用。2. 弹性扩容。在流量高峰期,容器平台可以快速扩容;在流量不多的时段,空闲的资源可以处理其他离线任务,对资源的利用率高。

  • 高可用。容器平台可以保证运行的服务数量总是能达到预期。

  • 减轻运维负担。之前所有的部署上线活动都是运维来做。容器平台上线后,开发人员可以直接在程序完成之后将其制作成镜像,自己就可以进行部署。


当然任何事情不可能只有好的一面,容器平台也会带来相应的难度。容器平台对服务的调度具有动态性,这就需要监控系统能动态感知服务实例落在哪里,这是监控工作中的一个难点。


360 容器平台的监控维度


360 容器平台的监控系统对业务的技术指标进行监控,产品是从三个维度进行设计的:


  • 容器: 这是最小的粒度。

  • Pod: 一个 Pod 里面可以有多个容器。

  • 应用: 一个应用里可能会有多个 Pod。


除了这些技术指标监控,360 容器平台的监控系统还支持自定义监控。有些业务可能需要在自己的程序里打点,比如要调第三方接口,查看延时和调用的次数等。大平台上不同业务对数据的需求不同,为了达到业务需求,支持自定义监控还是很必要的。新开发的业务可以在自己的程序里引入 Prometheus 相关的 SDK 进行打点,360 的容器平台就会将这些 metrics 收集上来。


另外,没有使用 Prometheus 的老系统在开发时没有在程序里打点的功能,这时业务可以针对自己的需求以 sidecar 的方式在程序的边缘写 exporter 来采集该进程所有的监控数据,exporter 以 metrics 的形式报告给 Prometheus,Prometheus 进行抓取。


监控系统设计


360 容器平台监控系统架构图如下:



日志监控


360 容器平台监控系统的日志监控使用的是 ELK 技术栈,但是进行了二次开发。团队自己写了 Log controller 组件,该组件会实时地 watch Kubernetes API Server 的 Deployment 资源对象的状态变化。当业务在创建应用时,是以 Kubernetes deployment 的资源对象来创建的。Log controller 会感知到这个资源的创建,知道这个 deployment 下有多少 Pod 已经处于 Ready 状态。当 Log controller 感知到新创建的 Pod 已经处于 Ready 状态以后,会根据用户在创建 Pod 时指定的真实日志收集路径拼接成它在物理机上的绝对路径,然后将组装好的配置并推送到 360 自研的配置中心 QConf 中。


360 在 Kubernetes 集群的每个 Node 节点都会部署一个二次开发的 Logstash,该 Logstash 会定期(每隔十秒或者五秒,时间可配置)去配置中心(Qconf)拉取最新的配置。拉取完配置之后,Logstash 会根据最新的配置把相关的的日志收集到公司的 Qbus(对 Kafka 进行包装的产品)中,也就是数据已经进入到 Kafka 了。之后用户可以在 HULK 私有云平台(内部的私有云平台)开通 ES 服务,对日志进行检索分析或对其他日志指定数据进行监控。


日志监控系统


数据面板


360 容器平台监控系统的数据面板使用的是 Grafana,并对其增加了 LDAP 用户认证。可以显示内存,访问量,SIO, GPU 等监控数据指标。


应用级别基础监控指标:



Pod 级别基础监控指标:



容器级别基础监控指标:



Prometheus 的基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控。不需要任何 SDK 或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如 VM、Docker、Kubernetes 等。输出被监控组件信息的 HTTP 接口被叫做 exporter 。目前常用的组件大部分都有 exporter 可以直接使用,比如 HAproxy、Nginx、MySQL、Linux 系统信息(包括磁盘、内存、CPU、网络等等)。


报警


报警系统使用的是 Prometheus 自带的 Alertmanager 组件,但是对其进行二次开发,集成了 360 自己的报警系统(Qalram),并且可以通过 360 自己的即时通信工具(蓝信)实时接收报警信息,友好方便快捷。


360 容器平台监控系统选型对比


在构建容器平台的过程中,360 团队对监控系统的几种常用的开源方案进行过选型对比,主要调研了 K8s 社区的 Heapster(K8s 安装过程中默认安装的插件)和 Prometheus。


Heapster+InlfuxDB+Heapster 自带报警系统的方案有个缺点:它是针对 K8s 容器级别以及 Code 级别的技术指标监控,无法实现业务系统数据的监控,可扩展性不太友好,并且当未来数量级大时,不方便扩容。


最后团队选择了 Prometheus 云原生监控方案。虽然 Prometheus 在持久化方面做的还不够好,但是 Prometheus 更适合云原生生态。因为容器是动态变化的,微服务架构下一个实例的多个副本也是动态变化的,Prometheus 的 Pull 方式更适合动态变化的场景。


Prometheus 的应用实践


高可用



现在由于每个机房的机器数量不算太多,当前的设计方式是在每个机房部署一套 Prometheus 实例用于抓取目标的监控数据,同时在每个机房的上一层会部署两套 Prometheus 来做高可用(HA). 这样上层的 Prometheus 只要去下层抓取关心的 metrics 就可以。这样做的好处:


  1. 过滤掉上层不关心的监控数据,减轻数据存储的压力。

  2. 对各个机房的数据进行聚合,并统一对外提供统一的报警,视图查询接口。

  3. 由于 promethues 实例运行在本地,本地的磁盘空间有限,默认只保留最近 15 天的监控数据,但是想查询最近一个月,或者半年的数据,这个需求是做不到的。所以将 prometheus 的数据又入到了远程存储 InfluxDB 一份,用于数据的查询使用。


报警


Prometheus 的报警基于配置文件形式的。这种情况下,基础性指标可以产品化。360 团队定制了配置模版,用户只需要填具体的监控值就可以了。


针对业务监控,用户需要学习 Prometheus 的 promQL,这是由于不同的业务监控的需求不同,没有办法给业务统一的产品化服务,只能按业务自己制定报警规则去下发报警。


对于自定义业务,让业务自己写告警,统一的配置文件会上报到 QConf。


运行在两台 Prometheus 机器上 Agent 会实时的 watch 配置中心(Qconf)是否有新的配置生成,如果存在则会 Pull 报警规则,并 reload Prometheus 实例。


为什么要使用开源系统


一般公司都有自研的监控系统,大多数监控系统都是基于开源项目开发的。为什么 360 要使用 Prometheus?


  1. 在 K8s 大规模使用的今天,整个容器云的生态推荐使用 Prometheus。

  2. 节省人力成本。公司开发一套监控系统需要投入人力,如果后期开发人员流失,后期的维护是个大问题。但是使用开源监控系统,在社区活跃的情况下项目也有保证,并且我们也会在使用过程中回馈社区。


360 容器平台监控系统演进方向


目前的监控系统整体架构对于容器平台来说可扩展性比较好。未来随着集群规模不断扩大,单个集群只有一个 Prometheus 实例要处理的 Job 数量爆发时,Prometheus 的性能就会变差。这个时候可以针对不同的任务类型,在一个集群里部署多个 Prometheus,每一个 Prometheus 只关心自己的任务,可控性会大大提升,同时整个架构的横向扩展比较方便。


另外 Prometheus 存在持久化的问题,未来还需要对 Prometheus 进行数据远程存储(在上面的架构图中使用的虚线标注部分)。


除了数据,360 也在探索 AIOps,可以对监控系统收集到的数据进行处理,探索故障定位和根因分析等。


普通团队如何构建监控系统?


360 监控团队认为,公司的监控系统要根据公司的规模和业务场景来定,不可能一套方案直接拿来就直接使用。


对于使用公有云并且规模较小的公司,公有云本身就有监控系统。如果公司自己有服务器,但是量不大,简单搭建一个小型 HA 的监控系统就完全可以满足监控的需求了。架构的演变是随着业务规模的增长而不断的演变改进的。这时就需要根据具体的情况,去选择适合自己平台的架构方案。




作者简介


王希刚,目前在 360 做运维开发工作,有着多年 PaaS 设计及开发经验,对 Kubernetes,Docker 等有较深入的研究。目前主要负责 360 HULK 容器云平台的研发工作。


2018 年 12 月 12 日 15:423859

评论 1 条评论

发布
暂无评论
发现更多内容

为什么开源是基础软件的未来

顾钧

开源 基础软件

思考如何节省时间,节省出时间进行思考

伯薇

思考 时间管理 思考力 工作效率 提升效率

如何无缝的将Flutter引入现有应用?

稻子

flutter ios android 开源 移动应用

Zookeeper选举机制

tunsuy

zookeeper 开源 源码分析 分布式协同

Hadoop集群搭建-01前期准备

虚拟世界的懒猫

hadoop hdfs mapreduce zookeeper centos

跬步贴|5分钟搞定缓存击穿问题

架构师跬步营

容器日志采集利器:Filebeat深度剖析与实践

傅轶

Kubernetes 容器 云原生 日志 Filebeat

从“成为作者”到“立即创作”:开启你的“写作极客”生活

岛乾坤

写作

配置微软Azure大数据HDInsight云集群

虚拟世界的懒猫

microsoft 大数据 微软 azure hdinsght

你真的理解 Java 的基础数据类型吗

Rayjun

Java

万字破解云原生可观测性

谭建

云原生 APM 可观测性 链路追踪 Skywalking

当 Redis 发生高延迟时,到底发生了什么

程序员历小冰

redis Linux 延迟

管理信息系统课程基础知识

Sicolas Flamel

程序员陪娃漫画系列——喂药

孙苏勇

程序员 生活 程序员人生 陪伴 漫画

idea+spring4+springmvc+mybatis+maven实现简单增删改查CRUD

虚拟世界的懒猫

spring mybatis ssm springmvc java8

Hadoop集群搭建-02安装配置Zookeeper

虚拟世界的懒猫

hadoop zookeeper centos7

Hadoop集群搭建-03编译安装hadoop

虚拟世界的懒猫

hadoop centos7

Hadoop集群搭建-04安装配置HDFS

虚拟世界的懒猫

hadoop

Hadoop集群搭建-05安装配置YARN

虚拟世界的懒猫

hadoop

【终于解决】ubuntu19安装nvidia驱动后屏幕亮度默认最亮不可调节

虚拟世界的懒猫

ubuntu 英伟达

做好仓储控制系统(WCS)的关键

阿喜伯

仓储控制系统 WCS

消息队列Kafka - Kafka中的选举

Java收录阁

kafka

centos6搭建NEXUSphp pt私人种子站

虚拟世界的懒猫

centos nexusphp pt bt

利用Translate ToolKit 2.5.0 API构建Flask web app

虚拟世界的懒猫

Python nginx flask uwgsi translate

选赵敏还是选小昭,这可真是个问题 | Decision Tree

张利东

Python 学习 算法 决策树

向 "忙忙碌碌泯然众人" say no

Sicolas Flamel

时间分配 时间管理

程序员,你最重要的选择是和谁结婚,你最重要的能力是赚钱,钱和女友两手抓

陆陆通通

程序员 赚钱 女朋友 找对象

机器学习中常用的处理手段

子夜

学习

张小龙 的 22 年和微信的 8 年

池建强

微信 张小龙

安装VMware16兼容Hyper-v+WSL2+Docker+解决0x80370102报错

虚拟世界的懒猫

Docker vmware vm hyper-v WSL2

让你写出来的代码像诗一样优美!《Java开发手册》PDF下载

Kareza

Java 阿里巴巴 Java规范 Java开发手册

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

360容器平台基于Prometheus的监控实践-InfoQ