如何在 GCP(Google Cloud Platform)上的 Kubernetes 中使用 Django / nginx 提供用户上传的文件

如何在 GCP(Google Cloud Platform)上的 Kubernetes 中使用 Django / nginx 提供用户上传的文件

我正在尝试将 django(使用 gnunicorn)/nginx/postgres docker-compose 环境(使用 docker-compose)转换为 GCP 上的 kubernetes。除了提供媒体内容外,一切都运行顺利。在 django 中,这是任何用户上传的内容。比如说,用户上传了个人资料图片或压缩文档等...

问题是,我创建了一个 PVC(持久卷声明)定义,并且需要它是可写的。我在声明上设置了以下访问模式:ReadWriteOnce 和 ReadOnlyMany。我知道一次只有一个容器可以以 ReadWrite 模式挂载卷。

我希望让 django 容器以 ReadWrite 模式绑定到 PV(持久卷),并让 nginx 容器以 ReadOnly 模式绑定相同的 PV。Nginx 只需要读取权限。但是,这似乎在 GCP 中是不允许的,因为一次只有一个容器可以绑定一个 PV。当我应用配置时,一个容器挂载了它(处于 RO 模式的 nginx 容器),而另一个(django)无法挂载并无限期地停留在“ContainerCreating”状态。

所以我的问题是,如何在 GCP/Kubernetes 上提供用户上传的内容(django 将其存储在 /media/* 中)?我应该使用一些神奇的搜索词,或者我可以阅读任何文档吗?有很多关于在 GCP/kubernetes 上运行 django 的指南,但我发现它们都没有解决这个问题。

在 docker-compose 环境中,django 容器和 nginx 容器都挂载了相同的卷。因此,在 nginx 配置中,我只需为 /media 创建一个别名来指向卷挂载。

静态内容没问题,因为我有解决方案。只是动态用户上传是个问题。目前,只有 django 容器安装了该卷。因此用户可以上传文件,但我无法显示它,因为 nginx 无法链接到它。

任何帮助,将不胜感激。

谢谢。

答案1

你需要一个共享卷两个容器之间。您可以使用包含两个容器和共享卷的 pod 定义来完成此作业。

你的部署应该是这样的:

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    persistentVolumeClaim:
        claimName: myclaim

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: django-container
    image: django
    volumeMounts:
    - name: shared-data
      mountPath: /media

相关内容