阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比
摘要: 今天,日志服务再次升级Kubernetes(k8s)的日志解决方案。1分钟内即可完成整个集群部署,支持动态扩容,提供采集宿主机日志、容器日志、容器stdout等所有数据源的一站式采集。
背景
众所周知,Docker很火,Docker中Kubernetes(简称k8s)最火。相对物理机、VM,Docker提供了更加简单、轻量、高性价比的部署与运维方法;而k8s在Docker之上,更进一步提供了对管理基础设施的抽象,形成了真正意义上的一站式部署与运维方案。
k8s提供了强有力工作调度、水平扩展、健康监测、维护高可用性等能力,同时提供了网络、文件系统的抽象与管理,所以对于已有应用上k8s或者基于k8s部署应用十分便捷。但这里有一部分令开发和运维人员比较头疼--日志采集。
难点分析
基于VM或者物理机部署的应用,日志采集相关技术都比较完善,有比较健全的Logstash、Fluentd、FileBeats等。但在Docker中,尤其在k8s中,日志采集并没有很好的解决方案,主要原因如下:
采集目标多:需要采集宿主机日志、容器内日志、容器stdout。针对每种数据源都有对应的采集软件,但缺乏一站式解决方案。
弹性伸缩难:k8s是一个分布式的集群,服务、环境的弹性伸缩对于日志采集带来了很大的困难,采集的动态性以及数据完整性是非常大的挑战。
运维成本大:现有的方案只能使用多种软件组合采集,各个软件组装起来的系统稳定性难以保障,且缺乏中心化的管理、配置、监控手段,运维负担巨大。
侵入性高:Docker Driver扩展需要修改底层引擎;一个Container对应一个采集Agent又会产生资源竞争和浪费。
采集性能低:正常情况下一个Docker Engine会运行数十个甚至数百个Container,此时开源Agent日志采集性能以及资源消耗十分堪忧。
基于阿里巴巴多年来容器服务日志采集的经验积累,并结合阿里云Kubernetes内测以来广大用户的反馈与诉求,今天,日志服务为k8s带来真正意义上的一站式日志解决方案。
方案介绍
方案简介
如上图所示,我们只需要在Kubernetes集群中的每个节点上部署一个Logtail的容器,即可实现该节点上宿主机日志、容器日志、容器stdout等所有数据源的一站式采集。我们针对k8s提供了DaemonSet部署模板,1分钟内即可完成整个集群部署,并且后续集群动态伸缩无需对采集做任何二次部署。具体请参见使用方式章节。
日志服务客户端Logtail目前已有百万级部署,每天采集上万应用、数PB的数据,历经多次双11、双12考验。相关技术分享可以参见文章:多租户隔离技术+双十一实战效果,Polling + Inotify 组合下的日志保序采集方案。
依托阿里云日志服务强大的功能,对于采集到的日志数据,我们提供:
上下文查询,从茫茫数据中快速定位异常数据,并支持定位异常所在Container/Pod的上下文日志
实时的海量数据分析,1秒即可完成1亿条数据的统计分析
自带报表、告警功能,老板、开发、运维全搞定
流计算对接:storm、flink、blink、spark streaming等等都支持
外接可视化:Grafana、DataV轻松对接
日志归档投递:支持投递OSS归档存储,也支持投递MaxCompute进行离线分析
采集方案优势
关于日志服务整体的优势这里不再赘述,本文主要探讨日志服务Kubernetes采集方案的相关优势。这里我们主要总结了以下几点:
方案对比
相对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版本支持简单功能 | 辅助监控软件扩展 |
使用方式
部署k8s的日志采集只需分为3个步骤,1分钟内即可完成集群部署(详细帮助文档参见[k8s采集帮助]()),这可能是你见过的最简单的k8s日志采集部署方案:
部署Logtail的DaemonSet。体力消耗:一条wget名,vi 修改3个参数,执行一条kubectl命令
日志服务控制台创建自定义标识机器组(后续集群动态伸缩无需额外操作)。体力消耗:web控制台点击几次,输入一个ID
日志服务控制台创建采集配置(所有采集均为服务端配置,无需本地运维)。体力消耗:stdout采集 web控制台点击几次;文件采集 web控制台点击几次,输入2个path
除k8s外,日志服务还支持标准docker部署方式
核心技术简介
自定义标识机器组
日志采集支持k8s弹性伸缩的关键就是Logtail的自定义标识机器组。通常采集Agent远程管理的方案都以IP或者hostname作为标识,此方案在集群规模较小以及环境变化性不强的情况下较为适用,当机器规模扩大、弹性伸缩成为常态时运维成本承指数级升高。
基于集团内数年来的Agent运维经验总结,我们设计了一种灵活性更高、使用更加便捷、耦合度更低的配置&机器管理方式:
机器组除支持静态ip设置外,也支持自定义标识的方式:所有Logtail只要定义了该标识则自动关联到对应的机器组。
一个Logtail可属于多个机器组,一个机器组可包含多个Logtail,实现Logtail与机器组的解耦。
一个采集配置可应用到多个机器组,一个机器组可关联多个采集配置,实现机器组与采集配置的解耦。
以上概念映射到k8s中,可实现各种灵活的配置:
一个k8s集群对应一个自定义标识的机器组。同一集群的Logtail使用相同配置,k8s集群伸缩时对应Logtail的DaemonSet自动伸缩,Logtail启动后立即就会获取和该机器组关联的所有配置。
2. 一个k8s集群中配置多种不同采集配置。根据不同Pod需求设置对应的采集配置,所有涉及容器采集的配置均支持IncludeLabel、ExcluseLabel过滤。
3. 同一配置可应用到多个k8s集群。如果您有多个的k8s集群,若其中有部分服务日志采集逻辑相同,您可以将同一配置应用到多个集群,无需额外配置。
容器自动发现
Logtail和很多软件(Logspout、MetricBeats、Telegraf等)一样内置了容器的自动发现机制。当前开源的容器自动发现均采用一次扫描+事件监听的方式,即:初次运行时获取当前所有的容器信息,后续监听docker engine的事件信息,增量更新信息。
此种方式效率相对最高,但有一定概率遗漏部分信息:
获取所有容器信息到docker engine事件监听建立期间的这部分的增量信息会丢失
事件监听可能会因为某些异常情况而终止,终止后到监听重新建立期间的增量信息会丢失
考虑以上问题,Logtail采用了事件监听与定期全量扫描的方式实现容器的自动发现:
首先注册监听事件,其次再全量扫描
每隔一段时间执行一次全量扫描,全量更新meta信息(时间间隔高到对docker engine压力无影响)
容器文件自动渲染
容器日志采集只需要配置容器内的文件路径,并且支持各种采集模式:极简、Nginx模板、正则、分隔符、JSON等。相对传统的绝对路径采集,容器内日志采集动态性极强,为此我们专门实现了一套容器路径的自动匹配与配置渲染方案:
Logtail会根据配置的容器路径,查找容器对应路径在宿主机上的映射关系
根据宿主机路径以及容器的元数据信息(container name、pod、namespace...)渲染出正常的采集配置
Logtail文件采集模块加载渲染的配置并采集数据
当容器销毁时删除相应渲染的配置
可靠性保证
日志采集中的可靠性保证是非常重要也非常困难的工作。在Logtail的设计中,进程退出、异常终止、程序升级被认为是常态,在这些情况发生时Logtail需尽可能保证数据的可靠性。针对容器数据采集的动态特点,Logtail在之前可靠性保证的基础上,新增了容器标准输出以及容器文件的checkpoint维护机制
容器标准输出checkpoint管理
容器stdout和stderr的checkpoint独立保存
checkpoint保存策略:定期dump所有容器当前的checkpoint;配置更新/进程退出时强制保存
配置加载时,默认从checkpoint处开始采集,若无checkpoint,则从5秒前采集
考虑到配置删除时并不会删除checkpoint,后台定期清除无效checkpoint
容器文件checkpoint管理
除文件采集的checkpoint需保存外,还需保存容器meta的映射关系
checkpoint加载前需提前加载容器与文件之间的映射关系
考虑到停止期间无法感知容器状态变化,所以每次启动时会渲染所有当前的配置。Logtail保证多次加载同一容器配置的幂等性。
总结
阿里云日志服务提供的解决方案完美地解决了k8s上日志采集难的问题,从之前需要多个软件、几十个部署流程精简到1款软件、3个操作即可轻松上云,让广大用户真正体验到一个字:爽,从此日志运维人员的生活质量大大提高。
目前Logtail除支持宿主机文件、容器文件、容器stdout采集外,还支持以下多种采集方式(这些方式k8s中均支持):
syslog采集
Mysql binlog采集
JDBC采集
http采集
此外,Logtail即将推出Docker Event、Container Metric采集方式,敬请期待!