你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在 Azure Kubernetes 服务 (AKS) 中手动创建和使用 Linux NFS(网络文件系统)服务器
基于容器的服务和应用程序往往需要在容器之间共享数据。 通常,会有各种 Pod 需要访问外部持久性卷上的相同信息。 Azure 文件存储是一个选项,而在 Azure VM 上创建的 NFS 服务器是永久性共享存储的另一种形式。
本文介绍如何在 Azure Ubuntu 虚拟机上创建 NFS 服务器,并设置 AKS 群集,使其能够访问这个永久性卷形式的共享文件系统。
本文假设你具有以下支持此配置:
- 现有的 AKS 群集。 如果没有 AKS 群集,有关设计 AKS 企业级实现的指导,请参阅规划 AKS 设计。
- AKS 群集需要与 NFS 服务器位于同一个或对等互连的 Azure 虚拟网络 (VNet) 上。 该群集必须在现有的 VNet 上创建,该 VNet 可以是 NFS 服务器 VM 所在的同一个 VNet。 以下文章介绍了使用现有 VNet 进行配置的步骤:在现有 VNET 中创建 AKS 群集和通过 VNET 对等互连连接虚拟网络。
- 一个运行 18.04 或更高版本的 Azure Ubuntu Linux 虚拟机。 若要在 Azure 上部署 Linux VM,请参阅创建和管理 Linux VM。
如果首先部署 AKS 群集,则 Azure 会在部署 Azure Ubuntu VM 时自动填充虚拟网络设置,并将 Ubuntu VM 关联到同一个 VNet。 如果要改用对等互连网络,请参阅上述文档。
若要在 Azure Ubuntu 虚拟机上部署 NFS 服务器,请复制以下 Bash 脚本并将其保存到本地计算机。 将变量 AKS_SUBNET 的值替换为 AKS 群集中的正确值,否则指定的默认值会在 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}
复制文件后,打开与 VM 的安全外壳 (SSH) 连接并执行以下命令:
sudo ./nfs-server-setup.sh
如果执行由于权限被拒绝错误而失败,请运行以下命令为所有人设置执行权限:
chmod +x ~/nfs-server-setup.sh
可以通过预配一个永久性卷,以及一个指定如何访问该卷的永久性卷声明,将 NFS 服务器连接到 AKS 群集。 必须连接相同或对等互连的虚拟网络中的两个资源。 若要了解如何在同一 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_INTERNAL_IP、NFS_NAME 和 NFS_EXPORT_FILE_PATH 的值替换为 NFS 服务器中的实际设置。
创建名为 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_NAME 的值替换为 NFS 服务器中的实际设置。
如果无法从 AKS 群集连接到服务器,问题的原因可能是导出的目录或其父级没有足够的权限,因此无法 NFS 服务器 VM。
请检查导出的目录及其父目录是否具有 777 权限。
可运行以下命令来检查权限,目录应有 'drwxrwxrwx' 权限:
ls -l
- 如需相关的最佳做法,请参阅 AKS 中的存储和备份最佳做法。
- 若要详细了解如何设置 NFS 服务器或者在调试问题时需要帮助,请参阅 Ubuntu 社区中的以下教程:NFS 教程