You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中无法创建可读写文件系统(只读挂载问题)

解决Mumble容器中/srv/mumble目录只读的问题

我来帮你梳理下问题的根源和对应的解决办法:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:51:32