有没有一种方法可以在容器之间共享文件,并在 kubernetes 中具有写入和读取访问权限



我刚刚开始探索kubernetes的概念。我正在使用舵图来进行吊舱的部署。为解决以下问题而陷入困境。任何人都可以帮我解锁这个问题。

我有三个容器,比方说A、B和C。容器A有一个文件=>quot/root/dir1/sample.txt";。否则,我可以离线准备这个文件,但需要安装在所有三个容器中。容器A和容器C有一个正在运行的服务,它将更新该文件。容器B有一个正在运行的服务,它将读取该文件。所以,我需要在所有三个容器中共享这个文件。

方法1:使用emptyDir卷,我尝试挂载这个文件,但这对我的情况没有帮助。因为当我使用emptyDir时,我会丢失通过容器映像提供的dir1下的所有文件。此外,我不希望dir1下的其他文件在容器之间共享。除此之外,我需要将文件挂载为相同的目录结构"/root/dir1/sample.txt";而不是创建空的dir,比如"/root/dir2";作为共享数据装载并将sample.txt复制到dir2作为"装载"/root/dir2/sample.txt";。现在的原因是在所有三个容器中装载/root/dir2(文件写入发生在其他容器中反映的任何容器中(。但这对我的情况没有帮助,因为我需要将文件装载为相同的目录结构"/root/dir1/sample.txt";。

方法2:使用configmap volume,我可以将文件";sample.txt";按预期在dir1下。但它被装载为只读文件系统,容器A和C无法写入该文件。

所以以上两种方法对我的情况没有帮助。若有人能帮助我如何在相同的目录结构下将文件直接装载到具有写访问权限的容器中并在容器之间共享,那个将是一件很棒的事情。或者kubernetes中提供的任何卷类型都会对我的情况有所帮助(https://kubernetes.io/docs/concepts/storage/volumes/#cinder)。

提前感谢!

我认为最好的选择是使用emptyDir和initContainer,后者将其装载到另一个路径并将原始文件复制到其中。这不是一种常见的模式。在rabbitmqcluster操作符中查看它的实际操作。

在吊舱中看起来像这样:

(...)
spec:
volumes:
- name: shared-dir
emptyDir: {}
initContainers:
- name: prepare-dir
image: YOUR_IMAGE
command:
- sh
- '-c'
- 'cp /root/dir1 /tmp/dir1'
volumeMounts:
- name: shared-dir
mountPath: /tmp/dir1/
containers:
- name: container-a
image: YOUR_IMAGE
volumeMounts:
- name: shared-dir
mountPath: /root/dir1/
- name: container-b
image: YOUR_IMAGE
volumeMounts:
- name: shared-dir
mountPath: /root/dir1/
(...)

这是一个多读多写的场景,我知道有两种方法可以做到这一点。

首先,您可以使用外部装载(如NFS服务器(,然后将其装载到您的pod中。如果你没有自己的NFS服务器,你可以使用托管的NFS服务,如谷歌上的Cloud Firestore或AWS上的EFS(注意这会产生成本(

其次,您可以在集群中安装一个NFS provisioner,比如这个,它将生成一个新的StorageClass,您可以使用它来生成一个具有读写多功能的PersistentVolume,并且您可以在您的pod中共享它。虽然这是一个集群本机选项,但也有其自身的问题——如果预配置器pod崩溃或被逐出,则取决于NFS装载的pod将挂起,然后也会崩溃,因此YMMV也是如此。

相关内容

最新更新