一:先容
关于kubernetes的日志分好几种,针对kubernetes本身而言有三种:
1、资源运行时的event事宜。比如在k8s集群中创建pod之后,可以通过 kubectl describe pod 命令查看pod的详细信息。

2、容器中运行的运用程序自身产生的日志,比如tomcat、nginx、php的运行日志。比如kubectl logs redis-master-bobr0。这也是官方以及网上多数文章先容的部分
3、k8s各组件的做事日志,比如 systemctl status kubelet
容器日志网络的办法常日有以下几种:
1、容器外网络。将宿主机的目录挂载为容器的日志目录,然后在宿主机上网络。
2、容器内网络。在容器内运行一个后台日志网络做事。
3、单独运行日志容器。单独运行一个容器供应共享日志卷,在日志容器中网络日志。
4、网络网络。容器内运用将日志直接发送到日志中央,比如java程序可以利用log4j 2转换日志格式并发送到远端。
5、通过修正docker的--log-driver。可以利用不同的driver把日志输出到不同地方,将log-driver设置为syslog、fluentd、splunk等日志网络做事,然后发送到远端。
二:EFK方案(fluentd)
为了让fluentd在每个node上运行一份,这里有几种不同的方法:
1、直接在Node宿主机上安装fluentd。这种方法适宜elk都安装在物理机上的场景
2、利用kubelet的–config参数,为每个node分别运行一个静态fluentd pod
3、利用daemonset来让fluentd分别在每个node上运行一个pod。(daemontset是k8s的一种资源工具)
官方利用的是第三种办法,将ElesticSearch和kibana都运行在k8s集群中,然后用daemonset运行fluentd
集群启动时会在每个机器启动一个Fluentd agent网络日志然后发送给Elasticsearch
实现办法是每个agent挂载目录/var/lib/docker/containers利用fluentd的tail插件扫描每个容器日志文件,直接发送给Elasticsearch
除了容器运用的日志之外,还有一个主要的部分便是,程序自身的日志。一样平常情形下,会将程序日志写到固定目录文件、或者写入到中间件保存和读取。
这部分日志的处理,可以直接通过日志文件网络、或者是让开发程序的同学修处死式把日志输出到中间件或者是直接输出到elk上
三:EFK方案(filebeat)
多个Filebeat在各个业务端进行日志采集,然后上传至Logstash
多个Logstash节点并行(负载均衡,不作为集群),对日志记录进行过滤处理,然后上传至Elasticsearch集群
多个Elasticsearch构成集群做事,供应日志的索引和存储能力
Kibana卖力对Elasticsearch中的日志数据进行检索、剖析
在该架构中,根据业务特点,还可以加入某些中间件,如Redis、Kafak等:
Kafka集群作为缓冲行列步队,可以降落大量FIlebeat对Logstash的并发访问压力
Logstash是基于JDK的,在没有产生日志的情形纯挚启动Logstash就大概要花费500M内存
单独启动Filebeat容器大约会花费12M内存,比起logstash相称轻量级
四:采集风险
日志网络与处理解耦
由于网络和处理过程间加入了行列步队,当日志涌现暴增时,可以避免剖析处理节点被打垮,给剖析处理节点足够韶光消化日志数据
日志剖析处理节点可以动态伸缩
大流量日志网络系统架构图
当日志流量过大时,如果每一个日志网络节点都直连行列步队写数据,由于有很多分散的连接及写要求,会给行列步队造成压力。如果日志都发送到logstash网络节点,再集中写入行列步队,会减轻行列步队压力
五:方案比对
编号
方案
优点
缺陷
1
每个app的镜像中都集成日志网络组件
支配方便,kubernetes的yaml文件无须特殊配置,可以为每个app自定义日志网络配置
强耦合,未便利运用和日志网络组件升级和掩护且会导致镜像过大
2
单独创建一个日志网络组件跟app的容器一起运行在同一个pod中
低耦合,扩展性强,方便掩护和升级
须要对kubernetes的yaml文件进行单独配置,略显繁琐
3
将所有的Pod的日志都挂载到宿主机上,每台主机上单独起一个日志网络Pod
完备解耦,性能最高,管理起来最方便
须要统一日志网络规则,目录和输出办法
这里如果有想不同路径下的日志区分,可以加上document_type
apiVersion: v1kind: ConfigMapmetadata: name: filebeat-configdata: filebeat.yml: | filebeat.prospectors: - input_type: log paths: - "/log/.log" document_type: app-logs multiline.pattern: '^[[:space:]]+|^Caused by:|^#{3}|^;|^org|^com' multiline.negate: false multiline.match: after - input_type: log paths: - "/logs/.log" document_type: access-logs multiline.pattern: '^[[:space:]]+|^Caused by:|^#{3}|^;|^org|^com' multiline.negate: false multiline.match: after output.elasticsearch: hosts: ["192.168.30.21:9200"] index: "filebeat-test-%{+yyyy.MM.dd}"