Подключение файлового ресурса Azure SMB или NFT к JupyterHub на Kubernetes для общего каталога

Cluster information:

Версия Kubernetes: 1.19.11

Используемое облако: Azure

Метод установки: создание вручную в онлайн-интерфейсе Azure / Azure CLI.

ОС хоста: Linux

CNI и версия: сетевой интерфейс контейнера Azure, последний

Привет всем! Я относительно новый пользователь Kubernetes, но думаю, что у меня есть основы. В основном я пытаюсь понять более сложную функцию совместного использования файлов.

По сути, я пытаюсь использовать JupyterHub в Kubernetes для общей среды разработки для команды из примерно десятка пользователей (мы можем расширить это до более крупных / других команд позже, но сейчас я хочу, чтобы это работало только для нашей команды), и одна функция, которая была бы чрезвычайно полезна и выглядит выполнимой, - это наличие общего каталога для записных книжек, файлов и данных. Я думаю, что довольно близок к тому, чтобы получить эту настройку, но я сталкиваюсь с растущей проблемой, которую не могу решить. Сначала я быстро объясню свою настройку, а затем расскажу о проблеме. Я буду очень признателен за любую помощь / комментарии / подсказки, которые есть у кого-нибудь!

Setup

В настоящее время все эти настройки находятся в кластере Kubernetes в Azure или других службах, размещенных в Azure. У нас есть группа ресурсов с кластером kubernetes, доменом службы приложений, зоной DNS, виртуальной сетью, реестром контейнеров (для наших пользовательских образов докеров) и учетной записью хранения. Все работает нормально, за исключением того, что в учетной записи хранения у меня есть общий файловый ресурс Azure NFS (и простой SMB, если необходимо), который я пытался подключить через PV и PVC к серверу JupyterHub, но безрезультатно.

Чтобы создать PV, я настроил общий файловый ресурс NFS в Azure и создал соответствующий секрет кубернетов следующим образом:

 # Get storage account key
STORAGE_KEY=$(az storage account keys list --resource-group $resourceGroupName --account-name $storageAccountName --query "[0].value" -o tsv)

kubectl create secret generic azure-secret \ 
    --from-literal=azurestorageaccountname=$storageAccountName \ 
    --from-literal=azurestorageaccountkey=$STORAGE_KEY

Затем я попытался создать PV с помощью этого файла YAML:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: shared-nfs-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  azureFile:
    secretName: azure-secret
    shareName: aksshare
    readOnly: false
  nfs:
    server: wintermutessd.file.core.windows.net:/wintermutessd/wintermutessdshare
    path: /home/shared
    readOnly: false
  storageClassName: premium-nfs
  mountOptions: 
  - dir_mode=0777
  - file_mode=0777
  - uid=1000
  - gid=1000
  - mfsymlinks
  - nobrl

Issue

Во время создания PV выдает ошибку Failed to create the persistentvolume 'shared-nfs-pv'. Error: Invalid (422) : PersistentVolume "shared-nfs-pv" is invalid: spec.azureFile: Forbidden: may not specify more than 1 volume type. Удаление azureFile параметров решает эту ошибку, но я чувствую, что необходимо указать секрет кубернетов, который я создал. Если я удалю параметры azureFile, он успешно создаст и привяжет PV. Затем я создал соответствующий PVC с

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  # Match name of PV
  volumeName: shared-nfs-pv
  storageClassName: premium-nfs
  resources:
    requests:
      storage: 50Gi

который также успешно связан. Однако, когда я добавляю конфигурацию в свою конфигурацию Helm для JupyterHub с

singleuser:
  storage:
    extraVolumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    extraVolumeMounts:
      - name: azure
        mountPath: /home/shared

Я получаю следующую ошибку, когда сервер jupyterhub пытается создать и смонтировать PVC:

Сообщение об ошибке от jupyterhub

На всякий случай, если это актуально, общий файловый ресурс NFS azure доступен только через частную конечную точку, но это должно быть нормально, поскольку мой кластер kubernetes работает в той же виртуальной сети. Фактически, Azure говорит мне, что я могу просто смонтировать этот общий ресурс NFS в Linux с помощью

sudo apt-get -y update
sudo apt-get install nfs-common
sudo mkdir -p /mount/wintermutessd/wintermutessdshare
sudo mount -t nfs wintermutessd.file.core.windows.net:/wintermutessd/wintermutessdshare /mount/wintermutessd/wintermutessdshare -o vers=4,minorversion=1,sec=sys

Но когда я добавляю это в свой Dockerfile для образа докера, который я использую в своем контейнере, сборка завершается ошибкой и сообщает мне, что systemctl не установлен. Попытка добавить это через apt-get install systemd также не решает проблему.

Просматривая другие сообщения с дискурсом K8s, я нашел этот (Файловый обмен данными между модулями и набором демонов - Общие обсуждения - Обсудить Kubernetes), который выглядел полезным и имел полезная ссылка для развертывания сервера NSF, но я думаю, что тот факт, что мой сервер NFS является файловым ресурсом Azure, делает этот сценарий немного другим.

Если у кого-то есть идеи или предложения, я буду очень признателен!

P.S. Ранее я размещал здесь дискурс JupyterHub (Монтирование общего файлового ресурса Azure SMB или NFT на JupyterHub на кубернетах для общего каталога - JupyterHub - Форум сообщества Jupyter), но было предложено что моя проблема больше связана с k8s, чем с JupyterHub. Я также просмотрел этот другой пост о stackoverflow, но даже хотя я открыт для общего доступа к файлам SMB, он должен делать больше с виртуальными машинами, а не с PV / PVC на кубернетах.

Спасибо! :)


person nbingo    schedule 15.07.2021    source источник


Ответы (1)


так что мне действительно удалось выяснить это, используя динамически выделяемый файловый ресурс Azure. Я пишу для этого внутреннюю документацию, но подумал, что выложу здесь соответствующий фрагмент. Надеюсь, это поможет людям!

Dynamically creating an Azure file share and storage account by defining a PVC and storage class

Здесь мы в основном следуем документации для динамического создания PV с файлами Azure в AKS. Общая идея состоит в том, чтобы создать класс хранилища, который будет определять, какой тип файлового ресурса Azure мы хотим создать (премиум или стандартный и различные режимы избыточности), а затем создать PVC (утверждение постоянного тома), которое будет соответствовать этому классу хранилища. Следовательно, когда JupyterHub пытается смонтировать созданный PVC, он автоматически создает PV (постоянный том) для связывания PVC, который затем автоматически создает учетную запись хранения и файловый ресурс для PV, в котором фактически хранятся файлы. все будет сделано в группе ресурсов, которая поддерживает ту, которую мы уже используем (обычно они начинаются с MC_). Здесь мы будем использовать хранилище премиум-класса с зонным резервированием. Сначала создайте класс хранилища, который будет использоваться (дополнительную информацию о доступных тегах здесь можно найти в этот репозиторий) со следующим YAML

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: shared-premium-azurefile
provisioner: kubernetes.io/azure-file
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
  - actimeo=30
parameters:
  skuName: Premium_ZRS

Назовите этот файл azure-file-sc.yaml и запустите

kubectl apply -f azure-file-sc.yaml

Затем мы создадим PVC, который будет динамически подготавливаться из нашего файлового ресурса Azure (он автоматически создает для нас PV). Создайте файл azure-file-pvc.yaml со следующим кодом

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-premium-azurefile-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: shared-premium-azurefile
  resources:
    requests:
      storage: 100Gi

и примените его с помощью

kubectl apply -f azure-file-pvc.yaml

Это создаст общий файловый ресурс и соответствующий PV. Мы можем проверить, что наш PVC и класс хранилища были успешно созданы с помощью

kubectl get storageclass
kubectl get pvc

Связывание PVC может занять несколько минут.

На стороне Azure это все, что нужно сделать, и мы позаботимся о динамическом распределении PV и файлового ресурса.

Mounting the PVC to JupyterHub in the home directory

JupyterHub по умолчанию создает PVC размером 10Gi для каждого нового пользователя, но мы также можем указать ему монтировать существующие PVC как внешние тома (подумайте об этом как о подключении вашего компьютера к общему USB-накопителю). Чтобы смонтировать наш ранее созданный PVC в домашнюю папку всех наших пользователей JupyterHub, мы просто добавляем следующее в нашу config.py конфигурацию Helm:

singleuser:
  storage:
    extraVolumes:
      - name: azure
        persistentVolumeClaim:
          claimName: shared-premium-azurefile-pvc
    extraVolumeMounts:
      - name: azure
        mountPath: /home/jovyan/shared

Теперь, когда JupyterHub запускается, у всех пользователей должен быть общий каталог в своих домашних папках с разрешениями на чтение и запись.

person nbingo    schedule 16.07.2021