你当前正在访问 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。 如果要改用对等互连网络,请参阅上述文档。
将 NFS 服务器部署到虚拟机
若要在 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
将 AKS 群集连接到 NFS 服务器
可以通过预配一个永久性卷,以及一个指定如何访问该卷的永久性卷声明,将 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 教程