切换非Root用户+只读文件系统后Tomcat返回404故障排查
问题排查与修复方案
核心问题分析
从日志和配置来看,Tomcat启动后立即停止,且所有端点返回404,核心问题集中在临时卷挂载的权限与目录覆盖逻辑,以及K8s探针配置上。
具体排查与修复步骤
1. 修复webapps/ROOT挂载的权限问题
你将临时卷挂载到/usr/local/tomcat/webapps/ROOT,但Tomcat需要将webapps/ROOT.war解压到该目录。当前只读文件系统下,必须确保:
- 临时卷的可写权限:临时卷默认可写,但需确认运行Tomcat的非Root用户对该目录有读写权限
- 添加安全上下文配置,让Pod以指定用户运行并拥有卷的权限:
securityContext: runAsUser: 1000 # 替换为你的非Root用户UID fsGroup: 1000 # 替换为用户所属组GID volumeMounts: - name: tmp3 mountPath: /usr/local/tomcat/webapps/ROOT readOnly: false # 显式声明可写
2. 调整conf/Catalina挂载策略
挂载整个conf/Catalina临时卷会清空Tomcat默认的主机配置目录(比如localhost子目录),导致Web应用上下文无法正常注册:
- 改为仅挂载
conf/Catalina/localhost(Tomcat会自动创建该目录用于存储上下文配置):volumeMounts: - name: tmp4 mountPath: /usr/local/tomcat/conf/Catalina/localhost - 若无需自定义上下文配置,可直接删除该挂载,只需确保镜像中
conf/Catalina目录已提前创建,且非Root用户有写入权限。
3. 检查K8s探针配置
Pod不断重启大概率是存活/就绪探针失败导致:
- 确认探针路径是否匹配应用实际的健康检查端点(比如
/actuator/health、/health或根路径/) - 若探针路径错误,K8s会认为Pod不健康,触发强制重启
4. 开启Tomcat debug日志排查隐藏错误
当前日志无报错信息,需开启更详细的调试日志:
- 修改Tomcat的
logging.properties文件,添加:org.apache.catalina.level = FINE org.apache.catalina.handlers = java.util.logging.ConsoleHandler - 重启Pod后,查看是否有上下文初始化失败、权限不足等隐藏错误
内容的提问来源于stack exchange,提问作者PSKP
相关产品推荐
相关产品推荐

