如何通过 aliyun 日志服务来收集 aliyun ACK 环境中容器内的日志

背景

目前已经将司内的微服务搭建起来,并且通过 aliyun 的 ACK + docker 实现了容器化部署,由于是容器化部署所以就出现了一个问题,微服务重启以后,之前的日志就会随着容器的销毁一起被删除,这样对于那些想要通过之前的日志排查问题的场景变得非常麻烦,为了解决这个问题,想到三个解决方案:

  1. 容器日志宿主机存储
  2. 自己搭建 ELK
  3. 基于 aliyun 的日志服务

对比这三个方案,其实选择就只有在2和3之间,又由于我们的微服务是基于 aliyun 的 ACK 部署的,而 aliyun 的 ACK 又与 aliyun 的日志服务无缝对接(省去了自己造轮子的麻烦事儿!),所以最终方案3胜出。

采集配置

具体如何搭建可以参考 aliyun 的《使用日志服务进行Kubernetes日志采集》帮助文档,而在这里我只讲一下我是如何通过 YAML 文件进行采集配置的,OK,下面让我们进入正文吧!

实际采集配置很简单,主要根据一定的规则在微服务部署的 YAML 文件添加一些配置就好,这里我将采集配置分为两种:

  1. stdout 作为采集路径
    我们只需要通过环境变量就可以创建采集配置,所有与配置相关的环境变量都采用 aliyun_logs_ 作为前缀,如下图:
    如何通过 aliyun 日志服务来收集 aliyun ACK 环境中容器内的日志
    根据采集配置,aliyun 日志服务会自动创建一个名为 test-annoroad-alpha-stdout 的 logstore。
    如此配置以后,aliyun 的日志服务就会将容器的 stdout 所有内容采集到 aliyun 日志服务中名为 test-annoroad-alpha-stdout 的 logstore 中。

  2. 非 stdout 作为采集路径
    与【1】不同的是,需要创建相应的 volumnMounts,如下图:
    如何通过 aliyun 日志服务来收集 aliyun ACK 环境中容器内的日志
    这里的 /logs/annoroad-alpha 是该微服务在容器内日志输出的路径。
    根据采集配置,aliyun 日志服务会自动创建一个名为 test-annoroad-alpha 的 logstore。
    如此配置以后,aliyun 的日志服务就会将容器内 /logs/annoroad-alpha/*.log 所有文件中的所有内容都采集到 aliyun 日志服务中名为 test-annoroad-alpha 的 logstore 中,下面给一张 aliyun 控制台的截图:
    如何通过 aliyun 日志服务来收集 aliyun ACK 环境中容器内的日志