手動建立並使用 NFS (網路檔案系統) 伺服器搭配 Azure Kubernetes Service (AKS)
在容器之間共用資料通常是容器型服務和應用程式的必要元件。 您通常會有各種 Pod,這些 Pod 需要存取外部永續性磁碟區上的相同資訊。 雖然可以選擇使用 Azure 檔案儲存體,不過在 Azure VM 上建立 NFS 伺服器則是另一種形式的持續性共用儲存體。
本文將說明如何在 Azure Ubuntu 虛擬機器上建立 NFS 伺服器,並將 AKS 叢集設為可存取此共用檔案系統作為永續性磁碟區。
開始之前
本文假設您具有支援此設定的下列內容:
- 現有的 AKS 叢集。 如果您沒有 AKS 叢集,對於設計 AKS 企業級實作的指導,請參閱規劃 AKS 設計。
- 您的 AKS 叢集必須位於與 NFS 伺服器相同或對等互連的 Azure 虛擬網路 (VNet) 上。 叢集必須建立在現有的 VNet 中,這可以是與 NFS 伺服器 VM 相同的 VNet。 使用現有 VNet 設定的步驟說明於下列文章中:在現有的 VNET 中建立 AKS 叢集,以及使用 VNET 對等互連連線虛擬網路。
- 執行 18.04 版或更新版本的 Azure Ubuntu Linux 虛擬機器。 若要在 Azure 上部署 Linux VM,請參閱建立和管理 Linux VM。
如果您先部署 AKS 叢集,則 Azure 會在部署 Azure Ubuntu VM 時自動填入虛擬網路設定,以與位於相同 VNet 的 Ubuntu VM 建立關聯。 如果您想要改用對等互連網路,請參閱上述文件。
將 NFS 伺服器部署至虛擬機器
若要在 Azure Ubuntu 虛擬機器上部署 NFS 伺服器,請複製下列 Bash 指令碼,並請將其儲存至本機電腦。 以您 AKS 叢集中的正確變數取代 AKS_SUBNET 變數的值,否則指定的預設值會為所有連接埠和連線開啟 NFS 伺服器。 在本文中,該檔案名為
nfs-server-setup.sh
。#!/bin/bash # This script should be executed on Linux Ubuntu Virtual Machine EXPORT_DIRECTORY=${1:-/export/data} DATA_DIRECTORY=${2:-/data} AKS_SUBNET=${3:-*} echo "Updating packages" apt-get -y update echo "Installing NFS kernel server" apt-get -y install nfs-kernel-server echo "Making data directory ${DATA_DIRECTORY}" mkdir -p ${DATA_DIRECTORY} echo "Making new directory to be exported and linked to data directory: ${EXPORT_DIRECTORY}" mkdir -p ${EXPORT_DIRECTORY} echo "Mount binding ${DATA_DIRECTORY} to ${EXPORT_DIRECTORY}" mount --bind ${DATA_DIRECTORY} ${EXPORT_DIRECTORY} echo "Giving 777 permissions to ${EXPORT_DIRECTORY} directory" chmod 777 ${EXPORT_DIRECTORY} parentdir="$(dirname "$EXPORT_DIRECTORY")" echo "Giving 777 permissions to parent: ${parentdir} directory" chmod 777 $parentdir echo "Appending bound directories into fstab" echo "${DATA_DIRECTORY} ${EXPORT_DIRECTORY} none bind 0 0" >> /etc/fstab echo "Appending localhost and Kubernetes subnet address ${AKS_SUBNET} to exports configuration file" echo "/export ${AKS_SUBNET}(rw,async,insecure,fsid=0,crossmnt,no_subtree_check)" >> /etc/exports echo "/export localhost(rw,async,insecure,fsid=0,crossmnt,no_subtree_check)" >> /etc/exports nohup service nfs-kernel-server restart
指令碼會重新啟動 NFS 伺服器,之後您可以繼續從 AKS 叢集連線至 NFS 伺服器。
建立 Linux VM 之後,請使用下列命令,將上一個步驟中建立的檔案從本機電腦複製到 VM:
scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
複製檔案之後,請開啟安全殼層 (SSH) 連線至 VM,然後執行下列命令:
sudo ./nfs-server-setup.sh
如果因為權限遭拒錯誤而執行失敗,請透過執行下列命令來設定所有執行權限:
chmod +x ~/nfs-server-setup.sh
將 AKS 叢集連線到 NFS 伺服器
您可以佈建永續性磁碟區和永續性磁碟區宣告,以指定如何存取磁碟區,以便從 AKS 叢集連線到 NFS 伺服器。 必須連線相同或對等互連虛擬網路中的兩個資源。 若要了解如何在相同的 VNet 中設定叢集,請參閱:在現有的 VNet 建立 AKS 叢集。
在這兩個資源位於相同的虛擬或對等互連 VNet 後,請在 AKS 叢集中佈建永續性磁碟區和永續性磁碟區宣告。 然後容器可以將 NFS 磁碟磁碟機裝載至其本機目錄。
建立具有 PersistentVolume 名稱為 pv-azurefilesnfs.yaml 的 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 伺服器的實際設定取代 NFS_INTERNAL_IP、NFS_NAME 和 NFS_EXPORT_FILE_PATH 的值。
建立名稱為 pvc-azurefilesnfs.yaml 的 YAML 資訊清單,使其具有使用 PersistentVolume 的 PersistentVolumeClaim。 例如:
重要
storageClassName 值必須維持空白字串,否則宣告將無法運作。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: NFS_NAME spec: accessModes: - ReadWriteMany storageClassName: "" resources: requests: storage: 1Gi selector: matchLabels: type: nfs
以 NFS 伺服器的實際設定取代 NFS_NAME 的值。
疑難排解
如果您無法從 AKS 叢集連線到伺服器,問題可能是匯出的目錄或其父系沒有足夠的權限可存取 NFS 伺服器 VM。
檢查您的匯出目錄以及父目錄是否授與 777 個存取權限。
您可以執行下列命令來檢查權限,而且目錄應該具有 'drwxrwxrwx' 權限:
ls -l
下一步
- 如需相關的最佳做法,請參閱 AKS 中的儲存和備份最佳做法。
- 若要深入了解如何設定 NFS 伺服器或協助偵錯問題,請參閱 Ubuntu 社群 NFS 教學課程中的下列教學課程