【问题标题】:Expose folder from a container as a volume in a Kubernetes Pod将容器中的文件夹公开为 Kubernetes Pod 中的卷
【发布时间】:2020-01-31 21:33:55
【问题描述】:

我有一个包含两个容器的 pod。一个容器是一个 Web 应用程序,另一个容器为这个 Web 应用程序存储一些静态数据。

这里的数据是一组文件,它们存储在这个容器的文件夹中,名称为/data,容器的唯一功能是存储这些数据并将它们暴露给网络应用程序。

我正在寻找与此 pod 中的 Web 应用程序容器共享此文件夹内容的方法。

如果我使用的是 YAML 规范,则两个容器中的文件夹都是空的。有没有办法在不清理容器文件夹的情况下共享数据?

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
    version: 1.2.3
spec:
  volumes:
    - name: my-app-data-volume

  containers:
    - name: my-app-server
      image: my-app-server-container-name
      volumeMounts:
        - name: my-app-data-volume
          mountPath: /data
      ports:
        - containerPort: 8080

    - name: my-app-data
      image: my-app-data-container-name
      volumeMounts:
        - name: my-app-data-volume
          mountPath: /data

【问题讨论】:

  • 为什么不使用特定于静态数据的东西,如 S3、GCS(其他)?那些是静态文件,你为什么要把它们放在一个 pod 中,用每个副本一个又一个地复制它们?
  • 这组两个容器是一种测试服务器,应该使用不同的测试数据集。为了实现这一点,我将数据从应用程序容器移动到另一个容器,以便更轻松地切换数据集。使用 docker-compose 这很容易,但现在我也应该在 Kubernates 环境中使用它们。
  • 请解释这个问题的减号原因。
  • 如果您使用一组不应该备份的数据,为什么不使用 init 容器将数据写入 pod 的卷中并将此结果安装到您的容器中?您将保留资源使用情况,生成的 pod 中只有一个容器。
  • 如果可以的话,另一个解决方案是使用 configmap?

标签: docker kubernetes docker-volume


【解决方案1】:

您可以为此使用EmptyDir 卷。将包含文件的容器指定为initContainer,然后将文件复制到 EmptyDir 卷中。最后,将该卷挂载到 Web 应用容器中。

【讨论】:

  • 那么唯一的方法就是创建一个 EmptyDir 并将数据复制到它吗?无法将容器中包含数据的现有文件夹公开为 Kubernetes 卷?
  • 据我所知,没有一个在生产中使用。请参阅相关讨论:stackoverflow.com/questions/30538210/…,以及此 alpha 项目:github.com/kubernetes-csi/csi-driver-image-populator
  • 当然这不是生产解决方案。这是一种用于 QA 环境的模拟服务器。
  • 您无法像在普通 Docker 中那样使用 Kubernetes 中映像的内容初始化卷。
  • @DavidMaze 非常感谢。刚得到那个。这里唯一的解决方法是使用command 子句将数据复制到共享文件夹。去寻找更好的东西))
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2014-11-20
  • 2020-12-28
  • 1970-01-01
  • 2020-02-19
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多