我正在尝试将 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