AKS(Azure Kubernetes Service)를 사용하여 Linux NFS(네트워크 파일 시스템) 서버를 수동으로 만들고 사용합니다.

컨테이너 간에 데이터를 공유하는 것은 종종 컨테이너 기반 서비스 및 애플리케이션의 필수 구성 요소입니다. 일반적으로 외부 영구적 볼륨에서 동일한 정보에 액세스해야 하는 다양한 Pod가 있습니다. Azure Files는 옵션이지만 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
    

NFS 서버에 AKS 클러스터 연결

볼륨에 액세스하는 방법을 지정하는 영구 볼륨 및 영구 볼륨 클레임을 프로비전하여 AKS 클러스터에서 NFS 서버에 연결할 수 있습니다. 동일하거나 피어링된 가상 네트워크에서 두 리소스를 연결해야 합니다. 동일한 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_NAMENFS_EXPORT_FILE_PATH 값을 NFS 서버의 실제 설정으로 바꿉니다.

  2. PersistentVolume을 사용하는 PersistentVolumeClaim으로 pvc-azurefilesnfs.yaml이라는 YAML 매니페스트를 만듭니다. 예시:

    Important

    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

다음 단계