采集自动组合(阿里云Kubernetes:日志服务为k8s带来真正意义上的一站式解决方案)

优采云 发布时间: 2021-08-29 16:03

  采集自动组合(阿里云Kubernetes:日志服务为k8s带来真正意义上的一站式解决方案)

  背景

  众所周知,Docker 非常流行,其中 Kubernetes(简称 k8s)是 Docker 中最受欢迎的。与物理机和虚拟机相比,Docker 提供了一种更简单、更轻量、更经济的部署和运维方式;在 Docker 之上,k8s 进一步提供了管理基础设施的抽象,形成了真正的一站式部署和运维解决方案。

  k8s 提供了强大的作业调度、横向扩展、健康监控和高可用维护能力。它还提供了网络和文件系统的抽象和管理,因此在现有应用程序上部署k8s或基于k8s部署应用程序非常方便。但是这里有一个让开发运维人员比较头疼的部分——log采集。

  难点分析

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

  采集 多个目标:需要采集host 日志、容器日志、容器标准输出。每个数据源都有对应的采集软件,但缺乏一站式解决方案。弹性伸缩很难:k8s 是一个分布式集群。服务和环境的弹性伸缩给日志采集带来了很大的困难。 采集 的动态特性和数据完整性是非常大的挑战。运维成本大:现有方案只能使用多个软件组合采集,每个软件组装的系统稳定性难以保证,缺乏集中管理、配置、监控手段,运维负担是巨大的。侵入性强:Docker Driver扩展需要修改底层引擎;一个Container对应一个采集Agent,会造成资源竞争和浪费。 采集低性能:正常情况下,一个Docker Engine会运行几十个甚至上百个Container。这时候开源的Agent日志采集性能和资源消耗都非常堪忧。

  基于阿里巴巴在容器服务日志采集多年的经验积累,结合阿里云Kubernetes内测以来用户的反馈和需求,今天日志服务为k8s计划带来了真正的一站式日志解决方案。

  节目简介节目简介

  

  如上图所示,我们只需要在Kubernetes集群的每个节点上部署一个Logtail容器即可实现主机日志、容器日志、容器标准输出等所有数据源的一站式服务那个节点采集。我们为 k8s 提供了 DaemonSet 部署模板。整个集群部署可以在1分钟内完成,后续集群动态扩展不需要任何二次部署到采集。详情请参考使用章节。

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

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

  上下文查询,从海量数据中快速定位异常数据,支持异常所在Container/Pod上下文日志实时海量数据分析,完成1亿条数据的统计分析1秒。自带报表报警功能,Boss、开发、运维都做流计算对接:storm、flink、blink、spark Streaming等都支持外部可视化:Grafana、DataV轻松对接日志归档投递:支持投递到OSS存档存储,并交付到MaxCompute进行离线分析采集程序优势

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

  

  方案对比

  对比Logstash和Fluentd主流日志采集方法,对比如下:

  logtaillogstashfluentd

  采集method

  主机文件

  支持

  支持

  支持

  容器文件

  支持自动发现

  静态采集

  静态采集

  容器标准输出

  支持自动发现

  插件扩展

  Docker 驱动

  数据处理

  处理方法

  regular、anchor、separator、json的任意组合

  插件扩展

  插件扩展

  自动打标

  支持

  不支持 K8s

  不支持 K8s

  过滤

  常规

  插件扩展

  插件扩展

  配置

  自动更新

  支持

  手动加载

  支持

  服务器配置

  支持

  Beta 版支持简单功能

  辅助管理软件扩展

  性能

  采集performance

  极简核心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控制台点击几次;文件采集网页控制台点击几次,进入2路径核心技术配置文件自定义识别机组

  Log采集 支持k8s弹性伸缩的关键是Logtail的自定义识别机群。通常采集Agent 远程管理解决方案是通过 IP 或主机名来标识的。这种方案更适用于集群较小且环境不是很不稳定的情况。当机器规模扩大,弹性伸缩成为常态时,承担的运维成本将成倍增长。

  在总结集团几年Agent运维经验的基础上,我们设计了一种更灵活、使用更方便、耦合更少的配置&机器管理方式:

  

  除了支持静态ip设置,机器组还支持自定义识别:只要定义了识别,所有Logtail都会自动关联对应的机器组。一个Logtail可以属于多个机器组,一个机器组可以收录多个Logtail,实现Logtail和机器组的解耦。一个采集配置可以应用于多个机器组,一个机器组可以关联多个采集配置,实现机器组和采集配置的解耦。

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

  一个 k8s 集群对应一个带有自定义 logo 的机器组。同一个集群中的Logtail使用相同的配置。 k8s集群扩容时,Logtail对应的DaemonSet会自动扩容。 Logtail 启动后会立即获取与该机器组关联的所有配置。在一个 k8s 集群中配置了多个不同的 采集 配置。根据不同的Pod需求设置相应的采集配置。所有涉及容器采集 的配置都支持 IncludeLabel 和 ExcluseLabel 过滤。相同的配置可以应用于多个 k8s 集群。如果你有多个k8s集群,如果某些服务日志采集有相同的逻辑,你可以将相同的配置应用到多个集群,无需额外配置。自动容器发现

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

  这种方法效率比较高,但是有一定的几率会漏掉一些信息:

  这部分从获取所有容器信息到docker引擎事件监控建立周期的增量信息会丢失。事件监控可能会因某些异常情况而终止。终止后,监控重建期间的增量信息将丢失。

  

  考虑到以上问题,Logtail通过事件监控和定时全扫描实现容器自动发现:

  先注册*敏*感*词*事件,然后每隔一定时间进行一次全量扫描,进行全量扫描,并全量更新元信息(时间间隔足够大,对docker引擎的压力没有影响) 容器文件自动渲染

  容器日志采集只需要配置容器中的文件路径,支持多种采集模式:极简、Nginx模板、正则、分隔符、JSON等。与传统的绝对路径采集相比,容器采集 中的日志是非常动态的。为此,我们实现了一套容器路径自动匹配和配置渲染方案:

  

  Logtail 会根据配置的容器路径在宿主机上寻找容器对应路径的映射关系,并根据宿主机路径和容器的元数据信息(容器名称、 pod, namespace...) 配置Logtail文件采集module加载渲染配置,采集data删除容器销毁时对应的渲染配置。可靠性保证

  log采集中的可靠性保证是一项非常重要也非常艰巨的任务。在Logtail的设计中,进程退出、异常终止、程序升级都被认为是正常情况。当出现这些情况时,Logtail需要尽可能保证数据的可靠性。针对容器数据采集的动态特性,Logtail在之前可靠性保证的基础上增加了容器标准输出和容器文件的checkpoint维护机制

  容器标准输出checkpoint 管理容器stdout和stderr的checkpoint是独立保存的。检查点保存策略:定期转储所有容器的当前检查点;配置更新/进程退出时,加载配置时强制保存,默认从采集checkpoint开始,如果没有checkpoint,从采集前5秒开始,考虑到配置时不会删除checkpoint被删除后,后台会定期清除无效的检查点容器文件。 Checkpoint管理 除了文件采集的checkpoint之外,还需要保存容器meta的映射关系。在加载检查点之前,需要提前加载容器和文件的映射关系。考虑到停止时无法感知容器状态的变化,每次启动都会渲染当前所有的配置。 Logtail 保证了多次加载同一个容器配置的幂等性。总结

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

  目前Logtail除了支持host文件、容器文件、容器stdout采集外,还支持以下采集方法(k8s都支持这些方法):

  syslog采集Mysql binlog采集JDBC采集http采集

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

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

  

  重磅消息:阿里云日志服务存储资源包全新上线,限时优惠50%。详情请点击:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线