全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

背景


众所周知,Docker很火,Docker中Kubernetes(简称k8s)最火。相对物理机、VM,Docker提供了更加简单、轻量、高性价比的部署与运维方法;而k8s在Docker之上,更进一步提供了对管理基础设施的抽象,形成了真正意义上的一站式部署与运维方案。


k8s提供了强有力工作调度、水平扩展、健康监测、维护高可用性等能力,同时提供了网络、文件系统的抽象与管理,所以对于已有应用上k8s或者基于k8s部署应用十分便捷。但这里有一部分令开发和运维人员比较头疼--日志采集。


难点分析


基于VM或者物理机部署的应用,日志采集相关技术都比较完善,有比较健全的Logstash、Fluentd、FileBeats等。但在Docker中,尤其在k8s中,日志采集并没有很好的解决方案,主要原因如下:


  1. 采集目标多:需要采集宿主机日志、容器内日志、容器stdout。针对每种数据源都有对应的采集软件,但缺乏一站式解决方案。
  2. 弹性伸缩难:k8s是一个分布式的集群,服务、环境的弹性伸缩对于日志采集带来了很大的困难,采集的动态性以及数据完整性是非常大的挑战。
  3. 运维成本大:现有的方案只能使用多种软件组合采集,各个软件组装起来的系统稳定性难以保障,且缺乏中心化的管理、配置、监控手段,运维负担巨大。
  4. 侵入性高:Docker Driver扩展需要修改底层引擎;一个Container对应一个采集Agent又会产生资源竞争和浪费。
  5. 采集性能低:正常情况下一个Docker Engine会运行数十个甚至数百个Container,此时开源Agent日志采集性能以及资源消耗十分堪忧。


基于阿里巴巴多年来容器服务日志采集的经验积累,并结合阿里云Kubernetes内测以来广大用户的反馈与诉求,今天,日志服务为k8s带来真正意义上的一站式日志解决方案。


方案介绍


方案简介


全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比


如上图所示,我们只需要在Kubernetes集群中的每个节点上部署一个Logtail的容器,即可实现该节点上宿主机日志、容器日志、容器stdout等所有数据源的一站式采集。我们针对k8s提供了DaemonSet部署模板,1分钟内即可完成整个集群部署,并且后续集群动态伸缩无需对采集做任何二次部署。具体请参见使用方式章节。


日志服务客户端Logtail目前已有百万级部署,每天采集上万应用、数PB的数据,历经多次双11、双12考验。相关技术分享可以参见文章:多租户隔离技术+双十一实战效果Polling + Inotify 组合下的日志保序采集方案


依托阿里云日志服务强大的功能,对于采集到的日志数据,我们提供:


  1. 上下文查询,从茫茫数据中快速定位异常数据,并支持定位异常所在Container/Pod的上下文日志
  2. 实时的海量数据分析,1秒即可完成1亿条数据的统计分析
  3. 自带报表、告警功能,老板、开发、运维全搞定
  4. 流计算对接:storm、flink、blink、spark streaming等等都支持
  5. 外接可视化:Grafana、DataV轻松对接
  6. 日志归档投递:支持投递OSS归档存储,也支持投递MaxCompute进行离线分析


采集方案优势


关于日志服务整体的优势这里不再赘述,本文主要探讨日志服务Kubernetes采集方案的相关优势。这里我们主要总结了以下几点:

全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比


方案对比


相对Logstash、Fluentd主流日志采集方式,对比如下:

logtail

logstash

fluentd

采集方式

宿主机文件

支持

支持

支持

container文件

支持自动发现

静态采集

静态采集

container stdout

支持自动发现

插件扩展

Docker driver

数据处理

处理方式

正则、anchor、分隔符、json任意组合

插件扩展

插件扩展

自动打标

支持

不支持k8s

不支持k8s

过滤

正则

插件扩展

插件扩展

配置

自动更新

支持

手动加载

支持

服务端配置

支持

Beta版本支持简单功能

辅助管理软件扩展

性能

采集性能

极简单核160M/s、正则20M/s

单核2M/s左右

单核3-5M/s

资源消耗

平均CPU 2%、内存 40M

10倍以上性能消耗

10倍以上性能消耗

可靠性

数据保存

支持

插件支持

插件支持

采集点位保存

所有均支持

只支持文件

插件支持

监控

本地监控

支持

支持

支持

服务端监控

支持

Beta版本支持简单功能

辅助监控软件扩展


使用方式


全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比


部署k8s的日志采集只需分为3个步骤,1分钟内即可完成集群部署(详细帮助文档参见k8s采集帮助),这可能是你见过的最简单的k8s日志采集部署方案:


  1. 部署Logtail的DaemonSet。体力消耗:一条wget名,vi 修改3个参数,执行一条kubectl命令
  2. 日志服务控制台创建自定义标识机器组(后续集群动态伸缩无需额外操作)。体力消耗:web控制台点击几次,输入一个ID
  3. 日志服务控制台创建采集配置(所有采集均为服务端配置,无需本地运维)。体力消耗:stdout采集 web控制台点击几次;文件采集 web控制台点击几次,输入2个path



此处为语雀视频卡片,点击链接查看:


核心技术简介


自定义标识机器组


日志采集支持k8s弹性伸缩的关键就是Logtail的自定义标识机器组。通常采集Agent远程管理的方案都以IP或者hostname作为标识,此方案在集群规模较小以及环境变化性不强的情况下较为适用,当机器规模扩大、弹性伸缩成为常态时运维成本承指数级升高。


基于集团内数年来的Agent运维经验总结,我们设计了一种灵活性更高、使用更加便捷、耦合度更低的配置&机器管理方式:


全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比


  1. 机器组除支持静态ip设置外,也支持自定义标识的方式:所有Logtail只要定义了该标识则自动关联到对应的机器组。
  2. 一个Logtail可属于多个机器组,一个机器组可包含多个Logtail,实现Logtail与机器组的解耦。
  3. 一个采集配置可应用到多个机器组,一个机器组可关联多个采集配置,实现机器组与采集配置的解耦。


以上概念映射到k8s中,可实现各种灵活的配置:


  1. 一个k8s集群对应一个自定义标识的机器组。同一集群的Logtail使用相同配置,k8s集群伸缩时对应Logtail的DaemonSet自动伸缩,Logtail启动后立即就会获取和该机器组关联的所有配置。
  2. 一个k8s集群中配置多种不同采集配置。根据不同Pod需求设置对应的采集配置,所有涉及容器采集的配置均支持IncludeLabelExcluseLabel过滤
  3. 同一配置可应用到多个k8s集群。如果您有多个的k8s集群,若其中有部分服务日志采集逻辑相同,您可以将同一配置应用到多个集群,无需额外配置。


容器自动发现


Logtail和很多软件(Logspout、MetricBeats、Telegraf等)一样内置了容器的自动发现机制。当前开源的容器自动发现均采用一次扫描+事件监听的方式,即:初次运行时获取当前所有的容器信息,后续监听docker engine的事件信息,增量更新信息。


此种方式效率相对最高,但有一定概率遗漏部分信息:


  1. 获取所有容器信息到docker engine事件监听建立期间的这部分的增量信息会丢失
  2. 事件监听可能会因为某些异常情况而终止,终止后到监听重新建立期间的增量信息会丢失


全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比


考虑以上问题,Logtail采用了事件监听与定期全量扫描的方式实现容器的自动发现:


  1. 首先注册监听事件,其次再全量扫描
  2. 每隔一段时间执行一次全量扫描,全量更新meta信息(时间间隔高到对docker engine压力无影响)


容器文件自动渲染


容器日志采集只需要配置容器内的文件路径,并且支持各种采集模式:极简、Nginx模板、正则、分隔符、JSON等。相对传统的绝对路径采集,容器内日志采集动态性极强,为此我们专门实现了一套容器路径的自动匹配与配置渲染方案:


全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比


  1. Logtail会根据配置的容器路径,查找容器对应路径在宿主机上的映射关系
  2. 根据宿主机路径以及容器的元数据信息(container name、pod、namespace...)渲染出正常的采集配置
  3. Logtail文件采集模块加载渲染的配置并采集数据
  4. 当容器销毁时删除相应渲染的配置


可靠性保证


日志采集中的可靠性保证是非常重要也非常困难的工作。在Logtail的设计中,进程退出、异常终止、程序升级被认为是常态,在这些情况发生时Logtail需尽可能保证数据的可靠性。针对容器数据采集的动态特点,Logtail在之前可靠性保证的基础上,新增了容器标准输出以及容器文件的checkpoint维护机制


容器标准输出checkpoint管理


  1. 容器stdout和stderr的checkpoint独立保存
  2. checkpoint保存策略:定期dump所有容器当前的checkpoint;配置更新/进程退出时强制保存
  3. 配置加载时,默认从checkpoint处开始采集,若无checkpoint,则从5秒前采集
  4. 考虑到配置删除时并不会删除checkpoint,后台定期清除无效checkpoint


容器文件checkpoint管理


  1. 除文件采集的checkpoint需保存外,还需保存容器meta的映射关系
  2. checkpoint加载前需提前加载容器与文件之间的映射关系
  3. 考虑到停止期间无法感知容器状态变化,所以每次启动时会渲染所有当前的配置。Logtail保证多次加载同一容器配置的幂等性。


总结


阿里云日志服务提供的解决方案完美地解决了k8s上日志采集难的问题,从之前需要多个软件、几十个部署流程精简到1款软件、3个操作即可轻松上云,让广大用户真正体验到一个字:爽,从此日志运维人员的生活质量大大提高。


目前Logtail除支持宿主机文件、容器文件、容器stdout采集外,还支持以下多种采集方式(这些方式k8s中均支持):


  1. syslog采集
  2. Mysql binlog采集
  3. JDBC采集
  4. http采集


此外,Logtail即将推出Docker Event、Container Metric采集方式,敬请期待!


同志们有更多日志服务相关需求或问题请加钉钉群联系:

全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

重磅消息:阿里云日志服务存储资源包全新上线,限时5折,详情请戳: https://promotion.aliyun.com/ntms/act/season-cloudproduct.html?spm=5176.11180114.980124.1.3scCsZ&wh_ttid=pc#floor4

上一篇:不装了、摊牌了,我们要搞事情


下一篇:Python基础——mysql数据库、SQLAlchemy