kubernetes云原生纪元:k8s 应用日志采集(上)

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,但是需要改造服务,使用比较多

image-20200203112347040
  • Sidercar

    每个pod跑一个Sidercar,Sidercar会跟容器共享volume,他可以访问到所有的日志,把日志文件转发到后端存储,这样做法对POD有一定侵入,对内存CPU都有一定消耗,并不推荐

    image-20200203114636298
  • LogAgent

    每个node节点部署一个agent,相当于第二种方案把Sidercar从POD中拿出来放到了节点上,目的通过一个agent 采集所有POD的日志,发送到远端,一般是以daemonSet 方式运行在kubernetes集群中,这种方式就需要把服务的日志挂载到宿主机上,事先约定好宿主机的目录,入侵性小,但是必须约定所有服务挂载特定目录,无法知道日志来源于哪个POD,还要定期清理日志文件

image-20200203120100636

当前实践方案

类似于上面的第三种,但是我们用的Agent 是使用阿里的LogPilot,占用资源比较少,稳定,既能采集docker 标准输出,错误输出,也能采集docker文件形式的日志。ElasticSearch+Kibana 全部都部署到容器里面。

image-20200203120642349

LogPilot

  • 智能的容器日志采集工具

    能把采集到文件发送到各种各样的后端ES,kafka,logstih,redis

    • 自动发现机制

    动态发现容器内部日志文件,通过监听容器事件,动态配置日志采集,解决了日志重复和丢失,日志标记的问题

  • 2017 年GitHub开源

    image-20200203121430310

原理是在静态日志采集工具上面又包了一层,通过获取docker事件实现静态工具动态配置,目前支持两种插件

发布了20 篇原创文章 · 获赞 3 · 访问量 573

猜你喜欢

转载自blog.csdn.net/weixin_37546425/article/details/104244296
今日推荐