kubernetes原生支持只读根文件系统,通过securitycontext.readonlyrootfilesystem:true实现,使/目录只读以阻止恶意写入;需配合runasnonroot、drop capabilities及禁用特权提升才能形成有效防护链。

在 Kubernetes 中,只读根文件系统不是 Docker 的功能延伸,而是 Kubernetes 原生支持的安全机制——它通过 securityContext.readOnlyRootFilesystem: true 控制容器运行时行为,与底层容器运行时(如 containerd 或 Docker)协同生效。启用后,整个 / 目录被挂载为只读,从根本上阻止恶意写入、配置篡改或临时文件植入,对微服务这类长期运行、暴露面广的工作负载尤其关键。
核心配置:Pod 级只读根文件系统
只需在 Pod 或容器的 securityContext 中设置:
-
Pod 级统一控制(推荐):适用于所有容器,简洁且一致
securityContext:
readOnlyRootFilesystem: true -
容器级独立控制:当同一 Pod 内部分容器需写入能力时使用
containers:
- name: api-server
securityContext:
readOnlyRootFilesystem: true
允许必要写入:精准挂载可写路径
微服务通常需要写日志、缓存或临时文件。不能开放整个根目录,而应通过 volumeMounts 显式授权最小范围:
-
用 emptyDir 挂载临时目录(重启即清空,适合 /tmp):
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {} -
用 configMap/secret 挂载只读配置(避免应用修改自身配置):
volumeMounts:
- name: config
mountPath: /etc/app/config.yaml
subPath: config.yaml
readOnly: true - 用 hostPath 或 PVC 挂载持久日志目录(如 /var/log/app,确保宿主机权限可控)
必须配套的加固项(缺一不可)
单独开启只读根文件系统效果有限,需组合以下三项才能形成有效防护链:
-
禁止 root 运行:
runAsNonRoot: true+runAsUser: 1001,防止提权后绕过只读限制 -
丢弃全部 Linux capabilities:
capabilities.drop: ["ALL"],关闭默认赋予的隐式特权(如NET_BIND_SERVICE可按需单独加回) -
禁用特权模式与权限提升:
privileged: false和allowPrivilegeEscalation: false
验证是否生效
部署后快速确认实际效果:
- 进入容器执行:
touch /test && echo "writable"→ 应报错Read-only file system - 检查挂载信息:
findmnt | grep " / " | grep ro→ 输出含ro标志 - 查看安全上下文:
kubectl get pod xxx -o yaml | grep readOnly→ 确认字段存在且为true











