【问题标题】:Mount local directory into pod in minikube将本地目录挂载到 minikube 的 pod 中
【发布时间】:2018-07-10 03:20:06
【问题描述】:

我正在运行 minikube v0.24.1。在这个 minikube 中,我将为我的 nginx 应用程序创建一个 Pod。而且我想从我的本地目录传递数据。

这意味着我想将我的本地 $HOME/go/src/github.com/nginx 挂载到我的 Pod 中

我该怎么做?

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:0.1
    name: nginx
    volumeMounts:
    - mountPath: /data
      name: volume
  volumes:
  - name: volume
    hostPath:
      path: /data

【问题讨论】:

标签: kubernetes minikube


【解决方案1】:

您不能将本地目录直接挂载到 Pod 中。

首先,您需要将您的目录 $HOME/go/src/github.com/nginx 挂载到您的 minikube 中。

$ minikube start --mount-string="$HOME/go/src/github.com/nginx:/data" --mount

然后,如果您使用 hostPath 将 /data 挂载到您的 Pod 中,您将获得本地目录数据到 Pod 中。

还有另一种方式

Host 的 $HOME 目录被挂载到 minikube 的 /hosthome 目录中。在这里你会得到你的数据

$ ls -la /hosthome/go/src/github.com/nginx

所以要挂载这个目录,你可以改变你的 Pod 的 hostPath

hostPath:
  path: /hosthome/go/src/github.com/nginx

【讨论】:

  • 我的 pod 中没有 /hosthome
  • @aclokay 挂载点因 VM 驱动程序而异,如 this 表所示。请注意,它通常不适用于 KVM 驱动程序。在 0.28 版中使用 VirtualBox 时似乎还存在一个当前未解决的错误,请参见此处。
  • 挂载功能似乎不稳定:github.com/kubernetes/minikube/issues/3048
  • 对于minikube start,此答案的语法不正确(至少对于 v1.0.0 版本)。正确的语法(来自下面的@K.S 答案)是minikube start --mount-string ${HOME}/go/src/github.com/nginx:/data --mount
  • 我发现我在OSX上只有空目录,直到我从--vm-driver=docker切换到virtualbox,终于开心了
【解决方案2】:

我尝试了 aerokite 的解决方案,但发现我必须通过 --mount--mount-string "local-path:minikube-path" 才能在 minikube 中挂载目录。

minikube start --mount-string ${HOME}/go/src/github.com/nginx:/data --mount。 花了一些时间弄清楚这一点。

【讨论】:

  • 在 minikube 0.35 中这是行不通的。我的家庭目录已安装。但我看到按摩创建安装 C:\\Users\\grigo\\IdeaProjects\\bigkube\\target\\scala-2.11:/data/jars.
  • @SanghyunLee 谷歌搜索了很多,最后只看minikube start --help 并从那里找到--mount 参数的描述:“这将启动挂载守护进程并自动将文件挂载到minikube”
  • 很遗憾,这不支持minikube mount--gid--uid 选项。另外,请注意,我已经阅读了他们的 repo 问题,它可能会出现错误行为,例如空挂载文件夹(尤其是使用虚拟机管理程序而不是使用 virtualbox)。
【解决方案3】:

我找到了办法。

这样你可以直接将目录挂载到容器中。您不必先将目录挂载到 minikube。

我们可以在volumes中使用hostPath来指定要添加到容器中的目录

  volumeMounts:
    - name: crypto-config
      mountPath: <PATH IN CONTAINER>
    - name: channel-artifacts
      mountPath: /opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
    - name: chaincode
      mountPath: /opt/gopath/src/github.com/chaincode
  volumes:
    - name: crypto-config
      hostPath:
        path: <YOUR LOCAL DIR PATH>
    - name: channel-artifacts
      hostPath:
        path: /Users/akshaysood/Blockchain/Kubernetes/Fabric/network/channel-artifacts
    - name: chaincode
      hostPath:
        path: /Users/akshaysood/Blockchain/Kubernetes/Fabric/network/chaincode

【讨论】:

【解决方案4】:

DefaultMountDir

Minikube 已经默认挂载到 VM 的主目录:

  • 在 Mac 上它挂载所有用户的目录 - /Users
  • 在 Linux 和 Windows 上只是当前用户的家 - homedir.HomeDir()

如果您浏览 Minikube 资源,您可以看到它是如何做到的。
这是目前的搜索,但结果可能会随着时间的推移而改变:
https://github.com/kubernetes/minikube/search?q=DefaultMountDir&unscoped_q=DefaultMountDir

HomeDir() 的定义是: https://godoc.org/k8s.io/client-go/util/homedir

您始终可以在 Minikube VM 中执行 minikube ssh 并进行探索:

$ df -hl
Filesystem      Size  Used Avail Use% Mounted on
...
/Users          466G  442G   25G  95% /Users

由于 Minikube 是一个单节点 Kubernetes 集群,因此您可以将 /Users/... 挂载到您的 pod 中。

推荐方式

minikube mount /path/to/dir/to/mount:/vm-mount-path 是将目录挂载到 minikube 的推荐方式,以便它们可以在本地 Kubernetes 集群中使用。该命令适用于所有支持的平台。

查看文档和示例: https://minikube.sigs.k8s.io/docs/tasks/mount/

【讨论】:

    【解决方案5】:

    在为此苦苦挣扎了一个小时并查看了这些答案后,我得到了一些与工作有点相似的东西:

    首先,我以virtualbox 作为驱动程序运行minikube

    minikube version
    minikube version: v1.9.2
    

    我的启动命令: minikube start --mount=true --mount-string=$(HOME)/somedir/on/host/:/somedir/on/vm/

    如果您对此感到困扰,我强烈建议您运行 minikube help 以查看标志是什么。我怀疑这些可能会因不同的版本/构建而发生变化。


    如果您希望将此挂载目录放入您的 pod,则必须在清单文件中建立卷和卷挂载。 这是我的简化版。

    apiVersion: v1
    kind: Service
    ...
    ---
    
    apiVersion: apps/v1
    kind: Deployment
    ...
    spec:
      replicas: 1
      ...
      template:
        ...
        spec:
          containers:
          ...
          volumeMounts:
          - name: someName
            mountPath: /somedir/on/vm/
        ...
        volumes:
        - name: someName
          hostPath:
            path: /somedir/on/vm/
    

    希望额外的润色、细节和组织可以帮助其他人在这方面更快一点。


    重新审视这个,因为其他人似乎喜欢它: 如果您绑定到纯minikube,我建议使用上述方法,但我发现使用 skaffold 和 docker for mac 本地开发 minikube 集群的更好方法。 Docker for mac 可以使用本地机器的 docker 守护进程在本地(在容器中)运行类似 k8s 集群的 minikube(因此挂载文件等轻而易举)。它很可爱,与 skaffold 一起使用可以实现热重载和所有其他天堂般的功能。如果您对 minikube 的沉重程度不满意,请检查这些技术。

    【讨论】:

      【解决方案6】:

      对于已经运行的 minikube,您可以执行以下操作:

      nohup minikube mount <host-directory-path>:<desired-minikube-directory-path> &

      【讨论】:

        【解决方案7】:

        检查在 minikube 运行中挂载了哪些通道 minikube ssh 然后ls -la

        【讨论】:

          【解决方案8】:

          不确定我是否迟到了,但我通过执行以下命令进行了 root:root 映射:

          minikube start --mount-string="/:/"

          这只会将您的本地文件系统根目录挂载到 minikube 并保持系统之间的无缝连接。希望对您有所帮助。

          【讨论】:

          • 您应该避免挂载您的主机根文件夹。 Minikube 已经 mounts automatically(在 virtualbox 上)主机主文件夹。如果要挂载不在主机用户文件夹下的特定目录,则应显式挂载其路径;只需更改 mount-string 中的挂载路径即可。
          猜你喜欢
          • 2021-06-14
          • 2019-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-30
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          相关资源
          最近更新 更多