[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 上面
在 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 但是筆者沒有成功部署。
結論:
- 可以使用 Azure Files 來當作檔案分享的 NFS,但是 NFS 必須要與 AKS 在同一個 VNet 裡面。
- 要使用 PersistentVolume, PersistentVolumeClaim 才能將 NFS 掛載上去。
- 無法使用 Manually create and use an NFS (Network File System) Linux Server Volume with Azure Kubernetes Service (AKS) 上面提及架設 NFS 的方法在 VM 上面啟動一個 NFS 服務。