Creación manual y uso de un servidor NFS (sistema de archivos de red) de Linux con Azure Kubernetes Service (AKS)

Compartir datos entre contenedores a menudo es un componente necesario de las aplicaciones y los servicios basados en contenedores. Habitualmente tiene varios pods que necesitan tener acceso a la misma información en un volumen persistente externo. Si bien Azure Files es una posibilidad, crear un servidor NFS en una máquina virtual de Azure es otra forma de almacenamiento compartido persistente.

En este artículo se muestra cómo crear un servidor NFS en una máquina virtual Ubuntu de Azure y configurar el clúster de AKS con acceso a este sistema de archivos compartido como volumen persistente.

Antes de empezar

En este artículo se supone que tiene lo siguiente para admitir esta configuración:

Si implementa primero el clúster de AKS, Azure rellena automáticamente la configuración de red virtual al implementar la máquina virtual Ubuntu de Azure, asociando la máquina virtual Ubuntu en la misma red virtual. Si desea trabajar con redes emparejadas, consulte la documentación anterior.

Implementación del servidor NFS en una máquina virtual

  1. Para implementar un servidor NFS en la máquina virtual Ubuntu de Azure, copie el siguiente script de Bash y guárdelo en la máquina local. Reemplace el valor de la variable AKS_SUBNET por el correcto del clúster de AKS o, de lo contrario, el valor predeterminado especificado abre el servidor NFS en todos los puertos y conexiones. En este artículo, el archivo se denomina 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
    

    El script inicia un reinicio del servidor NFS y, después, puede continuar con la conexión al servidor NFS desde el clúster de AKS.

  2. Después de crear la máquina virtual Linux, copie el archivo creado en el paso anterior de la máquina local a la máquina virtual mediante el siguiente comando:

    scp /path/to/nfs-server-setup.sh username@vm-ip-address:/home/{username}
    
  3. Una vez copiado el archivo, abra una conexión de Secure Shell (SSH) a la máquina virtual y ejecute el siguiente comando:

    sudo ./nfs-server-setup.sh
    

    Si se produce un error en la ejecución debido a un error de permiso denegado, establezca el permiso de ejecución para todo ejecutando el siguiente comando:

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

Conexión del clúster de AKS al servidor NFS

Es posible conectarse al servidor NFS desde el clúster de AKS aprovisionando un volumen persistente y una notificación de volumen persistente que especifique cómo acceder al volumen. Es necesario conectar ambos recursos en la misma red virtual o en redes virtuales emparejadas. Para obtener información sobre cómo configurar el clúster en la misma red virtual, consulte Creación de un clúster de AKS en una red virtual existente.

Una vez que ambos recursos están en la misma red virtual o en una emparejada, aprovisione un volumen persistente y una notificación de volumen persistente en el clúster de AKS. A continuación, los contenedores pueden montar la unidad NFS en su directorio local.

  1. Cree un manifiesto YAML denominado pv-azurefilesnfs.yaml con un elemento PersistentVolume. Por ejemplo:

    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
    

    Reemplace los valores de NFS_INTERNAL_IP, NFS_NAME y NFS_EXPORT_FILE_PATH por la configuración real del servidor NFS.

  2. Cree un manifiesto YAML denominado pvc-azurefilesnfs.yaml con un elemento PersistentVolumeClaim que utilice el elemento PersistentVolume. Por ejemplo:

    Importante

    El valor storageClassName debe seguir siendo una cadena vacía para que la notificación funcione.

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

    Reemplace el valor de NFS_NAME por la configuración real del servidor NFS.

Solucionar problemas

Si no puede conectarse al servidor desde un clúster de AKS, puede que haya un problema en el directorio exportado o en su directorio primario, o bien que no tenga suficientes permisos para acceder a la máquina virtual del servidor NFS.

Compruebe que el directorio de exportación y su directorio primario tienen concedidos 777 permisos.

Para comprobar los permisos, ejecute el comando siguiente y los directorios deberían tener los permisos "drwxrwxrwx":

ls -l

Pasos siguientes