Kubernetes日志收集的那些套路(1)

syslog 14.9 MB/s

json-file 37.9 MB/s

能不能找到不通过Docker Daemon收集日志直接将日志内容重定向到文件并自动rotate的工具呢?答案是肯定的采用S6[2]基底镜像。

S6-log将CMD的标准输出重定向到/…/default/current,而不是发送到 Docker Daemon,这样就避免了Docker Daemon收集日志的性能瓶颈。本文就是采用S6基底镜像构建应用镜像形成统一日志收集方案。

关于Kubernetes日志

Kubernetes日志收集方案分成三个级别:

应用(Pod)级别

Pod级别的日志,默认是输出到标准输出和标志输入,实际上跟Docker容器的一致。使用kubectl logs pod-name -n namespace查看,具体参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs。

节点级别

Node级别的日志 , 通过配置容器的log-driver来进行管理,这种需要配合logrotare来进行,日志超过最大限制,自动进行rotate操作。

160044a502c3e25fe398a15a8411a5a9.png

集群级别

集群级别的日志收集,有三种。

节点代理方式,在Node级别进行日志收集。一般使用DaemonSet部署在每个Node中。这种方式优点是耗费资源少,因为只需部署在节点,且对应用无侵入。缺点是只适合容器内应用日志必须都是标准输出。

042c5460957b3e56d3facbe3a333d49f.png

使用sidecar container作为容器日志代理,也就是在Pod中跟随应用容器起一个日志处理容器,有两种形式:

一种是直接将应用容器的日志收集并输出到标准输出(叫做Streaming sidecar container),但需要注意的是,这时候,宿主机上实际上会存在两份相同的日志文件:一份是应用自己写入的;另一份则是sidecar的stdout和stderr对应的JSON文件。这对磁盘是很大的浪费,所以说,除非万不得已或者应用容器完全不可能被修改。

d0f99e99a75c63355666b6b1a1ffc95f.png

另一种是每一个Pod中都起一个日志收集agent(比如Logstash或Fluebtd)也就是相当于把方案一里的logging agent放在了Pod里。但是这种方案资源消耗(CPU,内存)较大,并且日志不会输出到标准输出,kubectl logs会看不到日志内容。

28e9c1baf5c9e0968da424c0f35db23a.png

应用容器中直接将日志推到存储后端,这种方式就比较简单了,直接在应用里面将日志内容发送到日志收集服务后端。

ae41dd42855d3ced45155d211fb24981.png

日志架构

通过上文对Kubernetes日志收集方案的介绍,要想设计一个统一的日志收集系统,可以采用节点代理方式收集每个节点上容器的日志,日志的整体架构如图所示:

0dcde796230f1d0312253121779dc607.png

解释如下:

  1. 所有应用容器都是基于S6基底镜像的,容器应用日志都会重定向到宿主机的某个目录文件下比如/data/logs/namespace/appname/podname/log/xxxx.log

  2. log-agent内部包含Filebeat,Logrotate等工具,其中Filebeat是作为日志文件收集的agent

  3. 通过Filebeat将收集的日志发送到Kafka

  4. Kafka在讲日志发送的ES日志存储/kibana检索层

  5. Logstash作为中间工具主要用来在ES中创建index和消费Kafka的消息

整个流程很好理解,但是需要解决的是:

  1. 用户部署的新应用,如何动态更新Filebeat配置

  2. 如何保证每个日志文件都被正常的rotate

  3. 如果需要更多的功能则需要二次开发Filebeat,使Filebeat支持更多的自定义配置

付诸实践

解决上述问题,就需要开发一个log-agent应用以DaemonSet形式运行在Kubernetes集群的每个节点上,应用内部包含Filebeat,Logrotate和需要开发的功能组件。

如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

第一个问题,如何动态更新Filebeat配置,可以利用http://github.com/fsnotify/fsnotify工具包监听日志目录变化create、delete事件,利用模板渲染的方法更新Filebeat配置文件。

第二个问题,利用http://github.com/robfig/cron工具包创建CronJob,定期rotate日志文件,注意应用日志文件所属用户,如果不是root用户所属,可以在配置中设置切换用户。

/var/log/xxxx/xxxxx.log {

su www-data www-data

missingok

notifempty

size 1G

copytruncate

}

第三个问题,关于二次开发filebeat,可以参考博文:https://www.jianshu.com/p/fe3ac68f4a7a

总结

本文只是对Kubernetes日志收集提供了一个简单的思路,关于日志收集可以根据公司的需求,因地制宜。

相关链接:

  1. https://docs.docker.com/v17.09/engine/admin/logging/overview/

  2. http://skarnet.org/software/s6/

你还有什么想要补充的吗?

往期推荐

这是什么神仙公司?居然公布离职员工信息,还给差评?

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值