只读挂载的作用
volumeMounts.readOnly: true 让容器在该挂载点上无法写入:对配置目录能防止程序误改配置文件,对共享数据卷能防止误删误写。它是挂载层的约束,只影响当前容器的这个挂载点,同一块卷在别的 Pod 或别的挂载位置上仍然可读写。ConfigMap、Secret、Downward API 这类卷本身就是只读的,写不进去属于预期行为,加这个字段只是把意图显式写出来。
基本信息
| 适用平台 | Kubernetes 各版本,containers[].volumeMounts 字段 |
|---|---|
| 关键字段 | readOnly,取值 true 或 false,默认 false |
| 作用范围 | 单个容器的单个挂载点,不改变卷本身的属性 |
| 天然只读的卷 | configMap、secret、downwardAPI、projected |
| 全局只读 | 需要存储侧支持 ReadOnlyMany 访问模式或快照只读副本 |
典型使用场景
- 应用配置目录:容器只读读取,防止程序把默认配置回写覆盖
- 共享数据卷的读侧消费:多个只读副本同时挂载,降低误写风险
- 交付物目录:镜像里的静态资源与模板只读,避免被运行时改写
- 证书目录:只读挂载可减少凭据被进程改动或注入的机会
- 排查污染:怀疑某容器改了共享文件时先改成只读做验证
只读挂载示例
只读挂载示例
containers:
- name: app
image: registry.example.com/app:1.26.0
volumeMounts:
- name: config
mountPath: /etc/app
readOnly: true # 配置目录只读
- name: data
mountPath: /var/lib/app/data
readOnly: true # 共享数据只读消费
volumes:
- name: config
configMap:
name: app-config
- name: data
persistentVolumeClaim:
claimName: shared-data验证写入被拒
验证写入被拒
kubectl exec -it web-x -- sh -c 'touch /etc/app/probe.txt' || echo read-only
kubectl exec -it web-x -- mount | grep -E '/etc/app|/var/lib/app/data' # 这里会显示 ro 标记
kubectl get pod web-x -o jsonpath='{.spec.containers[0].volumeMounts[*].readOnly}'常见目标与做法
| 目标 | 做法 | 效果 |
|---|---|---|
| 防误改配置 | 配置目录 readOnly: true | 程序写配置直接失败,尽早暴露问题 |
| 共享数据只读消费 | 多副本挂同一卷并只读 | 写入报 read-only file system |
| ConfigMap/Secret | 默认即只读 | 加字段只是显式声明 |
| 跨 Pod 全局只读 | ROX 访问模式或只读副本 | 需要存储侧配合 |
写入被拒时应用侧看到的错误是 read-only file system,若应用启动阶段要往该目录写临时文件或日志,容器会直接 CrashLoopBackOff。
需要运行时修改配置的场景不要简单挂成只读:应改为可写卷,并在启动时由 initContainer 把初始内容拷贝进去,避免应用改配置文件失败后反复重启。