Создание и использование сервера Linux NFS (Network File System) со Службой Azure Kubernetes (AKS) вручную.

Обмен данными между контейнерами часто является необходимым компонентом служб и приложений на основе контейнеров. Скорее всего, у вас имеются различные модули pod, которым требуется доступ к одной и той же информации на внешнем постоянном томе. Хотя Файлы Azure является вариантом, создание сервера NFS на виртуальной машине Azure является другой формой постоянного общего хранилища.

В этой статье показано, как создать сервер NFS на виртуальной машине Azure Ubuntu и настроить кластер AKS с доступом к этой общей файловой системе в качестве постоянного тома.

Подготовка к работе

В этой статье предполагается, что для поддержки этой конфигурации требуется следующее:

Если вы развертываете свой кластер AKS впервые, Azure автоматически заполнит параметры виртуальной сети при развертывании виртуальной машины Azure Ubuntu, связывая виртуальную машину Ubuntu с той же виртуальной сетью. Если вы хотите работать с одноранговых сетей, обратитесь к приведенной выше документации.

Развертывание сервера NFS на виртуальной машине

  1. Чтобы развернуть сервер NFS на виртуальной машине Azure Ubuntu, скопируйте следующий скрипт 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, после чего вы можете продолжить подключение к серверу NFS из своего кластера AKS.

  2. После создания виртуальной машины Linux скопируйте файл, созданный на предыдущем шаге, с локального компьютера на виртуальную машину с помощью следующей команды.

    scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
    
  3. Когда файл будет скопирован, установите SSH-подключение к виртуальной машине и выполните следующую команду.

    sudo ./nfs-server-setup.sh
    

    Если выполнение завершится с ошибкой отказа в разрешении, установите разрешение на выполнение для всех процессов, выполнив следующую команду.

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

Подключение кластера AKS к серверу NFS

Вы можете подключиться к серверу NFS из кластера AKS, подготовив постоянный том и утверждение постоянного тома, указывающее, как получить доступ к тому. Подключение двух служб в одной виртуальной сети или одноранговой виртуальной сети является обязательным. Сведения о настройке кластера в одной виртуальной сети см. в разделе Создание кластера AKS в существующей виртуальной сети.

После того как оба ресурса находятся в одной виртуальной или одноранговой виртуальной сети, подготовьте постоянный том и утверждение постоянного тома в кластере AKS. Затем контейнеры смогут подключить диск NFS к их локальному каталогу.

  1. Создайте манифест YAML с именем pv-azurefilesnfs.yaml с помощью PersistentVolume. Например:

    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. Создайте манифест YAML с именем pvc-azurefilesnfs.yaml с помощью PersistentVolumeClaim , использующего PersistentVolume. Например:

    Важно!

    Значение 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.

Убедитесь, что каталог экспорта и родительский каталог предоставляются 777 разрешений.

Разрешения можно проверить, выполнив следующую команду (каталоги должны иметь разрешения drwxrwxrwx).

ls -l

Следующие шаги