k8s 应用日志采集(上)
传统服务VS k8s中服务
传统服务
- 固定机器、固定目录
- 机器重启不受影响
- 错误输出标准输出指定日志文件,不用关注stdout、stderr
K8s 中服务
- 服务运行节点不固定
- 重启服务会漂移
- 容器是一个进程自带标准输出和错误输出,kubectl logs需关注stdout、stderr
K8s 的日志
- Stdout、stderr (标准输出和错误输出)
kubectl logs docker log 标准输出和错误输出默认保存到宿主机默认的目录/var/lib/docker/containers/<cname>-json.log
-
应用日志文件
重启服务会丢失
解决方案
- 远程日志
本地不做存储,直接把日志拿到远端,比如Kafka,ES,但是需要改造服务,使用比较多
-
Sidercar
每个pod跑一个Sidercar,Sidercar会跟容器共享volume,他可以访问到所有的日志,把日志文件转发到后端存储,这样做法对POD有一定侵入,对内存CPU都有一定消耗,并不推荐
-
LogAgent
每个node节点部署一个agent,相当于第二种方案把Sidercar从POD中拿出来放到了节点上,目的通过一个agent 采集所有POD的日志,发送到远端,一般是以daemonSet 方式运行在kubernetes集群中,这种方式就需要把服务的日志挂载到宿主机上,事先约定好宿主机的目录,入侵性小,但是必须约定所有服务挂载特定目录,无法知道日志来源于哪个POD,还要定期清理日志文件
当前实践方案
类似于上面的第三种,但是我们用的Agent 是使用阿里的LogPilot
,占用资源比较少,稳定,既能采集docker 标准输出,错误输出,也能采集docker文件形式的日志。ElasticSearch+Kibana 全部都部署到容器里面。
LogPilot
-
智能的容器日志采集工具
能把采集到文件发送到各种各样的后端ES,kafka,logstih,redis
- 自动发现机制
动态发现容器内部日志文件,通过监听容器事件,动态配置日志采集,解决了日志重复和丢失,日志标记的问题
-
2017 年GitHub开源
原理是在静态日志采集工具上面又包了一层,通过获取docker事件实现静态工具动态配置,目前支持两种插件