一个梦想环游世界的DevOps
——快来看看呀

kubernetes日志中心:

目的:

日志分析是我们系统中很重要的一部分,最基本的,我们可以根据日志信息来进行debug。

需求:

1、application log

2、kubernetes component logs (the component which in kube-system namespaces)

3、nginx-ingress controller logs 

调研:

日志收集我们需要从4个方面来讲。

1、日志源——你的日志由什么输出,通常在容器中,就是容器日志

2、流——你采用什么方式去传输这个日志,这里还涉及一个缓存的概念。

3、日志存储——日志存在哪里(硬盘、ES、Clickhouse?)

4、可视化工具分析——(kibana、grafana)

 

从以上4个方向来分析。

日志源:不用说,在容器中,我们就是容器的日志,“/var/log/containers”中。我们只要能够获取到这个文件变化,就可以操控这个日志走向

流:这里我们采用fluent-bit来获取,然后传输

日志存储:我们这里采用开源Elasticsearch进行处理 (后面我会写一些其他的工具收集)

可视化:Kibana

实施:

这里强烈推荐大家在k8s环境内使用helm。至于helm是什么,大家可以去官网参考。

 

我这里有一些配置好的helm,主要是对其进行了一修改,使其可以获取到kube-system中的一些日志,因为kube-system中的日志是不会保存在/var/log/containers里的。

GitHub地址:

https://github.com/linbingdouzhe/helm-for-fluentd

https://github.com/linbingdouzhe/helm-for-fluent-bit

 

其中原理大概如下:

fluent-bit以daemonset的形式在每个node上读取对应目录的文件变化,而后发送给fluentd。

fluentd对数据进行缓存以及json处理操作,然后写入ES

注意,这个fluentd的缓存功能很重要,这个是避免数据丢失的重要配置,默认64GB最大。这个值可以参考:

 

total_limit_size 75GB #这个值自定义,可大可小,一般建议要比buffer的实际空间要低。因为如果一旦磁盘写满,那么fluentd就会挂掉

  

还有一个重要参数,这个参数只在k8s中需要开启,如果不开启这三个配置,你的日志就会经常出现断发送的情况。。。。很坑

#在output中      
reconnect_on_error true reload_on_failure true reload_connections false

  

 

基本配置以上这些。就可以发送日志了。

不过,如果每天的日志产生大于60GB的日志,就不建议使用这套架构,可以采用

fluent-bit - kafka - logstash 这套架构。

这个架构的好处在于日志可以缓存在kafka。然后通过logstash进行消费。

logstash的好处在于他可以检测到es的状态,如果es处于繁忙状态,logstash就不会继续往里面写,而fluentd则不是,他会把es写崩。直到es报错“Data too large”

 

关于日志流这部分就写完了,后面会写es优化的一些配置

posted on 2020-12-03 17:04  朝澈  阅读(1760)  评论(0编辑  收藏  举报