k8s容器环境多个Pod写日志永久保存到物理磁碟,日志名称重复问题? Flexvolume是否能完成我的需求?
中,push业务中日志文件需要写入物理机磁碟长期保存。但是每个pod默认写入的路径相同。会存在并发写文件造成非预期问题。(注意:emptyDir 方式不能解决我们的需求,我们的需求是日志长期保存。即便pod终止,也不会删除。同时能够区分一个pod对应一个日志文件)。
Flexvolume是否能完成我的需求?
可以用statefulset+storageclass实现
(1)另外也可以绕一下:
1. 使用一个能持久化存储的公用目录,比方说hostpath:/data/logs
2. 将这个目录挂载到所有pod的/data/logs路径
3. 在pod的/data/logs创建一个不可能重名的文件夹,比如/data/logs/pod-name
4. 将log目录软链接到pod里面的/data/logs/pod-name目录
(2)建议将日志持久化放到elasticsearch里面去,集中化管理,还能结合告警、搜索、统计等,解决方案也挺多
1. 将srv与日志采集agent绑定在一个pod里面采集srv日志
2. 将srv的log用emptyDir暴露在宿主机上,自动发现日志文件
3. srv直接将log打到kafka等消息队列里面中转
4. srv打syslog然后采集
Flexvolume看介绍似乎让用户能够支持一些kubernetes不支持的卷类型
我是这么做得。
在集群外部有机器开 NFS,pod 中使用volume 挂载,pod 中的日志文件可以写到外部的 NFS 中。当然要包括 HOSTNAME。
可以实现你的需求,但,从目录结构上讲 ,有一节不必要的 HOSTNAME,虽然不影响 grep。
如图