当前位置: 首页 > Linux

k8s日志采集的那些套路

时间:2023-04-07 01:13:30 Linux

kubernetes日志采集解决方案有几种方案,分别适用于哪些场景?本文详细介绍了k8s常见的日志采集方案。关于容器日志Docker日志分为两类,一类是Docker引擎日志;另一个是容器日志。引擎日志一般都交给系统日志,不同的操作系统会放在不同的位置。本文主要介绍容器日志。容器日志可以理解为容器内部运行的应用输出的日志。dockerlogs默认显示当前运行容器的日志信息,包括STOUT(标准输出)和STDERR(标准错误输出)。日志以json-file格式存储在/var/lib/docker/containers//-json.log中,但这种方式不适用于生产环境。默认情况下,容器日志不限制日志文件的大小,容器会不停地写入日志,导致磁盘写满,影响系统应用。(dockerlog-driver支持日志文件轮换)DockerDaemon收集容器的标准输出。当日志量过大时,DockerDaemon会成为日志采集的瓶颈,日志采集速度受到限制。当日志文件量过大时,用dockerlogs-f查看时会直接阻塞DockerDaemon,导致dockerps等命令无响应。Docker提供了日志驱动配置,用户可以根据自己的需要配置不同的日志驱动,请参考官网配置日志驱动。但是上述配置的日志收集也是通过DockerDaemon收集的,收集日志的速度仍然是瓶颈。log-driver日志收集速度syslog14.9MB/sjson-file37.9MB/s你能找到一个工具,直接将日志内容重定向到文件并自动轮转它,而不需要通过DockerDaemon收集日志吗?答案是肯定的,使用基础镜像。S6-log将CMD的标准输出重定向到/.../default/current,而不是发送给DockerDaemon,从而避免了DockerDaemon收集日志的性能瓶颈。本文使用基础镜像构建应用镜像,形成统一的日志采集方案。关于k8s日志k8s日志收集方案分为三个级别:应用(Pod)级别节点级别集群级别应用(Pod)级别Pod级别日志,默认是输出到标准输出和标志输入,其实和码头集装箱。使用kubectllogspod-name-nnamespace查看。节点级别节点级别的日志通过配置容器的日志驱动来管理。这需要使用logrotare来完成。如果日志超过最大限制,将自动执行轮转操作。Cluster-level集群级别的日志收集,有3种节点代理方式,日志收集在节点级别进行。一般使用DaemonSet部署在各个节点。这种方式的好处是资源消耗少,因为只需要部署在节点上,对应用程序没有侵入。缺点是只适用于容器内的应用日志,必须全部是标准输出。使用sidecar容器作为容器日志代理,即在pod中的应用容器后面设置一个日志处理容器。有两种形式:一种是直接将应用容器的日志收集输出到标准输出(称为Streamingsidecar容器),但是需要注意的是,此时在宿主机上实际上会有两个相同的日志文件:一个是应用自己写的;另一个是sidecar的stdout和stderr对应的json文件。这是一个很大的磁盘浪费,所以除非绝对必要或者应用程序容器是完全不可能被修改的。另一种是在每个pod中设置一个logcollectionagent(比如logstash或者fluebtd),相当于在pod中放入solution1中的loggingagent。但是这种方案会消耗大量资源(cpu、内存),而且日志不会输出到标准输出,kubectllogs也看不到日志内容。应用容器直接将日志推送到存储后端。这种方式比较简单,直接将日志内容发送到应用中的日志采集服务后台。日志架构基于上面对k8s日志采集方案的介绍,如果想设计一个统一的日志采集系统,可以使用节点代理的方式来采集各个节点上容器的日志。日志的整体架构如图所示。解释如下:所有应用容器都基于s6基础镜像,容器应用日志会被重定向到宿主机上的某个目录文件,如/data/logs/namespace/appname/podname/log/xxxx.loglog-agent包含filebeat、logrotate等工具,其中filebeat是一个agent,负责收集日志文件,并将收集到的日志通过filebeat发送给kafka。Kafka日志发送es日志存储/kibana检索层。logstash作为中间工具在es中创建索引和消费kafka消息的整个过程很容易理解,但是需要解决的是用户部署的新应用,如何动态更新filebeat配置,如何保证每个日志文件的正常轮转,如果需要更多的功能,需要重新开发filebeat,让filebeat支持更多的自定义配置。为了在实践中解决上述问题,需要开发一个log-agent应用,以daemonset的形式运行在k8s集群的各个节点上。应用包含filebeat、logrotate、需要开发的功能组件。第一个问题,如何动态更新filebeat的配置,可以使用http://github.com/fsnotify/fs...工具包监听日志目录更改create和delete事件,使用模板渲染方式更新filebeat配置文件。第二个问题,使用http://github.com/robfig/cron工具包创建cronJob,定期轮转日志文件,注意应用日志文件所属的用户,如果不是root用户,可以在配置/xxxxx.log中设置切换用户/var/log/xxxx{suwww-datawww-datamissingoknotifemptysize1Gcopytruncate}总结本文仅提供k8s日志收集的简单思路,日志收集可以根据公司需要因地制宜。来源:知而忘地址:https://zhuanlan.zhihu.com/p/...