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:
- Un cluster del servizio Azure Kubernetes pre-esistente. Se non si ha un cluster del servizio Azure Kubernetes, per indicazioni sulla progettazione di un'implementazione su scala aziendale del servizio Azure Kubernetes, vedere Pianificare la progettazione del servizio Azure Kubernetes.
- Il cluster del servizio Azure Kubernetes deve risiedere nella stessa rete virtuale di Azure con peering o nella stessa rete virtuale del server NFS. Il cluster deve essere creato in una rete virtuale esistente, che può essere la stessa rete virtuale della macchina virtuale del server NFS. La procedura per la configurazione con una rete virtuale esistente è descritta negli articoli seguenti: Creazione di un cluster del servizio Azure Kubernetes in una rete virtuale esistente e Connessione di reti virtuali con peering reti virtuali.
- Una macchina virtuale Ubuntu Linux di Azure che esegue la versione 18.04 o successiva. Per distribuire una macchina virtuale Linux in Azure, vedere Creare e gestire macchine virtuali Linux.
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
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.
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}
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.
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.
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
- Per le procedure consigliate associate, vedere Procedure consigliate per archiviazione e backup nel servizio Azure Kubernetes.
- Per altre informazioni sulla configurazione del server NFS o per assistenza durante il debug dei problemi, vedere l'esercitazione seguente della community Ubuntu NFS Tutorial
Azure Kubernetes Service