本地Kubernetes挂载PersistentVolume共享数据时目录找不到问题排查
问题定位与解决方法
问题根因梳理
- 你指定的输入输出路径
/usr/local/dat/shared/input/Archive、/usr/local/dat/shared/output/Archive2在挂载的PV中不存在,JAR包启动时检测不到路径直接抛出异常退出 - hostPath类型的PV路径配置可能不匹配:如果你使用Docker Desktop运行K8s(Windows/Mac环境),PV中配置的
/home/zoltanvilaghy/WORK/ctp/shared是Docker虚拟机内部路径,默认和你本地物理机的路径不互通 - 挂载操作会覆盖容器内
/usr/local/dat/shared路径下原有的文件,如果你提前在镜像里创建了该目录下的内容,挂载后会被PV内容替换 - 本地hostPath目录权限不足,kubelet没有读写权限导致挂载后目录不可访问
排查步骤
1. 临时修改Pod配置让容器保持运行,方便进入调试
修改你的Pod.yml,覆盖默认ENTRYPOINT,启动后先休眠1小时避免直接退出:
apiVersion: v1 kind: Pod metadata: name: dat-tool-pod labels: name: dat-tool-pod spec: containers: - name: dat-tool image: dat_docker imagePullPolicy: Never # 新增command覆盖原有ENTRYPOINT,休眠3600秒 command: ["sleep", "3600"] volumeMounts: - mountPath: /usr/local/dat/shared name: dat-volume restartPolicy: Never volumes: - name: dat-volume persistentVolumeClaim: claimName: dat-pvc
应用配置后执行kubectl exec -it dat-tool-pod -- bash进入容器,执行以下检查:
- 运行
mount | grep shared确认PV是否正常挂载到/usr/local/dat/shared - 运行
ls -l /usr/local/dat/shared查看挂载目录下的文件,确认是否存在input、output子目录 - 运行
ls -l /usr/local/dat/tool/DAT.jar确认JAR包是否存在
2. 修复hostPath路径匹配问题
- 如果是Linux系统直接运行K8s:检查本地
/home/zoltanvilaghy/WORK/ctp/shared目录权限,执行sudo chmod 755 -R /home/zoltanvilaghy/WORK/ctp/shared赋予读写权限 - 如果是Docker Desktop(Windows/Mac)运行K8s:
- 打开Docker Desktop设置 -> 资源 -> 文件共享,把你本地物理机存放shared目录的父路径加入共享列表,点击应用重启Docker
- 修改PV的hostPath路径:Windows环境下本地
C:\WORK\ctp\shared对应PV路径为/run/desktop/mnt/host/c/WORK/ctp/shared;Mac环境下本地/Users/xxx/WORK/ctp/shared对应PV路径为/Users/xxx/WORK/ctp/shared
3. 自动创建缺失目录避免报错
修改Pod的启动命令,在运行JAR前先自动创建输入输出目录,不需要手动提前创建:
containers: - name: dat-tool image: dat_docker imagePullPolicy: Never command: ["sh", "-c"] args: ["mkdir -p /usr/local/dat/shared/input/Archive /usr/local/dat/shared/output/Archive2 && java -jar ./tool/DAT.jar -in /usr/local/dat/shared/input/Archive -out /usr/local/dat/shared/output/Archive2 -da"] volumeMounts: - mountPath: /usr/local/dat/shared name: dat-volume
验证方法
修改完所有配置后重新创建PV、PVC、Pod,启动完成后在容器内的/usr/local/dat/shared目录创建测试文件,确认本地物理机对应的shared目录下能看到该文件,即表示挂载正常,再运行JAR包即可正常处理文件。
内容的提问来源于stack exchange,提问作者Twilord
相关产品推荐
相关产品推荐

