在Kubernetes Pod中将容器内的文件夹作为卷暴露出来。

3
我有一个包含两个容器的pod。其中一个容器是Web应用程序,另一个容器存储此Web应用程序的某些静态数据。
这里的数据是一组文件,存储在该容器的文件夹中,文件夹名称为 /data,该容器的唯一功能是存储此数据并将其公开给Web应用程序。
我正在寻找的方法是共享此文件夹的内容与此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里,并在每个副本中复制它们? - night-gold
这组两个容器是一种测试服务器,应该使用不同的测试数据集。为了让这成为可能,我将数据从应用程序容器移动到另一个容器中,以使切换数据集更简单。使用 docker-compose 很容易实现,但现在我也应该在 Kubernetes 环境中使用它们。 - Alexey Usharovski
请解释一下为什么对于这个问题要减去。 - Alexey Usharovski
如果您使用的数据集不需要备份,为什么不使用一个 init 容器将数据写入到 pod 的卷中,并将此结果挂载到容器内部?这样可以保留资源使用情况,只在最终的 pod 中使用一个容器。 - night-gold
另一个解决方案是,如果可以的话,使用configmap? - night-gold
需要考虑一下。目前,我需要在 Kubernetes 中运行现有的解决方案。 - Alexey Usharovski
1个回答

5

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


那么唯一的方法就是创建一个EmptyDir并将数据复制到其中吗?没有办法将容器中带有数据的现有文件夹公开为Kubernetes卷吗? - Alexey Usharovski
据我所知,目前没有任何正在使用的相关项目。请参阅相关讨论:https://dev59.com/al0a5IYBdhLWcg3wRGvp,以及这个alpha项目:https://github.com/kubernetes-csi/csi-driver-image-populator。 - Jamie
当然,那不是一个生产解决方案。那是为QA环境设计的一种模拟服务器。 - Alexey Usharovski
1
在 Kubernetes 中,无法像在普通的 Docker 中那样使用镜像初始化卷。 - David Maze
@DavidMaze 非常感谢。我刚刚明白了。这里唯一的解决方法是使用“command”子句将数据复制到共享文件夹。我会寻找更好的解决方案)) - Alexey Usharovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接