Django 无法访问 Azure 装载的存储

Django can't access Azure mounted storage

我在使用 AKS (kubernetes) 的 Azure 服务器上 运行 我的 Djagno 应用程序(python 2.7,django 1.11)。

我在 /data/media 上安装了一个持久存储卷。 当我尝试通过我的应用程序上传文件时,出现以下错误:

Exception Value: [Errno 13] Permission denied: '/data/media/uploads/<some_dir>'
Exception Location: /usr/local/lib/python2.7/os.py in makedirs, line 157

os.py 中有问题的行是试图创建目录 mkdir(name, mode) 的行。

当我使用 kubectl exec -it <my-pod> bash 访问 pod(用户是 root)时,我可以轻松地 cd 进入 /data/media 目录,创建子文件夹并在 Azure 门户中看到它们。所以我的坐骑完全没问题。

我试过 chmoding /data/media 但这不起作用。似乎我无法更改已安装持久卷上文件夹的权限,也无法添加用户或更改组。因此,从我的 pod 访问该卷似乎没有问题,但由于 Django 不是 运行 根用户,它无法访问它。

我该如何解决这个问题?谢谢。

事实证明,由于Azure文件共享挂载实际上是k8s集群拥有的,pods中的Docker容器运行只是作为入口挂载,但是无法修改其权限,因为他们不拥有它。

它现在开始发生的原因得到了解释 here:

... it turned out that the default directory mode and file mode differs between Kubernetes versions. So while the the access mode is 0777 for Kubernetes v1.6.x, v1.7.x, in case of v1.8.6 or above it is 0755

所以对我来说,解决方法是将已安装卷所需的访问权限添加到 k8s 规范中,如下所示:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: <volumeName>
  annotations:
    volume.beta.kubernetes.io/storage-class: <className>
spec:
  mountOptions:
    - dir_mode=0777
    - file_mode=0777
  accessModes:
    - ReadWriteMany
...

** 我写了0777作为例子。您应该仔细设置为您写的内容。

希望这对任何人都有帮助。