簡體   English   中英

將 SMB 或 NFT Azure 文件共享掛載到 kubernetes 上的 JupyterHub 以獲取共享目錄

[英]Mounting an SMB or NFT Azure File share onto JupyterHub on kubernetes for a shared directory

集群信息:

Kubernetes 版本:1.19.11

正在使用的雲:Azure

安裝方法:在Azure online UI/Azure CLI中手動創建

主機操作系統:Linux

CNI 和版本:Azure 容器網絡接口,最新

嘿大家! 我是 Kubernetes 的一個相對較新的用戶,但我認為我已經掌握了基礎知識。 我主要是想了解一個更復雜的文件共享功能。

我本質上是在嘗試在 Kubernetes 上使用 JupyterHub 為大約十幾個用戶的團隊提供一個共享的開發環境(我們可能會在以后將其擴展到更大的/其他團隊,但現在我想讓它只為我們的團隊工作),一個非常有用且看起來可行的功能是擁有一個用於筆記本、文件和數據的共享目錄。 我想我已經接近完成這個設置了,但是我遇到了一個我無法完全解決的問題。 我會先快速解釋我的設置,然后是問題。 我真的很感激任何人的幫助/評論/提示!

設置

目前,所有這些設置都在 Azure 或其他 Azure 托管服務中的 Kubernetes 群集上。 我們有一個資源組,其中包含 kubernetes 集群、應用服務域、DNS 區域、虛擬網絡、容器注冊表(用於我們的自定義 docker 映像)和存儲帳戶。 一切正常,除了在存儲帳戶中,我有一個 Azure NFS(如果需要,還有普通的 SMB)文件共享,我已經嘗試通過 PV 和 PVC 安裝到 JupyterHub 服務器,但無濟於事。

為了創建 PV,我在 Azure 中設置了一個 NFS 文件共享並創建了相應的 kubernetes 機密,如下所示:

 # 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

然后我嘗試用這個 YAML 文件創建 PV:

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

問題

在創建 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 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選項解決了這個錯誤,但我覺得有必要指定我創建的 kubernetes 秘密。 如果我確實刪除了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

這也成功綁定。 但是,當我將配置添加到 JupyterHub 的 Helm 配置時

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

當 jupyterhub 服務器嘗試生成和安裝 PVC 時,我收到以下錯誤:

來自 jupyterhub 的錯誤消息

以防萬一,NFS azure 文件共享只能通過私有端點訪問,但這應該沒問題,因為我的 kubernetes 集群運行在同一個虛擬網絡中。 事實上,Azure 告訴我我可以在 linux 上安裝這個 NFS 共享

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

但是,當我將它添加到我在容器中使用的 docker 映像的 Dockerfile 中時,構建失敗並告訴我未安裝systemctl 嘗試通過apt-get install systemd它也不能解決問題。

通過查看其他 K8s 討論帖子,我發現了這個( pods 和 daemon-set 之間的基於文件的數據交換 - 一般討論 - 討論 Kubernetes )看起來很有幫助並且有一個有用的鏈接來部署 NSF 服務器,但我認為事實是我的 NFS 服務器是 Azure 文件共享,這使情況略有不同。

如果有人有任何想法或建議,我將不勝感激!

PS 我之前曾在此處的 JupyterHub 討論中發布過( Mounting an SMB or NFT Azure File share on JupyterHub on kubernetes for a shared directory - JupyterHub - Jupyter Community Forum ),但有人建議我的問題更多是 k8s 問題而不是一個 JupyterHub。 我還查看了其他 stackoverflow 帖子,但是,即使我對 SMB 文件共享持開放態度,它也必須對 VM 執行更多操作,而不是對 kubernetes 上的 PV/PVC 執行更多操作。

謝謝! :)

所以我實際上設法使用動態分配的 Azure 文件共享來解決這個問題。 我正在為此編寫內部文檔,但我想我會在這里發布相關內容。 我希望這可以幫助人們!

通過定義 PVC 和存儲類動態創建 Azure 文件共享和存儲帳戶

在這里,我們主要遵循在 AKS 中使用 Azure 文件動態創建 PV的文檔。 總體思路是創建一個存儲類,該類將定義我們要創建的 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 和文件共享的動態分配由我們負責。

將 PVC 掛載到主目錄中的 JupyterHub

JupyterHub 默認為每個新用戶創建一個 10Gi 的 PVC,但我們也可以告訴它掛載現有的 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 啟動時,所有用戶都應該在他們的主文件夾中擁有一個具有讀寫權限的共享目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM