Kubernetes配置readOnlyRootFilesystem后容器退出码137如何解决
问题诊断与解决方案
现有配置的问题
- 缺失应用所需可写路径的临时存储配置:绝大多数Web应用运行时需要向
/tmp(临时文件)、/var/run(进程pid、socket文件)、/var/log(运行日志)等路径写入数据,开启readOnlyRootFilesystem: true后根路径全部为只读状态,应用写入失败直接崩溃,触发异常退出。 - AppArmor规则过于严格:你配置的
deny /** wl规则会拦截所有路径的写入操作,即使挂载了可写存储也会被规则拦截,同样会导致启动失败。 - PSP配置失效:AKS 1.21及以上版本已正式弃用Pod Security Policy(PSP),替换为Pod Security Admission(PSA),所以集群级PSP配置不会生效。
补充说明:退出码137也有可能是进程OOM被内核杀死,你现有配置只加了CPU限制,没有配置内存限制,也可以同步排查内存占用问题
正确配置方案
1. 确认应用写入路径
先临时关闭只读根文件系统配置启动容器,进入容器排查运行时需要写入的所有目录路径,除了通用的/tmp、/var/run、/var/log外,部分应用还有专属的缓存、临时数据目录,需要一并纳入配置。
2. 挂载临时可写存储
使用基于内存的emptyDir为需要写入的目录提供临时可写空间,数据会随容器销毁自动清除,符合运行不可信代码的安全要求,参考Deployment配置如下:
apiVersion: apps/v1 kind: Deployment metadata: name: parser-deployment spec: replicas: 5 selector: matchLabels: app: parser template: metadata: labels: app: parser spec: containers: - name: parser image: parser.azurecr.io/parser:latest ports: - containerPort: 80 - containerPort: 443 resources: limits: cpu: "1.20" memory: "1Gi" # 新增内存限制,避免OOM导致137退出 securityContext: readOnlyRootFilesystem: true runAsNonRoot: true # 额外安全配置,禁止root用户运行 allowPrivilegeEscalation: false # 禁止权限提升 volumeMounts: # 根据你实际排查到的写入路径调整挂载列表 - name: tmp mountPath: /tmp - name: run mountPath: /var/run - name: log mountPath: /var/log volumes: - name: tmp emptyDir: medium: Memory sizeLimit: 100Mi - name: run emptyDir: medium: Memory sizeLimit: 50Mi - name: log emptyDir: medium: Memory sizeLimit: 200Mi
3. 调整安全规则
- 移除AppArmor配置中的
deny /** wl规则,保留其他基础安全限制即可,readOnlyRootFilesystem已经可以保证根文件系统永久只读,挂载的临时存储为非持久化存储,不会有持久化写入风险。 - 如果需要集群级强制只读根文件系统限制,在AKS集群中启用Pod Security Admission,给对应业务命名空间配置
restricted级别的Pod安全标准,即可强制所有Pod必须符合只读根文件系统、非root运行等安全要求。
内容的提问来源于stack exchange,提问作者Georgi Yankov
相关产品推荐
相关产品推荐

