我正在使用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)时,我可以轻松地进入/data/media
目录,创建子文件夹并将其反映在Azure门户中。所以我的坐骑非常好。
我尝试更改/data/media
,但这不起作用。似乎我无法更改已安装的持久卷上文件夹的权限,也无法添加用户或更改组。因此,从我的Pod中访问该卷似乎没有问题,但是由于Django不是以root身份运行,因此它无法访问它。
我该如何解决?谢谢。
答案 0 :(得分:0)
事实证明,由于Azure文件共享安装实际上是由k8s群集拥有的,因此在pod中运行的Docker容器仅将其安装为入口点,但是由于它们不拥有它而无法修改其权限。
它开始发生的原因在here中进行了解释:
...事实证明,默认的目录模式和文件模式在Kubernetes版本之间有所不同。因此,尽管Kubernetes v1.6.x,v1.7.x的访问模式为0777,但对于v1.8.6或更高版本,访问模式为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为例。您应该仔细设置适合您的内容。
希望这对任何人都有帮助。