你当前正在访问 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 群集,则 Azure 会在部署 Azure Ubuntu VM 时自动填充虚拟网络设置,并将 Ubuntu VM 关联到同一个 VNet。 如果要改用对等互连网络,请参阅上述文档。

将 NFS 服务器部署到虚拟机

  1. 若要在 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 服务器。

  2. 创建 Linux VM 后,使用以下命令将上一步骤中创建的文件从本地计算机复制到 VM:

    scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
    
  3. 复制文件后,打开与 VM 的安全外壳 (SSH) 连接并执行以下命令:

    sudo ./nfs-server-setup.sh
    

    如果执行由于权限被拒绝错误而失败,请运行以下命令为所有人设置执行权限:

    chmod +x ~/nfs-server-setup.sh
    

将 AKS 群集连接到 NFS 服务器

可以通过预配一个永久性卷,以及一个指定如何访问该卷的永久性卷声明,将 NFS 服务器连接到 AKS 群集。 必须连接相同或对等互连的虚拟网络中的两个资源。 若要了解如何在同一 VNet 中设置群集,请参阅:在现有 VNet 中创建 AKS 群集

将两个资源放在同一虚拟网络或对等互连的 VNet 中后,请在 AKS 群集中预配永久性卷和永久性卷声明。 然后,容器可将 NFS 驱动器装载到其本地目录。

  1. 使用 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 服务器中的实际设置。

  2. 创建名为 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

后续步骤