Django не может получить доступ к подключенному хранилищу Azure

Я запускаю свое приложение Djagno (python 2.7, django 1.11) на сервере Azure с использованием AKS (kubernetes).

У меня есть том постоянного хранилища, смонтированный на /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 для доступа к модулю (пользователь root), я могу легко войти в каталог /data/media, создать подпапки и увидеть их отражение на портале Azure. Так что мое крепление в порядке.

Я пробовал использовать chmoding /data/media, но это не сработало. Похоже, я не могу изменить разрешения для папок на смонтированном постоянном томе, а также не могу добавлять пользователей или изменять группы. Итак, похоже, нет проблем с доступом к тому из моего модуля, но, поскольку Django не работает от имени пользователя root, он не может получить к нему доступ.

Как мне решить это? Спасибо.


person ronenmiller    schedule 21.08.2018    source источник


Ответы (1)


Оказывается, поскольку монтирование общего файлового ресурса Azure фактически принадлежит кластеру k8s, контейнеры Docker, работающие в модулях, подключают его только как точку входа, но не могут изменять его разрешения, поскольку они не владеют им.

Причина, по которой это произошло сейчас, объясняется здесь:

... оказалось, что режим каталога по умолчанию и режим файла различаются между версиями Kubernetes. Таким образом, в то время как режим доступа 0777 для Kubernetes v1.6.x, v1.7.x, в случае 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. Вам следует внимательно настроить то, что вам пишут.

Надеюсь, это кому-нибудь поможет.

person ronenmiller    schedule 07.09.2018