主机路径卷未装载到运行在Windows Docker-desktop上的kubernetes上

jdzmm42g  于 2023-04-20  发布在  Kubernetes
关注(0)|答案(3)|浏览(238)

我正在Windows的Docker-desktop上运行kubernetes。我正在从我的WSL连接到集群。我的所有pod都运行正常。我正在尝试使用hostpath在我的jupyterlab(pod)上挂载卷。下面是我的配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyter
  labels:
    app: jupyter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter
  template:
    metadata:
      labels:
        app: jupyter
    spec:
      containers:
      - name: jupyter
        image: jupyter:1.1
        ports:
        - containerPort: 8888
        securityContext:
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
          - name: mydir
            mountPath: /notebooks
      volumes:
        - name: mydir
          hostPath:
            # directory location on host
            path: /home/<myuser>/data
            # this field is optional
            type: DirectoryOrCreate

pod启动时没有任何问题。但是我没有看到我保存在我的hostpath中的notbooks到我的jupyter实验室,反之亦然(如果我在jupyter实验室中保存一个notebook,它不会保存到我的hostpath中)。
我遵循了www.example.com上的教程https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
我想指出的是,我正在使用@FROM jupyter/datascience-notebook:python-3.7.6”作为我的docker镜像。
我尝试挂载/home/jovyan/,但在启动pod时它给了我访问相关的错误。所以我恢复到“/notebooks”

nuypyhwy

nuypyhwy1#

这看起来像是一个如何在Windows上编写路径的问题,我在下面的参考文献中看到了这个问题。
解决方案:

  • 如果你的文件在C:驱动器,则应将其转换为下面的
/host_mnt/c/path/to/my/folder
  • 如果以上操作不起作用,您可能需要删除“类型:DirectoryOrCreate”并重试。

参考资料:https://github.com/kubernetes/kubernetes/issues/59876#issuecomment-628955935https://github.com/docker/for-win/issues/1703#issuecomment-366701358。

pdkcd3nj

pdkcd3nj2#

如果在Windows上使用基于WSL的引擎,则路径应为/run/desktop/mnt/host/c/<folder>

3df52oht

3df52oht3#

我也遇到了这个问题。上面的答案是正确的。前缀如/mnt或/host_mnt似乎都可以工作。但是,我和作者一样写错了yaml文件。一旦你用'kubectl apply -f filename.yaml'应用yaml文件,它将在WSL中创建一个卷挂载,但是它将是空的。现在如果你使用“kubectl delete”来清理资源,然后用一个正确的yaml文件再试一次,这是因为默认的保留策略似乎暗示WSL实际上不会删除它创建的目录。
我使用诸如此类的命令进行了验证,这些命令显示/host_mnt下的同一目录似乎是空的,但主机上的实际目录具有预期的文件。我不知道为什么我不能直接用'wsl -e ls /host_mnt'查看host_mnt子目录。我不得不打开一个git bash终端到硬盘上的一个目录,然后使用相对路径导航来回溯到根目录。

wsl -e ls ../../../../host_mnt/v/TrustedData/test-data  # readme.txt doesn't exist
ls /v/TrustedData/test-data   # readme.txt does exist where I expect
readme.txt

然后,我使用以下命令手动删除了wsl上的目录

wsl -e rmdir ../../../../host_mnt/v/TrustedData/test-data

现在我更正了我的yaml文件,看起来像这样:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv
  labels:
    type: local
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 10Gi
  storageClassName: manual
  volumeMode: Filesystem
  hostPath:
    path: "/mnt/v/TrustedData/mnt"

现在,当我创建卷挂载时,WSL用我预先填充的文件重新创建目录。

winpty kubectl -it exec task-pv-pod -- bash

导航到pod中的/usr/share/nginx/html目录,我可以看到预期的index.html文件,curl命令按预期工作。我一直在https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/上学习教程,所以我的pod和卷声明规范与那篇文章中描述的相同。
回收策略参考:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming
由于WSL如何将主机路径从主机挂载到VM,因此此问题似乎是Windows特定的。删除kubernetes卷声明和卷不会自动回收该资源。

相关问题