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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介: 今天,日志服务再次升级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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
17天前
|
JavaScript 前端开发 数据安全/隐私保护
阿里云云效操作报错合集之流水线中获取不到CI_COMMIT_REF_NAME变量,导致docker镜像打包失败,什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5天前
|
Kubernetes Docker 容器
里云容器服务Kubernetes版(ACK)上快速部署应用
里云容器服务Kubernetes版(ACK)上快速部署应用
|
17天前
|
敏捷开发 API 持续交付
阿里云云效产品使用问题之流水线编译docker时,如何把已经定义好的token传入编译参数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用问题之流水线编译docker时,如何把已经定义好的token传入编译参数
|
2天前
|
存储 Kubernetes 负载均衡
|
6天前
|
存储 Kubernetes 负载均衡
容器服务Kubernetes版(ACK)上快速部署应用
在阿里云ACK上快速部署应用,包括创建Kubernetes集群、使用`kubectl`部署或更新应用镜像、配置Ingress与ALB集成。首先开通ACK和ALB服务,然后创建集群。编写`deployment.yaml`和`ingress.yaml`文件,部署应用和设定路由规则。通过ALB控制台配置负载均衡器,最后验证部署是否可通过ALB访问。如遇问题,参考官方文档或寻求阿里云支持。
|
11天前
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
74 2
|
17天前
|
持续交付 开发工具 git
阿里云云效产品使用问题之在云效代码域中gitlab使用docker安装的,迁移时遇到“获取企业信息失败”,是什么原因
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
17天前
|
Kubernetes 网络协议 Docker
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
|
10天前
|
Linux Docker 容器
Docker02--搭建Linux环境,配置Docker,docker images无法访问,因为docker没有启动,阿里云镜像加速器免费的
Docker02--搭建Linux环境,配置Docker,docker images无法访问,因为docker没有启动,阿里云镜像加速器免费的
|
17天前
|
Kubernetes 监控 Java
阿里云云效产品使用问题之进行Kubernetes分批发布时应用名被更改,是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。

相关产品

  • 日志服务