准备

关于容器日志

Docker 的日志分为两类,一类是 Docker 引擎日志;另一类是容器日志。引擎日志一般都交给了系统日志,不同的操作系统会放在不同的位置。

本文主要介绍容器日志,容器日志可以理解是运行在容器内部的应用输出的日志,默认情况下,docker logs 显示当前运行的容器的日志信息,内容包含 STOUT(标准输出) 和 STDERR(标准错误输出)。日志都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log,不过这种方式并不适合放到生产环境中。

  • 默认方式下容器日志并不会限制日志文件的大小,容器会一直写日志,导致磁盘爆满,影响系统应用。(docker log-driver 支持log文件的rotate)

  • Docker Daemon 收集容器的标准输出,当日志量过大时会导致 Docker Daemon 成为日志收集的瓶颈,日志的收集速度受限。

  • 日志文件量过大时,利用docker logs -f查看时会直接将 Docker Daemon 阻塞住,造成docker ps等命令也不响应。

Docker 提供了 logging drivers 配置,用户可以根据自己的需求去配置不同的log-driver,可参考官网 Configure logging drivers 。但是上述配置的日志收集也是通过Docker Daemon收集,收集日志的速度依然是瓶颈。

log-driver 日志收集速度
syslog 14.9 MB/s
json-file 37.9 MB/s

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

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

关于k8s日志

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

  1. 应用(Pod)级别

  2. 节点级别

  3. 集群级别

  • 应用(Pod)级别

Pod 级别的日志 , 默认是输出到标准输出和标志输入,实际上跟docker 容器的一致。使用 kubectl logs pod-name -n namespace 查看,具体参考。

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs

  • 节点级别

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

  • 集群级别

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

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

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

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

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

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

日志架构

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

解释如下:

  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形式运行在k8s集群的每个节点上,应用内部包含filebeat,logrotate,和需要开发的功能组件。

第一个问题,如何动态更新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-datamissingoknotifemptysize 1Gcopytruncate}

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

总结

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

参考文献

  1. https://kubernetes.io/docs/concepts/cluster-administration/logging/

  2. https://support.rackspace.com/how-to/understanding-logrotate-utility/

  3. https://github.com/elastic/beats/tree/master/filebeat

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

来源:https://zhuanlan.zhihu.com/p/70662744

Kubernetes 日志收集的原理,看这一篇就够了相关推荐

  1. Eureka原理看这一篇就够了

    目录 1.服务发现概念 2.服务发现解决的问题 2.1.解耦.屏蔽程序之间IP及端口依赖 2.2.动态管理服务状态 3.Eureka是如何设计服务发现 3.1.同一管理中心 3.2.基本概念 3.3. ...

  2. 深度好文:云网络丢包故障定位,看这一篇就够了~

    深度好文:云网络丢包故障定位,看这一篇就够了~ https://mp.weixin.qq.com/s/-Q1AkxUr9xzGKwUMV-FQhQ Alex 高效运维 今天 来源:本文经授权转自公众号 ...

  3. 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了

    6000字大章带你死磕Golang Gin中间件 在Gin的整个实现中,中间件可谓是Gin的精髓.一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且 ...

  4. 如何应对大数据分析工程师面试Spark考察,看这一篇就够了

    作者丨斌迪.HappyMint 来源丨大数据与人工智能(ID:ai-big-data) [导读]本篇文章为大家带来spark面试指南,文内会有两种题型,问答题和代码题,题目大部分来自于网络上,有小部分 ...

  5. 技术交底书怎么撰写?看这一篇就够了

    文章目录 技术交底书怎么撰写?看这一篇就够了 专利技术交底书格式 1. 发明(或实用新型 以下同)的名称 2. 技术领域 3. 背景技术 4. 发明内容 5. 附图说明 6. 具体实施方式 技术交底书 ...

  6. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

  7. serviceloader java_【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  8. 聊聊Java8之后的JDK升级内容(看这一篇就够了)

    聊聊Java8之后的JDK升级内容(看这一篇就够了) 背景 从 JDK 8 到 JDK 17 的新特性 JDK8 回顾 JDK9 JDK10 JDK11 JDK12 JDK13 JDK14 JDK15 ...

  9. nmn修复脑神经是真的吗,nmn到底有没有效,看这一篇就够了

    nmn修 复脑神经是真的吗,nmn到底有没有 效,看这一篇就够了!<国际分子科学杂 志>文章指出,补充NMN可保护大脑海马脑区的神经元,提高其生存能力并促 进再 生,从而防止大脑海马区萎缩 ...

最新文章

  1. Map Reduce Shuffle
  2. sqlite3 解决并发读写冲突的问题
  3. 德国再出颠覆性发明,这次要安排我们的快递
  4. zlib / win10 下 vs2019 编译 zlib 的方法
  5. WORD如何修改自动编号的起始编号值?
  6. 小练习-----银行提款机系统
  7. 容器访问宿主机数据库_docker从容器中怎么访问宿主机
  8. 修改linux端口22,修改LINUX 默认的22端口
  9. token怎么获取 php,如何用php获取某个页面中的input的csrf_token?
  10. 基于海量特征向量数据搜索引擎(达到毫秒级)
  11. 基本DOS命令——文件操作
  12. 谷歌,微软,阿里,美团实习生面经
  13. java导航网站_java导航网站
  14. 紫罗兰永恒花园rust简谱_【口琴谱/简谱】エイミー(紫罗兰永恒花园外传主题曲)...
  15. RabbitMq Direct exchange路由模型
  16. 《第1阶段》——正交试验法
  17. css文字超出省略号代替不起作用解决方法汇总大全
  18. 华为交换机板卡端口型号对照
  19. 没有比心更高的山,没有比脚更远的路
  20. NYOJ 会场安排问题

热门文章

  1. css就近原则_「Web前端开发进阶篇」CSS优先级
  2. python第三方库jieba下载_Python第三方库____jieba
  3. linux环境对apk文件写入数据,Linux下7zip命令apk中插入文件标识渠道批量打包
  4. mysql 复合索引 in,MySQL复合索引比主键索引还快,为什么?
  5. poj1603(Flody算法)
  6. [NOI2015]程序自动分析
  7. trie树上值域化建主席树 查询异或平移最小值 ---- P3293 [SCOI2016]美味
  8. 四川大学计算机学院2020推免公示,四川大学2020年推免生录取情况分析
  9. windows服务程序设置为自动 重启后又变为手动启动_系统小技巧:解决Windows无法正常关机的问题...
  10. HDU 4738 Caocao‘s Bridges(桥、任何位运算一定都要加括号、因为有重边所以用前向星)