加上 readOnlyRootFilesystem: true 后 Pod 进 CrashLoopBackOff,日志只有 nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (30: Read-only file system)。日志里能对上时间点,这种反而好排。

根文件系统挂成只读后,进程所有写操作都会被内核拒绝,nginx 启动要建临时目录和 pid 文件。只读根不等于整机只读,需要写的路径得单独挂可写卷。这一点先确认清楚,后面就不用反复试。

kubectl logs nginx-5c7d --previous
kubectl describe pod nginx-5c7d | grep -A6 Mounts
kubectl exec nginx-5c7d -- df -h /tmp

「只读根文件系统」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:先从日志里找出第一个写失败的路径 不要一次把所有目录都挂上;给 /tmp /var/cache/nginx /var/run 各挂一个 emptyDir;确认应用自己的日志目录也挂出来 否则写到根上还是失败;挂完重启一次 看是否还有 EROFS 报错。

结果对不对很好判断,Pod 变成 Running,nginx 能建出 client_temp 目录,访问返回 200。

作者 9823189