kubernetes日志收集计划有几种计划,都实用于什么场景?本文对k8s罕用日志采集计划做了具体介绍。
对于容器日志
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/sjson-file 37.9 MB/s
能不能找到不通过Docker Daemon收集日志间接将日志内容重定向到文件并主动 rotate的工具呢?答案是必定的采纳基底镜像。
S6-log 将 CMD 的规范输入重定向到/.../default/current,而不是发送到 Docker Daemon,这样就防止了 Docker Daemon 收集日志的性能瓶颈。本文就是采纳基底镜像构建利用镜像造成对立日志收集计划。
对于k8s日志
k8s日志收集计划分成三个级别:
- 利用(Pod)级别
- 节点级别
- 集群级别
利用(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日志收集计划的介绍,要想设计一个对立的日志收集零碎,能够采纳节点代理形式收集每个节点上容器的日志,日志的整体架构如图所示。
解释如下:
- 所有利用容器都是基于s6基底镜像的,容器利用日志都会重定向到宿主机的某个目录文件下比方/data/logs/namespace/appname/podname/log/xxxx.log
- log-agent 外部 蕴含 filebeat ,logrotate 等工具,其中filebeat是作为日志文件收集的agent
- 通过filebeat将收集的日志发送到kafka
- kafka日志发送的es日志存储/kibana检索层
- logstash 作为两头工具次要用来在es中创立index和生产kafka 的音讯
整个流程很好了解,然而须要解决的是
- 用户部署的新利用,如何动静更新filebeat配置,
- 如何保障每个日志文件都被失常的rotate,
- 如果须要更多的性能则须要二次开发filebeat,使filebeat 反对更多的自定义配置。
付诸实践
解决上述问题,就须要开发一个log-agent利用以daemonset模式运行在k8s集群的每个节点上,利用外部蕴含filebeat,logrotate,和须要开发的性能组件。
第一个问题,如何动静更新filebeat配置,能够利用http://github.com/fsnotify/fs... 工具包监听日志目录变动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 }
总结
本文只是对k8s日志收集提供了一个简略的思路,对于日志收集能够依据公司的需要,就地取材。
起源:晓得又忘了 地址:https://zhuanlan.zhihu.com/p/...