Condividi tramite


Creare e usare manualmente un server NFS (Network File System) Linux con il servizio Azure Kubernetes

La condivisione dei dati tra contenitori è spesso un componente necessario di servizi e applicazioni basati su contenitori. In genere sono disponibili vari pod che devono accedere alle stesse informazioni su un volume permanente esterno. File di Azure è un'opzione, ma la creazione di un server NFS in una macchina virtuale di Azure è un'altra forma di archiviazione condivisa permanente.

Questo articolo illustra come creare un server NFS in una macchina virtuale Ubuntu di Azure e configurare il cluster del servizio Azure Kubernetes con accesso a questo file system condiviso come volume permanente.

Operazioni preliminari

Questo articolo presuppone che sia disponibile quanto segue per supportare questa configurazione:

Se si distribuisce prima il cluster del servizio Azure Kubernetes, Azure popola automaticamente le impostazioni della rete virtuale durante la distribuzione della macchina virtuale Ubuntu di Azure, associando la macchina virtuale Ubuntu nella stessa rete virtuale. Se invece si preferisce usare le reti con peering, vedere la documentazione indicata in precedenza.

Distribuzione del server NFS in una macchina virtuale

  1. Per distribuire un server NFS nella macchina virtuale Ubuntu di Azure, copiare lo script Bash seguente e salvarlo nel computer locale. Sostituire il valore della variabile AKS_SUBNET con quello corretto del cluster del servizio Azure Kubernetes. In caso contrario, il valore predefinito specificato apre tutte le porte e le connessioni del server NFS. In questo articolo il file è denominato 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
    

    Lo script riavvia il server NFS e successivamente è possibile procedere con la connessione dal cluster del servizio Azure Kubernetes al server NFS.

  2. Dopo aver creato la macchina virtuale Linux, copiare il file creato nel passaggio precedente dal computer locale alla macchina virtuale usando il comando seguente:

    scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
    
  3. Dopo aver copiato il file, aprire una connessione SSH (Secure Shell) alla macchina virtuale ed eseguire il comando seguente:

    sudo ./nfs-server-setup.sh
    

    Se l'esecuzione ha esito negativo a causa di un errore di autorizzazione negata, impostare l'autorizzazione di esecuzione per tutti eseguendo il comando seguente:

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

Connessione del cluster del servizio Azure Kubernetes al server NFS

È possibile connettersi al server NFS dal cluster del servizio Azure Kubernetes effettuando il provisioning di un volume permanente e di un'attestazione del volume permanente che specifica come accedere al volume. La connessione delle due risorse nella stessa rete virtuale o in reti virtuali con peering è necessaria. Per informazioni su come configurare il cluster nella stessa rete virtuale, vedere: Creazione di un cluster del servizio Azure Kubernetes nella rete virtuale esistente.

Quando entrambe le risorse si trovano nella stessa rete virtuale o rete virtuale con peering, effettuare il provisioning di un volume permanente e un'attestazione del volume permanente nel cluster del servizio Azure Kubernetes. I contenitori possono quindi montare l'unità NFS nella directory locale.

  1. Creare un manifesto YAML denominato pv-azurefilesnfs.yaml con un volume PersistentVolume. Ad esempio:

    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
    

    Sostituire i valori per NFS_INTERNAL_IP, NFS_NAME e NFS_EXPORT_FILE_PATH con le impostazioni effettive del server NFS.

  2. Creare un manifesto YAML denominato pvc-azurefilesnfs.yaml con un'attestazione PersistentVolumeClaim che usa il volume PersistentVolume. Ad esempio:

    Importante

    Il valore di storageClassName deve rimanere una stringa vuota; in caso contrario l'attestazione non funzionerà.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: NFS_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 1Gi
      selector: 
        matchLabels:
          type: nfs
    

    Sostituire il valore per NFS_NAME con l'impostazione effettiva dal server NFS.

Risoluzione dei problemi

Se non è possibile connettersi al server dal cluster del servizio Azure Kubernetes, è possibile che la directory esportata o la relativa directory padre non disponga di autorizzazioni sufficienti per accedere alla macchina virtuale del server NFS.

Verificare che sia alla directory di esportazione che alla relativa directory padre siano concesse le autorizzazioni 777.

È possibile controllare le autorizzazioni eseguendo il comando seguente per verificare che le directory dispongano delle autorizzazioni 'drwxrwxrwx':

ls -l

Passaggi successivi