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

本文涉及的产品
对象存储 OSS,20GB 3个月
文件存储 NAS,50GB 3个月
云备份 Cloud Backup,100GB 3个月
简介: 今天,日志服务再次升级Kubernetes(k8s)的日志解决方案。1分钟内即可完成整个集群部署,支持动态扩容,提供采集宿主机日志、容器日志、容器stdout等所有数据源的一站式采集。

背景


众所周知,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带来真正意义上的一站式日志解决方案。


方案介绍


方案简介


0b93545b-15f6-477f-8561-8c2b817e0b7d.png


如上图所示,我们只需要在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采集方案的相关优势。这里我们主要总结了以下几点:

a51137ce-4726-4820-a725-b17a98b0897a.png


方案对比


相对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版本支持简单功能

辅助监控软件扩展


使用方式


323b5c72-dedf-4392-8b9c-0f505ffbf5eb.png


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


52f3ff90-07c7-43e5-8287-cea95f8e8c71.png


  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. 事件监听可能会因为某些异常情况而终止,终止后到监听重新建立期间的增量信息会丢失


be4b9418-9553-4e2d-83ee-4b09960b18cd.png


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


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


容器文件自动渲染


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


55457191-5780-4b8e-9f92-e749a0dab365.png


  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采集方式,敬请期待!


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

59e270ab-cce1-4f3a-9fd5-1d0f860028f1.png

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
22天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
176 77
|
8天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
60 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
5天前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
51 19
|
30天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
37 5
|
1月前
|
Kubernetes 监控 云计算
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
1月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
53 1
|
1月前
|
Kubernetes 开发者 Docker
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
4月前
|
存储 Kubernetes Linux
在Linux中,如何使用Docker和Kubernetes管理容器?
在Linux中,如何使用Docker和Kubernetes管理容器?
|
6月前
|
运维 Kubernetes 持续交付
Docker与Kubernetes:容器化技术的黄金搭档
【6月更文挑战第10天】Docker和Kubernetes是容器化技术的黄金组合,Docker提供轻量级、可移植的容器引擎,简化应用部署,而Kubernetes作为容器编排系统,实现自动化部署、扩展和管理,确保高可用性和可扩展性。两者的协作使得容器化应用更高效、可靠,共同推动软件开发和运维的创新。
|
Kubernetes 调度 Apache
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
382 0

相关产品

  • 日志服务