k8s中的日志处理
传统服务
- 固定机器、固定目录
- 不受重启影响
- 不关注stdout、stderr
k8s中的服务
- 节点不固定
- 重启服务会漂移
- 需关注stdout、stderr
k8s的日志
- stdout 标准输出
- stderr 错误输出
# 默认,以json模式保存目录。也可以修改指定日志目录
/var/lib/docker/containers/<cname>/<cname>-json.log
- 日志文件
对于应用直接写日志文件,重启丢失
常见方案-----远程日志
pod----(ES,kafka) # 用的比较多的。应用做改造
常见方案-----sidecar
每个pod中跑一个 sidecar,会跟主容器共享volume,可以访问到所有的日志文件。把日志文件转发后端存储。单独的进程,消耗内存,cpu。社区不推荐这种方式
常见方案-----LogAgent
每个节点上部署一个agent, 相当于sidecar从pod中拿到节点上。通过agent采集所有pod日志发送后端存储。一般一daemonset方式部署。需要容器把日志挂载到宿主机上。
资源消耗小,对pod没有侵入,对应用没有侵入。
约定所有项目挂载一个特定的主机目录,主机名也尽量统一。挂载目录事先定义好的,日志来源不好判断来源于哪个pod。
我们实践的方案。
一个节点部署一个agent。agent采用阿里开源的 LogPilot。
常见的agent:filebeat、logstash、fluentd等,都是静态的。静态日志容器出现瓶颈。
logpilot 能采集docker错误输出,也能采集文件日志。
- 智能的容器日志采集工具
- 自动发现机制
- 2917年初在github开源。
在静态采集上面又包了一层,事先静态之上的动态采集。自动发现。
目前 Log-Pilot 支持两种采集插件:一个是CNCF社区的Fluentd插件,一个是Elastic的Filebeat插件;其同时其支持对接多种存储后端,目前 Fluentd 和 Filebeat 都支持 Elasticsearch、Kafka、File、Console 作为日志存储后端,而 Fluentd 还支持 Graylog、阿里云日志服务 以及 Mongodb 作为存储后端。
图:
end...