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优化的一些配置