先说下问题,以WSL2作为后端服务,在Kubernetes中挂载卷的时候(比如在hostPath中),书写Windows的路径是个很麻烦的事。
先看个示例:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxnamespace: nginxlabels:nginx-app: nginxspec:replicas: 1selector:matchLabels:nginx-app: nginxtemplate:metadata:labels:nginx-app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80volumeMounts:- mountPath: /usr/share/nginx/htmlname: nginx-datavolumes:- name: nginx-datahostPath:path: D:/Users/quanzaiyu/.docker/datas/nginx/htmltype: Directory
看到 hostPath.path 节点,我最开始写的是Windows的路径形式,不过很遗憾,没有成功。
看到报错信息,提示:
Error: Error response from daemon: invalid mode: /usr/share/nginx/html
说明路径解析有问题,于是换了种写法:
volumes:- name: nginx-datahostPath:path: /d/Users/quanzaiyu/.docker/datas/nginx/htmltype: Directory
结果这次报错:
MountVolume.SetUp failed for volume "nginx-data" : hostPath type check failed: /d/Users/quanzaiyu/.docker/datas/nginx/html is not a directory

还是不成功啊。
于是想着估计得用WSL中的路径,于是进入WSL,查看了Windows的路径:
C:\Windows\System32>wsl -l适用于 Linux 的 Windows 子系统分发版:Ubuntu (默认)docker-desktopdocker-desktop-dataC:\Windows\System32>wsl -d docker-desktopDESKTOP-KR4DIJ4:/tmp/docker-desktop-root/mnt/host/c/Windows/System32# cd /DESKTOP-KR4DIJ4:/# lsbin lib rundev lost+found sbindocker-desktop-deploy-version media srvdocker-desktop-proxy mnt sysetc opt tmphome proc usrinit root varDESKTOP-KR4DIJ4:/# cd mntDESKTOP-KR4DIJ4:/mnt# lshost version-packDESKTOP-KR4DIJ4:/mnt# cd hostDESKTOP-KR4DIJ4:/mnt/host# lsc d e f g wslDESKTOP-KR4DIJ4:/mnt/host# cd dDESKTOP-KR4DIJ4:/mnt/host/d# ls$RECYCLE.BIN MinGW System Volume Information projectsBOOT PHPWAMP_IN3 UsersDocument Program Files WSLGames Recovery Workplace
看样子,Windows的磁盘都是挂载到WSL中的 /mnt/host 下。
于是继续修改:
volumes:- name: nginx-datahostPath:path: /mnt/host/d/Users/quanzaiyu/.docker/datas/nginx/htmltype: Directory
结果很崩溃,仍然是报路径不存在。
各种Google各种Stack Overflow,最终还是在GitHub中找到了相关的issue,花了整整一个下午,泪奔到崩溃😭,下面是解决方案。
解决此问题,来自于一个issue:Kubernetes Volumes not correctly mounted with WSL2
可以看到,需要配置为如下路径:
volumes:- name: nginx-datahostPath:path: /run/desktop/mnt/host/d/Users/quanzaiyu/.docker/datas/nginx/htmltype: Directory
这次,终于成功启动了:
太不容易了,这种问题官方文档居然没有收录,还得在issue中寻找答案。
在Windows对应的路径下创建文件:
访问 http://localhost:30002/ 可以看到 index.html 中的内容,说明Volume挂载成功:
完整的YAML如下:
apiVersion: v1kind: Namespacemetadata:name: nginx---apiVersion: apps/v1kind: Deploymentmetadata:name: nginxnamespace: nginxlabels:nginx-app: nginxspec:replicas: 1selector:matchLabels:nginx-app: nginxtemplate:metadata:labels:nginx-app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80volumeMounts:- mountPath: /usr/share/nginx/htmlname: nginx-datavolumes:- name: nginx-datahostPath:path: /run/desktop/mnt/host/d/Users/quanzaiyu/.docker/datas/nginx/htmltype: Directory---apiVersion: v1kind: Servicemetadata:name: nginxnamespace: nginxspec:type: NodePortports:- port: 80targetPort: 80nodePort: 30002selector:nginx-app: nginx
弄完之后,整个人都崩了,无心coding,一直磨洋工到了下班😂。
其他相关内容:
