有没有一种方法可以在 kubernetes 中跨容器共享具有读写访问权限的文件

ano*_*ser 4 kubernetes

我刚刚开始探索 Kubernetes 概念。我正在使用 Helm Chart 来部署 Pod。被困于解决以下问题。任何人都可以帮我解决这个问题。

我有三个容器,比如说 A、B 和 C。容器 A 有一个文件 =>“/root/dir1/sample.txt”。否则,我可以离线准备该文件,但需要安装在所有三个容器中。容器 A 和容器 C 正在运行一个服务,该服务将更新该文件。容器 B 正在运行一个服务来读取该文件。因此,我需要在所有三个容器之间共享此文件。

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

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

所以上述两种方法对我的情况没有帮助。如果有人帮助我如何将文件直接挂载到具有相同目录结构下的写访问权限并在容器之间共享的容器中,那就太好了。或者 kubernetes 中可用的任何卷类型都会对我的情况有所帮助(https://kubernetes.io/docs/concepts/storage/volumes/#cinder)。

提前致谢!

chi*_*cio 5

我认为最好的选择是使用一个emptyDir和一个initContainer,将其安装到另一个路径并将原始文件复制到其中。这并不罕见。在rabbitmq集群操作符中查看它的实际情况。

在 Pod 中看起来像这样:

(...)
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/
(...)
Run Code Online (Sandbox Code Playgroud)