[Cloud] Mount NFS on Kubernetes (K8S)

前幾篇記錄了有關 K8S 與 Spark 的應用與一些 K8S 的常用指令,最近需要研究如何把 NFS 掛載上 K8S 裡面的 Pod,最主要的目的是要模擬出一個封閉的運算環境,在一個封閉的伺服器群集裡面,最好的分享檔案的方式就是利用像是 NAS 或是 NFS 等等的服務,本篇記錄一些在 Azure 環境裡面創造出 NFS 服務給 Kubernetes 使用遇到的一些挑戰與經驗。

首先根據 Azure (How to create an Azure Files share) 我們知道 Azure Files 是有辦法創造等同於 NFS 的服務,但是要選擇 Premium File Shares 的 Storage Account。

但是根據教學的方法在做完以下三個步驟之後

  • Create Premium Azure Files
  • Disable Secure Transfer
  • Create an Files Share

還是沒有辦法透過以下的 command 將 NFS 掛載到任何一台 VM 上面:

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

但是不是指令沒有反應就是出現 Access Denied 的錯誤訊息,主要的原因是因為掛載的 VM 或是 K8S 必須要與 Azure Files 在同一個 VNet 底下,關於使用指令新增一個 K8S cluster 在一個 Vnet 上的方法可以參考:Use kubenet networking with your own IP address ranges in Azure Kubernetes Service (AKS)

 

掛載 NFS 到 K8S 的 Pod 上面

可以參考:Manually create and use an NFS (Network File System) Linux Server Volume with Azure Kubernetes Service (AKS)

在 Pod 上面掛載 NFS Volume 需要一個 Persistent Volume,可以利用以下的 yaml 來做:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: <NFS_NAME>
  labels:
    type: nfs
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: <NFS_INTERNAL_IP>
    path: <NFS_EXPORT_FILE_PATH>

特別需要注意 NFS_INTERNAL_IP 要放的是 storage account 的 endpoint (nfsdemo.file.core.windows.net) 另外需要一個 PersistentVolumeClaim,可以利用以下的 yaml 來創造:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: <NFS_NAME>
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 1Gi
  selector: 
    matchLabels:
      type: nfs

備註:這一篇有分享如何在一個 VM 上面架設 NFS 但是筆者沒有成功部署。

結論: