关于k8s应用日志持久化问题咨询


请教大神们
比如我想要pod挂载宿主机的目录做应用日志持久化, 考虑到存在多个pod副本调度到同一个node的情况
挂载的目录需要用比如pod或者容器的id等标识区分一下,有没有什么环境变量之类的东西可以在yaml文件里指定挂载目录的时候读取到该pod的id等

谢谢
已邀请:

iT2afL0rd - DevOps Lead at TrendMicro

赞同来自:


这种做法比较奇怪,为什么要挂载本地目录呢?直接用logstash收集log不行?还是有什么特别的需求?

行知 - 80后IT男

赞同来自:


我也有这样的问题,目前我们有这样的需求:
一个Deployment运行一个应用,应用会根据业务情况打印多个日志,如订单成功.log,订单失败.log,这样就无法将日志输出到docker的stdout。所以我们打算挂载本地目录到容器中,输出日志到本地主机的特定目录下,然后使用logstash/fluentd来收集本地主机目录下的所有日志

那么问题就来了:在应用运行多个副本的情况,多个副本的日志都输出到同一个本地主机目录的同一个文件中肯定不行,打印顺序会混乱。有什么办法可以规避这种情况呢

张夏 - FreeWheel Lead Engineer, ex-IBMer

赞同来自:


可以通过Pod Name区分,非常简单。

假设需求:一个pod中只有一个业务服务container,需要持久化存储该业务日志。

解决办法: 只需要在yaml文件中指定宿主机或分布式存储的某一个目录(eg. 以宿主机为例, hostPath:containerPath)然后container内部通过将日志文件输出到containerPath/$(hostname)/xxx.log即可, 其中container hostname就是pod的NAME。

例子如下:
spec:
containers:
- image: xxx
name: xxx
volumeMounts:
- mountPath: containerPath
name: test-volume
volumes:
- name: test-volume
hostPath:
path: hostPath

container内部应用的log,可以输入到containPath/$(hostname)/xxx.log,其中$(hostname)为业务所在pod的NAME

要回复问题请先登录注册