我正在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”
3条答案
按热度按时间nuypyhwy1#
这看起来像是一个如何在Windows上编写路径的问题,我在下面的参考文献中看到了这个问题。
解决方案:
参考资料:https://github.com/kubernetes/kubernetes/issues/59876#issuecomment-628955935https://github.com/docker/for-win/issues/1703#issuecomment-366701358。
pdkcd3nj2#
如果在Windows上使用基于WSL的引擎,则路径应为
/run/desktop/mnt/host/c/<folder>
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上的目录
现在我更正了我的yaml文件,看起来像这样:
现在,当我创建卷挂载时,WSL用我预先填充的文件重新创建目录。
导航到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卷声明和卷不会自动回收该资源。