Kubernetes中无法创建可读写文件系统(只读挂载问题)
我来帮你梳理下问题的根源和对应的解决办法:
1. ConfigMap挂载的只读属性导致chown命令失败
你在initContainers和业务容器中,将ConfigMap的murmur.ini挂载为/srv/mumble/config.ini,并且错误地设置了readOnly: false——ConfigMap的挂载本质上是只读的,即使你显式设置readOnly: false也无法修改容器内的这个文件。当你的init容器执行chown -R 1000:1000 /srv/mumble时,会遍历到这个只读的config.ini文件,导致整个命令报错,让你误以为整个目录是只读的。
修复方式:
修改init容器的命令,跳过config.ini文件,只修改目录下的其他内容:
chown -R 1000:1000 /srv/mumble/.* /srv/mumble/* ! -name config.ini
或者更简单的,直接修改目录本身的权限,而不是递归遍历:
chown 1000:1000 /srv/mumble
2. 利用Kubernetes的SecurityContext自动管理权限
其实你不需要手动用init容器修改权限,Kubernetes提供了securityContext配置,可以自动帮你设置挂载卷的权限:
在Deployment的spec.template.spec下添加全局的securityContext:
securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000
runAsUser和runAsGroup让容器以UID/GID 1000运行fsGroup会自动将挂载的PersistentVolume目录的权限设置为GID 1000,这样容器内的用户就能读写该目录了
这样你甚至可以去掉init容器,因为K8s会自动处理权限问题。
3. 修正PersistentVolume的AccessMode
你的PV设置了accessModes: ReadWriteMany,但hostPath类型的PV不支持ReadWriteMany,它只能支持ReadWriteOnce(单节点读写)。虽然你只有一个节点,这个配置不会直接报错,但不符合K8s的规范,可能导致一些不可预期的问题,建议修改为:
accessModes: - ReadWriteOnce
同时对应的PVC也要同步修改这个配置。
4. 验证宿主节点目录权限
如果上述配置后还是有问题,检查宿主节点的/var/lib/data目录权限:
- 登录到你的Master节点,执行
ls -ld /var/lib/data - 如果权限是
root:root,可以手动修改为1000:1000:chown -R 1000:1000 /var/lib/data
不过通过前面的fsGroup配置,K8s应该会自动处理这个,所以这一步可能不是必须的,但可以作为排查手段。
最终修改后的Deployment关键部分示例
apiVersion: apps/v1 kind: Deployment metadata: name: mumble-deployment namespace: mumble labels: app: mumble spec: replicas: 1 selector: matchLabels: app: mumble template: metadata: labels: app: mumble spec: # 添加全局SecurityContext自动管理权限 securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 containers: - name: mumble image: phlak/mumble ports: - containerPort: 64738 env: - name: TZ value: "America/Denver" volumeMounts: - mountPath: "/srv/mumble" name: mumble-pv-storage readOnly: false - name: mumble-config subPath: murmur.ini mountPath: "/srv/mumble/config.ini" # ConfigMap挂载保持只读即可 readOnly: true volumes: - name: mumble-pv-storage persistentVolumeClaim: claimName: mumble-pv-claim - name: mumble-config configMap: name: mumble-config items: - key: murmur.ini path: murmur.ini
按照这些步骤调整后,Mumble应用应该就能正常在/srv/mumble目录下创建文件了。
内容的提问来源于stack exchange,提问作者DaemonSlayer2048

