Kubernetes(k8s)之日志收集_kubernetes日志收集-程序员宅基地

技术标签: Kubernetes之日志收集  docker 日志收集  Kubernetes  docker  

关于容器日志

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 查看,具体参考

  • 节点级别

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-data
      missingok
      notifempty
      size 1G
      copytruncate
    }

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

总结

本文只是对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/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yujia_666/article/details/116019215

智能推荐

东北大学计算机科学桥梁课程,美国东北大学温哥华分校计算机科学硕士申请介绍...-程序员宅基地

文章浏览阅读752次。Master of Science in Computer Science General RequirementsThe Masters of Science in Computer Science program at Northeastern offers students over 12 specializations ranging from artificial intelligenc..._master of science general

Python中type和isinstance的使用_isinstance和type的作用-程序员宅基地

文章浏览阅读237次。type:显示变量的类型isinstance:判断变量的类型,有两个参数,第一个参数是实例对象,第二个参数是基本类型_isinstance和type的作用

EDAS上传字体嵌入问题及解决办法_edas bookmarks: upload failed: bookmarks are not…-程序员宅基地

文章浏览阅读6.2k次。IEEE会议需要上传PDF格式的稿子,一般的会议不会要求严格,这次在ICCT会议这里着实的郁闷了一把,折腾了半天才发现并解决了问题。word转成PDF后,EDAS网站提示PDF格式错误,我这里分别遇到了两个错误,最后都解决了,希望对大家有帮助。 一、"One or more fonts are not embedded” 这个的意思是这篇PDF里的字体不能全部嵌入,这_edas bookmarks: upload failed: bookmarks are not…

通信的基本概念与STM32上USART串口通信实践_bsp_port.h-程序员宅基地

文章浏览阅读175次。文章目录一、通信的基本概念二、USART串口通信三、实验四、小结与参考链接一、通信的基本概念这部分内容通过野火官方的b站账号出的视频学习的,这里是传送门——通信的基本概念接下来我对学习的内容做个总结数据传输的方式串行通讯指设备之间通过少 量数据信号线(一般是 8根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。就像是单车道的公路,同一时刻只能传输一个数据为的数据。并行通讯指使用 8、16、32 及 64 根或更多的数据线进行传输的通讯方式,就像多个车道的公_bsp_port.h

项目8 利用DHCP自动分配IP地址-程序员宅基地

文章浏览阅读3.2k次。一、项目背景1.项目任务某公司组建单位内部的局域网,随着计算机数量的增加,网络管理员在客户机的TCP/IP维护上花费了不少的时间,首先在连入单位内部网络时需要分配IP地址,另外有些客户在对计算机重新安装操作系统后经常询问自己计算机的IP地址等信息,在这种情况下,需要在局域网内部安装并配置一台DHCP服务器,为公司内除服务器以外的所有计算机自动配置IP地址、子网掩码、默认网关、DNS服务器地址等网络参数。2.项目设计:(请将标黄色部分改为自己的学号,参照作业案例,查阅资料,完成任务一,1...

练习题_2019华为硬件笔试-程序员宅基地

文章浏览阅读832次。第一题用指针依次寻找数组内的数字,反复利用sum = sum * 10 + s[i] - '0'根据题意:Ai<=BjA_i<=B_jAi​<=Bj​AiA_iAi​找不到R范围内的BjB_jBj​,则列出最近的BjB_jBj​(仍满足条件1)仍找不到则丢弃AiA_iAi​测试样例:A={11,13,15},B={12,14,16},R=1时间复杂度:**..._2019华为硬件笔试

随便推点

自考计算机应用要学模电吗,一位计算机应用考生自考历程.doc-程序员宅基地

文章浏览阅读139次。终于所有的理论课都考完了,忙碌两年也终于到了放松的时刻.闲暇之于,便回顾一下走过的每一步,把一些写出来与已完成学业的,未完成的,和即将要重复这一路程的朋友们一起分享.序 2000年底,跳槽到一家制造性企业从事计算机系统的维护.工作无非是一些计算机系统的日常维护,有时也会自己作一些小的应用程序.工作量相来说不算紧张.以前一直在国企,毕业时所学的专业是和电有关的,可和计算机应用相差甚远.可是阴差阳错,..._计算机需要精通模电么

python运行时修改代码会怎样_python运行时修改代码的方法——monkey patch-程序员宅基地

文章浏览阅读621次。monkey patch (猴子补丁)用来在运行时动态修改已有的代码,而不需要修改原始代码。简单的monkey patch 实现:[Python]#coding=utf-8def originalFunc():print 'this is original function!'def modifiedFunc():modifiedFunc=1print 'this is modified func..._代码运行中可以修改代码吗

Frequent Pattern挖掘之四(MapReduce框架下的FP Growth算法详解上篇)(转)-程序员宅基地

文章浏览阅读186次。这一篇博客接前面的博客分析MapReduce框架下FP Growth算法详细步骤。Sharding这一步没什么好讲的,将数据库分成连续的大小相等的几个块,放置在不同的机器上。以Hadoop来讲,其框架本身就将整个数据库放在不同的机器上,形成不同的分区,因此在Hadoop上我们本身都不需要做什么。F_list计算这一步来讲也没什么好讲的,就是一个简单的频率统计,这是MapReduce..._apriror sklearn

Eclipse+Java+Swing实现学校教材管理系统_教材管理系统swing-程序员宅基地

文章浏览阅读7.9k次,点赞33次,收藏109次。Java+Swing实现学校教材管理系统一、系统介绍二、系统展示1.登录页2.主页面3.导出表单三、系统实现DBUtil.javaLogin.javaMyTable.javaXMainFrame.java四、其他1.其他系统实现2.获取源码3.备注一、系统介绍本系统实现的功能:管理员登录、教材的增删改查、导出PDF。JDK:1.8数据库:Mysql8.0.13二、系统展示1.登录页2.主页面3.导出表单三、系统实现DBUtil.javapackage com.sjsq;/**_教材管理系统swing

RuoYi -- Git、注解机制、项目本身、_ruo-yi-git-程序员宅基地

文章浏览阅读758次。Git版本控制( Revision control)是一种在并发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。实现跨区域多人协同开发 追踪和记载一个或者多个文件的历史记录 组织和保护你的源代码和文档 统计工作量 并行开发、提高开发效率跟踪记录整个软件的开发过程 减轻开发人员的负担,节省时间,同时降低人为错误版本控制的分类1、本地版本控制 (以RCS为代表)记录文件每次的更新,可以对每个版本做一个快照,或是记录.._ruo-yi-git

封装篇——Fragment懒加载_fragment懒加载封装-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏25次。为什么要做fragment的懒加载封装呢???一个字“懒”!!! 我老大告诉我:不会偷懒的程序员不是个好厨师 ^~^ ^~^ ^~^我们可能会以 viewpager(或其他容器)与多个Fragment组合使用,相信使用过的猿(媛)友们都碰到过下面的这些问题: 1. 预加载Fragment时,也就是加载不可见的Fragment时,该不可见的Fragment初始化数据和页面可能占用了大量的资源;_fragment懒加载封装