kube-system Pod日志在宿主节点上的存储机制是怎样的?
klog写入宿主机/var/log权限相关问题解答
首先明确:klog本身只是Go语言生态的通用日志库,不具备任何内置的特殊访问权限,K8s系统组件容器可以直接写入宿主机/var/log目录完全是部署时的特殊配置实现,和klog本身无关,具体实现逻辑如下:
- 宿主机目录挂载:部署K8s系统组件(如kube-proxy、CNI插件等)时,会通过
hostPath卷将宿主机的/var/log目录直接挂载到容器内部的对应路径,容器内进程写入容器内/var/log的内容会直接落到宿主机的文件系统中 - 权限适配:这类系统组件的Pod都会配置对应的安全上下文,要么开启特权模式,要么补充适配SELinux/AppArmor规则,同时保证容器内运行进程的UID/GID对挂载进来的
/var/log目录有读写权限,避免写入操作被系统权限机制拦截 - 绕过默认容器日志机制的逻辑:标准容器日志方案是采集容器的stdout/stderr输出后落到宿主机
/var/log/pods目录下,而系统组件为了保证日志持久化逻辑和非容器化部署时完全一致,直接将日志写入挂载的hostPath路径,不走stdout/stderr采集链路,所以看起来是绕开了默认容器日志机制。
你的应用实现同类能力的方案
你当前使用标准syslog体系、日志输出到stderr,要实现日志存储到Pod所在宿主机文件系统,可以参考上述逻辑配置:
- 给应用Pod配置
hostPath类型的卷,将宿主机上你要存储日志的目标目录(例如/var/log/your-app)挂载到容器内的日志输出路径 - 调整Pod的安全上下文配置,保证容器进程对挂载的目录有读写权限,生产环境建议使用最小权限配置,避免直接开启特权模式
- 修改syslog配置,将日志输出到你挂载的目录路径下,而不是输出到
stderr即可。
注意:使用hostPath存储日志需要注意两个问题:一是Pod漂移到其他节点后日志会分散在不同宿主机上,需要配套节点级日志采集工具统一收集;二是多个同类型Pod调度到同一节点时,要给每个Pod的日志路径配置唯一标识(例如Pod名称),避免日志文件互相覆盖。
内容的提问来源于stack exchange,提问作者Sam Habiel
相关产品推荐
相关产品推荐

