Kubernetes中如何以UID1001的Alejandra用户挂载NFS/hostPath存储
问题根因梳理
你当前配置存在5处核心错误,导致挂载存储权限不符合预期:
- PV、PVC、Deployment三者未正确关联:Deployment缺少
volumes字段绑定PVC,且PV与PVC的匹配规则缺失,存储实际未正常挂载到指定路径 - NFS服务端访问规则配置错误:
/etc/exports中仅允许10.0.0.13单个IP访问,你的K8s worker节点不在允许范围内,且重复配置了两条完全相同的无效导出规则 - 排查路径错误:你在容器内执行的
ls -al /var查看的是容器镜像自带的系统目录,而非你挂载到/app/var的NFS存储目录,看到的root属主是镜像本身的默认权限,和存储挂载无关 - NFS服务端目录权限未提前配置:NFS存储的权限由服务端文件系统权限优先决定,仅在Pod侧配置securityContext不会修改服务端目录的原有属主,你需要提前把NFS导出目录的属主改为1001:1001
- hostPath存储问题同理:hostPath对应的节点本地目录需要提前在对应worker节点上修改属主为1001:1001,否则挂载后权限依然为原有目录的属主
另外Deployment里的pv.beta.kubernetes.io/gid注解是K8s早期废弃特性,当前版本无需配置,直接使用Pod级别的securityContext即可。
修复步骤
1. 修复NFS服务端配置
登录NFS服务器192.168.1.2执行以下操作:
- 修改
/etc/exports,替换原有规则,允许你的K8s集群所有worker节点的IP段访问,例如worker节点都属于192.168.1.0/24段,配置如下:
/var/lib/alejandra 192.168.1.0/24(rw,no_root_squash,no_subtree_check)
- 重新加载NFS配置生效:
exportfs -ra - 修改导出目录的属主为1001:1001:
chown 1001:1001 /var/lib/alejandra - 确认目录权限,输出属主应为1001 1001:
ls -al /var/lib/alejandra
2. 修复K8s资源配置
修改你的YAML配置,补充缺失的关联规则:
apiVersion: apps/v1 kind: Deployment metadata: namespace: external-ns name: app1 labels: app: app1 spec: replicas: 1 selector: matchLabels: app: app1 template: metadata: labels: app: app1 spec: securityContext: runAsUser: 1001 runAsGroup: 1001 fsGroup: 1001 nodeSelector: node-role.kubernetes.io/worker: worker containers: - image: 192.168.1.1:5000/app1 imagePullPolicy: Always name: app1 volumeMounts: - mountPath: /app/var name: networkshared-fs-0 # 补充volumes字段关联PVC volumes: - name: networkshared-fs-0 persistentVolumeClaim: claimName: alejandra-dashboard --- apiVersion: v1 kind: PersistentVolume metadata: name: networkshared-fs-0 spec: capacity: storage: 80Gi accessModes: - ReadWriteMany mountOptions: - vers=4.0 nfs: path: /var/lib/alejandra server: 192.168.1.2 # 补充存储类名,和PVC保持一致实现绑定 storageClassName: nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: alejandra-dashboard # PVC需要和Deployment在同一个命名空间 namespace: external-ns spec: accessModes: - ReadWriteMany resources: requests: # 存储申请容量不能超过PV容量 storage: 80Gi # 和PV存储类名保持一致 storageClassName: nfs-storage # 直接指定绑定的PV名称 volumeName: networkshared-fs-0
3. 重新部署验证
- 删除原有错误的Deployment、PV、PVC
- 应用新的YAML配置:
kubectl apply -f 你的配置文件.yaml - 确认PVC状态为Bound:
kubectl get pvc -n external-ns alejandra-dashboard - Pod启动成功后,查看挂载路径的权限,正常输出的
.目录属主应为alejandra(1001):kubectl exec -ti app1-XXX -n external-ns -- ls -al /app/var
4. hostPath存储修复方案
如果使用hostPath存储,执行以下操作:
- 登录你nodeSelector指定的worker节点,创建对应的hostPath目录,例如
/data/alejandra - 修改目录属主:
chown 1001:1001 /data/alejandra - Deployment的volumes字段配置为hostPath类型即可,securityContext配置保持不变
内容的提问来源于stack exchange,提问作者sincorchetes
相关产品推荐
相关产品推荐

