摘要: 将在QCon上分享的《阿里PB级Kubernetes日志平台建设实践》整理出来,分享给你们。
QCon是由InfoQ主办的综合性技术盛会,每一年在伦敦、北京、纽约、圣保罗、上海、旧金山召开。有幸参加此次QCon10周年大会,做为分享嘉宾在刘宇老师的运维专场发表了《阿里PB级Kubernetes日志平台建设实践》,现将PPT和文字稿整理下来,但愿和更多的爱好者分享。前端
在阿里的十多年中,日志系统伴随着计算形态的发展在不断演进,大体分为3个主要阶段:node
日志不只仅是服务器、容器、应用的Debug日志,也包括各种访问日志、中间件日志、用户点击、IoT/移动端日志、数据库Binlog等等。这些日志随着时效性的不一样而应用在不一样的场景:程序员
在阿里,几乎全部的业务角色都会涉及到各式各样的日志数据,为了支撑各种应用场景,咱们开发了很是多的工具和功能:日志实时分析、链路追踪、监控、数据清洗、流计算、离线计算、BI系统、审计系统等等。其中不少系统都很是成熟,日志平台主要专一于智能分析、监控等实时的场景,其余功能一般打通的形式支持。数据库
目前阿里的日志平台覆盖几乎全部的产品线和产品,同时咱们的产品也在云上对外提供服务,已经服务了上万家的企业。天天写入流量16PB以上,对应日志行数40万亿+条,采集客户端200万,服务数千Kubernetes集群,是国内最大的日志平台之一。 浏览器
日志系统存在了十多年,目前也有很是多的开源的方案,例如最典型的ELK(Elastic Search、Logstash、Kibana),一般一个日志系统具有如下功能:日志收集/解析、查询与检索、日志分析、可视化/告警等,这些功能经过开源软件的组合均可以实现,但最终咱们选择自建,主要有几下几点考虑:安全
围绕着Kubernetes场景的需求,日志平台建设的难点主要有如下几点:服务器
Kubernetes日志数据采集网络
不管是在ITOM仍是在将来的AIOps场景中,日志获取都是其中必不可少的一个部分,数据源直接决定了后续应用的形态和功能。在十多年中,咱们积累了一套物理机、虚拟机的日志采集经验,但在Kubernetes中不能彻底适用,这里咱们以问题的形式展开:架构
问题1:DaemonSet or Sidecar框架
日志最主要的采集工具是Agent,在Kubernetes场景下,一般会分为两种采集方式:
每种采集方式都有其对应的优缺点,这里简单总结以下:
DaemonSet方式 | Sidecar方式 | |
---|---|---|
采集日志类型 | 标准输出+部分文件 | 文件 |
部署运维 | 通常,需维护DaemonSet | 较高,每一个须要采集日志的POD都须要部署sidecar容器 |
日志分类存储 | 通常,可经过容器/路径等映射 | 每一个POD可单独配置,灵活性高 |
多租户隔离 | 通常,只能经过配置间隔离 | 强,经过容器进行隔离,可单独分配资源 |
支持集群规模 | 中小型规模,业务数最多支持百级别 | 无限制 |
资源占用 | 较低,每一个节点运行一个容器 | 较高,每一个POD运行一个容器 |
查询便捷性 | 较高,可进行自定义的查询、统计 | 高,可根据业务特色进行定制 |
可定制性 | 低 | 高,每一个POD单独配置 |
适用场景 | 功能单一型的集群 | 大型、混合型、PAAS型集群 |
在阿里内部,对于大型的PAAS集群,主要使用Sidecar方式采集数据,相对隔离性、灵活性最好;而对与功能比较单一(部门内部/产品自建)的集群,基本都采用DaemonSet的方式,资源占用最低。
问题2:如何下降资源消耗
咱们数据采集Agent使用的是自研的Logtail,Logtail用C++/Go编写,相对开源Agent在资源消耗上具备很是大的优点,但咱们还一直在压榨数据采集的资源消耗,尤为在容器场景。一般,为了提升打日志和采集的性能,咱们都使用本地SSD盘做为日志盘。这里咱们能够作个简答的计算:假设每一个容器挂载1GB的SSD盘,1个物理机运行40个容器,那每台物理机须要40GB的SSD做为日志存储,那5W物理机则会占用2PB的SSD盘。
为了下降这部分资源消耗,咱们和蚂蚁金服团队的同窗们一块儿开发了FUSE的日志采集方式,使用FUSE(Filesystem in Userspace,用户态文件系统)虚拟化出日志盘,应用直接将日志写入到虚拟的日志盘中,最终数据将直接从内存中被Logtail采集到服务端。这种采集的好处有:
问题3:如何与Kubernetes无缝集成
Kubernetes一个很是大的突破是使用声明式的API来完成服务部署、集群管理等工做。但在K8s集群环境下,业务应用/服务/组件的持续集成和自动发布已经成为常态,使用控制台或SDK操做采集配置的方式很难与各种CI、编排框架集成,致使业务应用发布后用户只能经过控制台手动配置的方式部署与之对应的日志采集配置。
所以咱们基于Kubernetes的CRD(CustomResourceDefinition)扩展实现了采集配置的Operator,用户能够直接使用K8s API、Yaml、kubectl、Helm等方式直接配置采集方式,真正把日志采集融入到Kubernetes系统中,实现无缝集成。
对于人才管理有个经典的原则:10我的要用心良苦,100我的要杀伐果断,1000我的要甩手掌柜。而一样对于Logtail这款日志采集Agent的管理也是如此,这里咱们分为3个主要过程:
Kubernetes日志平台架构
上图是阿里Kubernetes日志平台的总体架构,从底到上分为日志接入层、平台核心层以及方案整合层:
日志首先会到达平台提供的实时队列中,相似于Kafka的consumer group,咱们提供实时数据订阅的功能,用户能够基于该功能实现ETL的相关需求。平台最核心的功能包括:
下面咱们从问题排查的角度来具体展开平台提供的核心功能。
PB级日志查询
排查问题的最佳手段是查日志,大部分人脑海中最早想到的是用 grep
命令查找日志中的一些关键错误信息, grep
是Linux程序员最受欢迎的命令之一,对于简单的问题排查场景也很是实用。若是应用部署在多台机器,那还会配合使用pgm、pssh等命令。然而这些命令对于Kubernetes这种动态、大规模的场景并不适用,主要问题有:
咱们在2009年开始在飞天平台研发过程当中,为够解决大规模(例如5000台)下的研发效率、问题诊断等问题,开始研支持超大规模的日志查询平台,其中最主要的目标是“快”,对于几十亿的数据也可以轻松在秒级完成。
日志上下文
当咱们经过查询的方式定位到关键的日志后,须要分析当时系统的行为,并还原出当时的现场状况。而现场其实就是当时的日志上下文,例如:
在Kubernetes的场景中,每一个容器的标准输出(stdout)、文件都有对应的组合方式构成一个上下文分区,例如Namesapce+Pod+ContainerID+FileName/Stdout。
为支持上下文,咱们在采集协议中对每一个最小区分单元会带上一个全局惟一而且单调递增的游标,这个游标对单机日志、Docker、K8S以及移动端SDK、Log4J/LogBack等输出中有不同的形式。
为日志而生的分析引擎
在一些复杂的场景中,咱们须要对日志中的数据进行统计来发现其中规律。例如根据ClientIP进行聚合来查找攻击源IP、将数据聚合计算P99/P9999延迟、从多个维度组合分析等。传统的方式须要配合流计算或离线计算的引擎进行聚合计算,再对接可视化系统进行图形化展现或对接告警系统。这种方式用户须要维护多套系统,数据实时性变差,而且各个系统间的衔接很容易出现问题。
所以咱们平台原生集成了日志分析、可视化、告警等相关的功能,尽量减小用户配置链路。经过多年的实践,咱们发现用户最容易接受的仍是SQL的分析方式,所以咱们分析基于SQL92标准实现,在此基础上扩展了不少针对日志分析场景的高级函数,例如:
智能日志分析
在日志平台上,应用方/用户能够经过日志接入、查询、分析、可视化、告警等功能能够完成异常监控、问题调查与定位。但随着计算形态、应用形态以及开发人员职责的不断演变,尤为在近两年Kubernetes、ServiceMesh、Serverless等技术的兴起,问题的复杂度不断上升,常规手段已经很难适用。因而咱们开始尝试向AIOps领域发展,例如时序分析、根因分析、日志聚类等。
时序分析
根因分析
时序相关的函数主要用来发现问题,而查找问题根源还须要模式分析相关的方法(根因分析,Root Cause Analysis)。例如K8s集群总体Ingress错误率(5XX比例)忽然上升时,如何排查是由于某个服务问题、某个用户引发、某个URL引发、某个浏览器引发、某些地域网络问题、某个节点异常仍是总体性的问题?一般这种问题都须要人工从各个维度去排查,例如:
这种问题的排查在维度越多时复杂度越高,排查时间也越久,可能等到发现问题的时候影响面已经全面扩大了。所以咱们开发了根因分析相关的函数,能够直接从多维数据中定位对目标(例如延迟、失败率等)影响最大的一组(几组)维度组合。
为了更加精确的定位问题,咱们还支持对比两个模式的差别,例现在天发生异常时,和昨天正常的模式进行对比,快速找到问题的缘由;在发布时进行蓝绿对比以及A/B Test。
智能日志聚类
上面咱们经过智能时序函数发现问题、经过根因分析定位到关键的维度组合,但涉及到最终的代码问题排查,仍是离不开日志。当日志的数据量很大时,一次次的手动过滤太过耗时,咱们但愿能够经过智能聚类的方式,把类似的日志聚类到一块儿,最终能够经过聚类后的日志快速掌握系统的运行状态。
上下游生态对接
Kubernetes日志平台主要的目标在解决DevOps、Net/Site Ops、Sec Ops等问题上,然而这些并不能知足全部用户对于日志的全部需求,例如超大规模的日志分析、BI分析、极其庞大的安全规则过滤等。平台的强大更多的是生态的强大,咱们经过对接上下游普遍的生态来知足用户愈来愈多的日志需求和场景。
案例1:混合云PAAS平台日志管理
某大型游戏公司在进行技术架构升级,大部分业务会迁移到基于Kubernetes搭建的PAAS平台上,为提升平台总体的可用性,用户采集混合云架构,对于日志的统一建设与管理存在很大困难:
用户最终选择使用阿里云Kubernetes日志平台的方案,使用Logtail的方案解决采集可靠性问题,经过公网、专线、全球加速的配合解决网络问题,由系统管理员使用DaemonSet统一采集全部系统组件级别的日志,应用方只需使用CRD采集本身的业务日志。对于平台侧,系统管理员能够访问全部系统级别日志,并进行统一的监控和告警;对于应用侧,应用方不只能够查到本身的业务日志,还能访问到和业务相关的中间件、Ingress、系统组件日志,进行全链路的分析。
案例2:二次开发日志管理平台
在阿里有不少大的业务部门但愿基于咱们标准的日志平台进行二次开发,来知足他们部门的一些特殊需求,例如:
这些需求能够基于咱们提供的OpenAPI以及各语言的SDK快速的实现,同时为了减小前端的工做量,平台还提供Iframe嵌入的功能,支持直接将部分界面(例如查询框、Dashboard)直接嵌入到业务部门本身的系统中。
目前阿里Kubernetes日志平台在内外部已经有很是多的应用,将来咱们还将继续打磨平台,为应用方/用户提供更加完美的方案,后续工做主要集中在如下几点:
相关工做与参考
本文做者:元乙
本文为云栖社区原创内容,未经容许不得转载。