全面提升,阿里云 Docker / Kubernetes(K8S

作者: 阿里云云栖号 | 来源:发表于2018-02-22 13:42 被阅读262次

    摘要: 日志服务再次升级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主流日志采集方式,对比如下:

    使用方式

    部署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运维经验总结,我们设计了一种灵活性更高、使用更加便捷、耦合度更低的配置&机器管理方式:

    1.机器组除支持静态ip设置外,也支持自定义标识的方式:所有Logtail只要定义了该标识则自动关联到对应的机器组。

    2.一个Logtail可属于多个机器组,一个机器组可包含多个Logtail,实现Logtail与机器组的解耦。

    3.一个采集配置可应用到多个机器组,一个机器组可关联多个采集配置,实现机器组与采集配置的解耦。

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

    1.一个K8S集群对应一个自定义标识的机器组。同一集群的Logtail使用相同配置,K8S集群伸缩时对应Logtail的DaemonSet自动伸缩,Logtail启动后立即就会获取和该机器组关联的所有配置。

    2.一个K8S集群中配置多种不同采集配置。根据不同Pod需求设置对应的采集配置,所有涉及容器采集的配置均支持IncludeLabel、ExcluseLabel过滤

    3.同一配置可应用到多个K8S集群。如果您有多个的K8S集群,若其中有部分服务日志采集逻辑相同,您可以将同一配置应用到多个集群,无需额外配置。

    容器自动发现

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

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

    1.获取所有容器信息到docker engine事件监听建立期间的这部分的增量信息会丢失

    2.事件监听可能会因为某些异常情况而终止,终止后到监听重新建立期间的增量信息会丢失

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

    1.首先注册监听事件,其次再全量扫描

    2.每隔一段时间执行一次全量扫描,全量更新meta信息(时间间隔高到对docker engine压力无影响)

    容器文件自动渲染

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

    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中均支持):

    syslog采集

    Mysql binlog采集

    JDBC采集

    http采集

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

    本文作者:木环

    相关文章

      网友评论

        本文标题:全面提升,阿里云 Docker / Kubernetes(K8S

        本文链接:https://www.haomeiwen.com/subject/iowatftx.html