서비스의 NFS 볼륨 마운트 구성

이 페이지에서는 Cloud Run에서 NFS 파일 공유를 볼륨으로 마운트하는 방법을 보여줍니다. 온프레미스 또는 Compute Engine VM에서 호스팅되는 자체 NFS 서버를 포함하여 모든 NFS 서버를 사용할 수 있습니다. 아직 NFS 서버가 없는 경우 Google Cloud의 완전 관리형 NFS 제품인 Filestore를 사용하는 것이 좋습니다.

NBD, 9P, CIFS/Samba, Ceph 네트워크 파일 시스템을 사용하려면 NBD, 9P, CIFS/Samba, Ceph 네트워크 파일 시스템 사용을 참조하세요.

Cloud Run에서 NFS 파일 공유를 볼륨으로 마운트하면 파일 공유가 컨테이너 파일 시스템에 파일로 나타납니다. 파일 공유를 볼륨으로 마운트한 후에는, 프로그래밍 언어의 파일 시스템 작업 및 라이브러리를 사용하여 로컬 파일 시스템의 디렉터리처럼 파일 공유에 액세스할 수 있습니다.

허용되지 않는 경로

Cloud Run에서는 /dev, /proc, /sys 또는 해당 하위 디렉터리에 볼륨을 마운트할 수 없습니다.

제한사항

  • NFS 볼륨에 쓰려면 컨테이너가 루트로 실행되어야 합니다. 컨테이너가 파일 시스템에서만 읽는 경우 모든 사용자로 실행될 수 있습니다.

  • Cloud Run은 NFS 잠금을 지원하지 않습니다. NFS 볼륨은 잠금 없음 모드로 자동으로 마운트됩니다.

시작하기 전에

Cloud Run에서 NFS 서버를 볼륨으로 마운트하려면 다음을 확인하세요.

  • NFS 서버 또는 Filestore 인스턴스가 실행되는 VPC 네트워크
  • Cloud Run 서비스가 연결된 VPC 네트워크에서 실행되는 NFS 서버 아직 NFS 서버가 없으면 Filestore 인스턴스 만들기로 하나를 만듭니다.
  • Cloud Run 서비스는 NFS 서버가 실행 중인 VPC 네트워크에 연결됩니다. 최상의 성능을 위해서는 VPC 커넥터 대신 직접 VPC를 사용하세요.
  • 기존 프로젝트를 사용하는 경우 VPC 방화벽 구성에서 Cloud Run이 NFS 서버에 연결할 수 있는지 확인합니다. (새 프로젝트에서 시작하는 경우 기본값은 true입니다.) Filestore를 NFS 서버로 사용하는 경우 Filestore 문서에 따라 Cloud Run이 Filestore에 연결할 수 있도록 방화벽 이그레스 규칙을 만듭니다.

NFS 볼륨 마운트

여러 NFS 서버, Filestore 인스턴스 또는 기타 볼륨 유형을 서로 다른 마운트 경로에 마운트할 수 있습니다.

여러 컨테이너를 사용하는 경우 먼저 볼륨을 지정한 후 각 컨테이너의 볼륨 마운트를 지정합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Run으로 이동합니다.

    Cloud Run으로 이동

  2. 배포할 새 서비스를 구성하려면 서비스 만들기를 클릭합니다. 기존 서비스를 구성하는 경우 서비스를 클릭한 후 새 버전 수정 및 배포를 클릭합니다.

  3. 새 서비스를 구성하는 경우 원하는 대로 초기 서비스 설정 페이지를 작성한 후 컨테이너, 볼륨, 네트워킹, 보안을 클릭하여 서비스 구성 페이지를 펼칩니다.

  4. 볼륨 탭을 클릭합니다.

    이미지

    • 볼륨에서 다음과 같이 합니다.
      • 볼륨 추가를 클릭합니다.
      • 볼륨 유형 드롭다운에서 볼륨 유형으로 NFS를 선택합니다.
      • 볼륨 이름 필드에 볼륨에 사용하려는 이름을 입력합니다.
      • NFS 서버 필드에 NFS 파일 공유의 도메인 이름 또는 위치(IP_ADDRESS 형식)를 입력합니다.
      • 경로 필드에 마운트하려는 NFS 서버 디렉터리의 경로를 입력합니다.
      • 완료를 클릭합니다.
    • 컨테이너 탭을 클릭한 다음 볼륨을 마운트할 컨테이너를 펼쳐 컨테이너를 수정합니다.
    • 볼륨 마운트 탭을 클릭합니다.
    • 볼륨 마운트를 클릭합니다.
      • 메뉴에서 NFS 볼륨을 선택합니다.
      • 볼륨을 마운트할 경로를 지정합니다.
      • 볼륨 마운트를 클릭합니다.
  5. 만들기 또는 배포를 클릭합니다.

gcloud

참고: 여기서는 gcloud beta run services update 명령어를 보여주지만 다음과 같이 매개변수와 함께 gcloud beta run services deploy 명령어를 사용할 수 있습니다.

  • 볼륨을 추가하고 마운트하려면 다음 명령어를 실행합니다.
gcloud beta run services update SERVICE \
--add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
--add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

다음과 같이 바꿉니다.

  • SERVICE를 서비스 이름으로 바꿉니다.
  • VOLUME_NAME을 볼륨에 지정할 이름으로 바꿉니다.
  • IP_ADDRESS를 NFS 파일 공유 위치로 바꿉니다.
  • NFS_PATH를 슬래시로 시작하는 NFS 파일 공유의 경로로 바꿉니다(예: /example-directory).
  • MOUNT_PATH: 볼륨을 마운트할 상대 경로(예: /mnt/my-volume)
  • VOLUME_NAME: 볼륨에 사용할 이름. VOLUME_NAME 값은 볼륨을 볼륨 마운트에 매핑하는 데 사용됩니다.

  • 볼륨을 읽기 전용 볼륨으로 마운트하려면 다음 명령어를 실행합니다.

    --add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
  • 여러 컨테이너를 사용하는 경우 먼저 볼륨을 지정한 후 각 컨테이너의 볼륨 마운트를 지정합니다.

    gcloud beta run services update SERVICE \
    --add-volume=name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --container CONTAINER_1 \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH \
    --container CONTAINER_2 \
    --add-volume-mount volume= VOLUME_NAME,mount-path=MOUNT_PATH2

YAML

  1. 새 서비스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 서비스를 업데이트하는 경우 YAML 구성을 다운로드합니다.

    gcloud run services describe SERVICE --format export > service.yaml
  2. 필요에 따라 MOUNT_PATH, VOLUME_NAME, IP_ADDRESS, NFS_PATH를 업데이트합니다. 볼륨 마운트가 여러 개 있으면 이러한 속성이 여러 개 포함됩니다.

    apiVersion: run.googleapis.com/v1
    kind: Service
    metadata:
      name: SERVICE
        annotations:
          run.googleapis.com/launch-stage: BETA
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: gen2
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            nfs:
              server: IP_ADDRESS
              path: NFS_PATH
              readOnly: IS_READ_ONLY

    바꾸기

    • SERVICE를 Cloud Run 서비스 이름으로 바꿉니다.
    • MOUNT_PATH: 볼륨을 마운트할 상대 경로(예: /mnt/my-volume)
    • VOLUME_NAME: 볼륨에 사용할 이름. VOLUME_NAME 값은 볼륨을 볼륨 마운트에 매핑하는 데 사용됩니다.
    • IP_ADDRESS를 NFS 파일 공유 주소로 바꿉니다.
    • NFS_PATH를 슬래시로 시작하는 NFS 파일 공유의 경로로 바꿉니다(예: /example-directory).
    • IS_READ_ONLYTrue로 지정하여 볼륨을 읽기 전용으로 설정하거나 False로 지정하여 쓰기를 허용합니다.
  3. 다음 명령어를 사용하여 서비스를 새 구성으로 바꿉니다.

    gcloud beta run services replace service.yaml

볼륨 읽기 및 쓰기

Cloud Run 볼륨 마운트 기능을 사용하는 경우 로컬 파일 시스템에서 파일을 읽고 쓰는 데 사용하는 것과 동일한 프로그래밍 언어 라이브러리를 사용하여 마운트된 볼륨에 액세스합니다.

이는 데이터가 로컬 파일 시스템에 저장될 것으로 예상하고 일반 파일 시스템 작업을 사용하여 데이터에 액세스하는 기존 컨테이너를 사용하는 경우에 특히 유용합니다.

다음 스니펫은 볼륨 마운트의 mountPath/mnt/my-volume으로 설정되었다고 가정합니다.

Nodejs

파일 시스템 모듈을 사용하여 새 파일을 만들거나 볼륨 /mnt/my-volume의 기존 항목에 추가:

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

볼륨 /mnt/my-volume에 보관된 파일에 씁니다.

f = open("/mnt/my-volume/sample-logfile.txt", "a")

Go

os 패키지를 사용하여 볼륨 /mnt/my-volume에 보관된 새 파일 만들기:

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

자바

Java.io.File 클래스를 사용하여 볼륨 /mnt/my-volume에 로그 파일 만들기:

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

NFS 문제 해결

문제가 발생하면 다음을 확인하세요.

  • Cloud Run 서비스가 NFS 서버가 있는 VPC 네트워크에 연결되어 있습니다.
  • Cloud Run이 NFS 서버에 연결하는 것을 방지하는 방화벽 규칙이 없습니다.
  • 컨테이너가 NFS 서버에 쓰는 경우 루트로 실행 중인지 확인합니다.

컨테이너 시작 시간 및 NFS 볼륨 마운트

NFS 볼륨 마운트를 사용하면 컨테이너를 시작하기 전에 볼륨 마운트가 시작되므로 Cloud Run 컨테이너 콜드 스타트 시간이 약간 늘어날 수 있습니다. NFS가 성공적으로 마운트된 경우에만 컨테이너가 시작됩니다.

NFS는 서버에 대한 연결을 설정하고 filehandle을 가져온 후에만 볼륨을 성공적으로 마운트합니다. 네트워킹 지연은 컨테이너 시작 시간에 영향을 미칠 수 있습니다. Cloud Run에서 서버에 대한 연결을 설정할 수 없으면 Cloud Run 서비스를 시작할 수 없습니다. 또한 NFS에서 마운트하는 데 30초 넘게 걸리면 Cloud Run에서 모든 마운트를 수행하는 제한 시간이 총 30초이므로 Cloud Run 서비스를 시작할 수 없습니다.

NFS 성능 특성

NFS 볼륨을 2개 이상 만들면 모든 볼륨이 동시에 마운트됩니다.

NFS는 네트워크 파일 시스템이므로 대역폭 제한이 적용되며 제한된 대역폭으로 인해 파일 시스템에 대한 액세스가 영향을 받을 수 있습니다.

NFS 볼륨에 쓰면 데이터가 플러시될 때까지 쓰기가 Cloud Run 메모리에 저장됩니다. 다음과 같은 경우에 데이터가 플러시됩니다.

  • 애플리케이션이 sync(2), msync(2) 또는 fsync(3)를 사용하여 파일 데이터를 명시적으로 플러시합니다.
  • 애플리케이션에서 close(2)로 파일을 닫습니다.
  • 메모리 압력은 시스템 메모리 리소스의 재생성을 강제합니다.

자세한 내용은 NFS에 대한 Linux 문서를 참조하세요.