“MountVolume.SetUp”无法为卷“mongo”设置:hostPath类型检查失败:/mongo/data不是一个目录。

17

我正在尝试配置hostPath以启动Mongodb pod。

我只安装了一个kubernetes v1.8.5节点和最新的rancher稳定版本。

我创建了文件夹/mongo/data并允许所有用户拥有所有权限。enter image description here

我能够在不使用sudo的情况下成功运行docker镜像:

docker run --name some-mongo -v /mongo/data:/data/db mongo:3.2.1

但是当我部署到kubernetes时:

sudo kubectl create -f mongodb.yml

我会得到MountVolume.SetUp failed for volume "mongo" : hostPath type check failed: /mongo/data is not a directory

这是mongodb.yml文件:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: mongo:3.2.1
    name: test-container
    volumeMounts:
    - mountPath: /data/db
      name: mongo
  volumes:
  - name: mongo
    hostPath:
      # directory location on host
      path: /mongo/data
      # this field is optional
      type: Directory

你有任何想要寻找的地方吗?

6个回答

24
如果您正在使用minikube,那么请记住minikube本身是一个容器。因此,hostPath指向该容器中的路径,而不是主机上的路径。您必须将PC路径挂载到minikube容器中,然后再挂载到POD中。

示例: minikube start --mount --mount-string="/host/path:/minikubeContainer/path"


1
哥们,非常感谢!只是提醒一下 - minikube 是虚拟机,不是容器。 - Skyblade
1
@Skyblade 很高兴能帮忙,也很高兴能学到新东西!您介意详细说明一下“minikube是VM”吗?我认为如果您正在使用Docker,那么minikube就是其容器。例如,您可以执行docker ps并查看minikube容器正在运行。此外,当我尝试通过清理docker system prune来释放一些磁盘空间时,我遇到了许多问题,它删除了我的已停止的minikube容器。我完全困惑了,我的minikube实例去哪了?!也许我错了,您怎么知道它是一个VM呢? - vladimirror
1
我的错。过去是这样的,但现在minikube使用docker驱动程序,所以这不是真的。对于误导你感到抱歉。 - Skyblade

14

我将 type: Directory 更改为 type: DirectoryOrCreate,这对我很有效。


13

从mongodb.yml中删除type: Directory的操作符合预期

更新:

在新版本中,将type: Directory更改为type: DirectoryOrCreate会创建该目录。


3
您正在直接在主节点上创建Docker容器。因此,您可以使用新创建的目录运行Docker容器。但是,当您启动Kubernetes yaml文件时,它意图在工作节点上运行。由于您在主节点上创建了目录,kubelet无法在工作节点上找到该目录并失败。这就是为什么type标志下的"DirectoryorCreate"值是一种解决方案的原因。

0
作为Windows主机,将路径格式从Windows风格的C:\Users\...更改为Unix风格的/C/Users/...对我很有效。

0

我遇到了和你一样的错误。

在我的情况下,问题出在卷hostPath中定义的文件夹没有被创建。 一旦在工作节点服务器上创建了该文件夹,问题就得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接