k8s + ELK 如何实现 aliyun ack sls 那种可以采集到容器中日志文件的功能?

ponponon
  • 1.6k

最近要搭建一个私有的 ELK(之前是使用 aliyun 的 sls),之前在 aliyun k8s 使用 aliyun sls 时候,只要在容器的 Dockerfile 里面加入下面几行东西,就能实现采集容器中的日志文件 logfile

ENV aliyun_logs_xxxx_logstore=xxx
ENV aliyun_logs_xxxx_project=xxxx
ENV aliyun_logs_xxxx=/code/logs/*.log
ENV aliyun_logs_xxx_ttl="14"

比如我把 program 的 log 写到 /code/logs/ 文件夹,sls 就能自己采集到!

我感觉很神奇!

  • 不是容器的标准输出和标准错误
  • 日志文件也没有主动显性的挂在文件卷 volumes 之类的东西)

看了一下 sls 的文档:Logtail采集原理 也没说明白是怎么实现这一点的!

难道是隐形的文件卷挂载?(就是 k8s 自动根据 container 的 env 来自动挂载 volumes)我感觉不可能呀,image 到 container 才能知道 env,但是只有创建 container 之前才能挂载 volumes,已经创建的 container 是不能挂载 volumes 的呀!


看了 k8s + ELK 的这个教程:Kubernetes中部署ELK Stack日志收集平台

图片.png

我喜欢第一种方式(我盲猜 aliyun k8s + sls 也是这种方式 ),但是这个图中说,这样 ELK 只能采集 stdout 和 stderr ,我要实现采集容器中的日志文件怎么办?(就像 aliyun k8s + sls 一样)

为什么不用标准输出和标准错误!因为不支持多行日志呀,这样最最重要的堆栈错误就不能正常工作了!

回复
阅读 633
1 个回答

没用过阿里云的K8S,但是用过SAE托管。
SAE托管也可以采集日志到SLS,可以读取指定目录的日志文件和标准输入输出,但是他需要额外占用一点资源。K8S应该也差不多,所以我猜测K8S采集pod的日志,是在容器内启动了一个代理程序,代理程序读取环境变量里的配置,转发日志。

我这边采集日志是用的方案2,在每个pod里面加了一个filebeat, 采集指定目录下的文件,发送到logstash。

宣传栏