本地K8s部署Node-RED读取文件遇ENOENT错误的解决方案咨询
Node-RED在Minikube中读取本地文件的解决方案
问题场景
我在本地Minikube的Kubernetes环境中部署了Node-RED,部署配置如下。尝试读取本地目录的D:\SHRDC\abss\test.txt文件时,报错:Error: ENOENT: no such file or directory, open 'D:\SHRDC\abss\test.txt',改用路径/data/test.txt也无法读取,求可行的解决方案。
部署配置YAML
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nodered name: nodered spec: replicas: 1 selector: matchLabels: app: nodered template: metadata: labels: app: nodered spec: containers: - name: nodered image: nodered/node-red:latest resources: requests: memory: 256Mi cpu: "0.2" limits: memory: 512Mi cpu: "1" ports: - containerPort: 1880 volumeMounts: - name: nodered-claim mountPath: /data/nodered # subPath: nodered <-- not needed in your case volumes: - name: nodered-claim persistentVolumeClaim: claimName: nodered-claim --- apiVersion: v1 kind: PersistentVolume metadata: name: small-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /data nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - minikube --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nodered-claim spec: storageClassName: local-storage accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: Immediate --- apiVersion: v1 kind: Service metadata: name: node-red-service spec: type: LoadBalancer selector: app: nodered ports: - port: 1880 targetPort: 1880
问题原因
- 容器无法直接访问宿主机Windows路径:Node-RED运行在Minikube的虚拟机容器内,不能直接读取宿主机D盘的文件,必须通过Kubernetes的本地持久卷(Local PV)做目录映射。
- 路径映射不匹配:当前PV映射的是Minikube节点内部的
/data目录,而非宿主机的D:\SHRDC\abss;同时容器内挂载路径是/data/nodered,所以直接用/data/test.txt找不到文件。
解决方案
步骤1:把宿主机文件同步到Minikube节点
Minikube是虚拟机,先把宿主机的test.txt复制到Minikube节点的/data目录(对应PV的路径):
minikube cp D:\SHRDC\abss\test.txt minikube:/data/test.txt
步骤2:调整容器挂载路径(按需选择)
如果想在Node-RED中直接用/data/test.txt访问文件,修改Deployment里的volumeMounts,把挂载路径从/data/nodered改成/data:
# 修改Deployment.spec.containers.volumeMounts部分 volumeMounts: - name: nodered-claim mountPath: /data # 原路径为/data/nodered,替换为/data
修改后重新应用配置:
kubectl apply -f <你的部署文件名>.yaml
如果保持原挂载路径/data/nodered,则需要把文件同步到Minikube节点的/data/nodered目录:
minikube cp D:\SHRDC\abss\test.txt minikube:/data/nodered/test.txt
步骤3:Node-RED中使用正确路径
- 若挂载路径为
/data:文件在容器内的路径是/data/test.txt,直接在Node-RED的文件节点中填入该路径。 - 若挂载路径为
/data/nodered:文件路径为/data/nodered/test.txt。
验证方法
进入容器确认文件存在:
# 获取Pod名称 kubectl get pods # 进入容器 kubectl exec -it <nodered-pod-name> /bin/bash # 查看文件(根据挂载路径调整) ls /data cat /data/test.txt # 或者 ls /data/nodered cat /data/nodered/test.txt
内容的提问来源于stack exchange,提问作者Quazi Afnan Ahmed
相关产品推荐
相关产品推荐

