【发布时间】:2020-12-11 03:22:27
【问题描述】:
我正在使用 Docker 桌面在 kubernetes 平台上运行一个应用程序,我需要位置来存储文件我如何使用我的本地目录(c:\app-data)来指向在 kubernetes 中运行的应用程序。
【问题讨论】:
标签: kubernetes local-storage persistent-volumes
我正在使用 Docker 桌面在 kubernetes 平台上运行一个应用程序,我需要位置来存储文件我如何使用我的本地目录(c:\app-data)来指向在 kubernetes 中运行的应用程序。
【问题讨论】:
标签: kubernetes local-storage persistent-volumes
我遇到了类似的问题。 Docker contains 通常意味着作为一次性/网关容器,因此人们通常不使用它们来存储文件。
话虽如此,您有两个选择:
将路径和文件添加到 docker 容器,这将导致您的 docker 容器体积庞大(不推荐)。 Docker 构建将需要大量时间和内存,因为所有文件都将被复制。这是一个使用 docker 创建本地 ubuntu 容器的示例。 https://thenewstack.io/docker-basics-how-to-share-data-between-a-docker-container-and-host/
通过另一个服务器/api 托管您的文件,并在您的应用中使用简单的请求来获取这些文件。我使用了这个解决方案。唯一需要注意的是你需要 能够以某种方式托管您的文件。这很容易,但可能需要额外付款。 https://www.techradar.com/best/file-hosting-and-sharing-services
【讨论】:
你真的不能这样做。正确的方法取决于您要存储的数据是什么。
如果您只是想在某处存储数据——也许它是 MySQL StatefulSet 的支持数据——你可以像往常一样创建 PersistentVolumeClaim。 Minikube 包含a minimal volume provisioner,因此您应该自动创建一个 PersistentVolume;您无需为此进行任何特殊设置。但是,PersistentVolume 将存在于 minikube 容器/VM 中;如果您完全删除 minikube 设置,它可能会删除该数据,并且您将无法直接从主机访问数据。
如果您的容器需要访问主机上的数据集,有几种方法可以做到这一点。请记住,在“真实”的 Kubernetes 集群中,您根本无法访问本地文件系统。如上所述创建一个 PersistentVolume,然后运行一个 pod 将数据复制到其中可能是一种方法;正如@ParmandeepChaddha 在their answer 中建议的那样,将数据烘焙到图像中是另一种合理的方法(如果数据只有几兆字节,这可能非常合理)。
如果数据是流程的输入或输出数据,您还可以考虑重组应用程序,以便通过 HTTP 等协议传输数据。在您的应用程序前面设置一个 NodePort 服务,并使用像 curl 这样的工具将数据 HTTP POST 到服务中。
最后,您可能正在考虑所有重要数据都在本地的设置:您在本地系统上有一些批处理文件,该作业的目的是将一些本地文件转换为其他本地文件,而只是程序在 minikube 中。 (或者,类似地,您正在尝试开发您的应用程序并且源文件在您的本地系统上。)在这种情况下,Kubernetes 作为一个分布式集群容器系统,不是正确的工具。直接在您的系统上运行应用程序是最好的方法;您可以使用docker run -v 绑定挂载来模拟这种情况,但这很不方便,并且可能导致权限和环境问题。
(理论上你也可以使用 hostPath 卷,并且 minikube 对 mount a host directory into the VM 有一些支持。实际上,执行此操作所需的设置与 Kubernetes 设置的其余部分组合起来一样复杂,并且它赢了'不能移植到任何其他 Kubernetes 安装。我不会尝试这个。)
【讨论】:
您可以使用hostPath 将本地目录挂载到您的kubernetes Pod。您的 Windows 主机上的路径 c:\app-data 应表示为 /C/app-data 或 /host_mnt/c/app-data,具体取决于 this comment 中建议的 Docker 桌面 版本。
您可能还想看看this 的答案。
【讨论】: