이 페이지에서는 Cloud Run 볼륨 마운트를 사용하여 파일 읽기 및 쓰기에 사용할 수 있는 전용 인메모리 볼륨을 구성하는 방법을 설명합니다. 이 기능은 Cloud Run이 제공하는 기본 인메모리 파일 시스템과 다릅니다.
Cloud Run에서 인메모리 볼륨을 마운트하면 인메모리 볼륨이 컨테이너 파일 시스템에 파일로 표시됩니다. 인메모리 볼륨을 마운트한 후에는, 프로그래밍 언어의 파일 시스템 작업 및 라이브러리를 사용하여 로컬 파일 시스템의 디렉터리처럼 파일 공유에 액세스할 수 있습니다.
인메모리 볼륨을 사용하여 다음 작업을 할 수 있습니다.
- 인메모리 볼륨 크기 제한. 볼륨 크기를 제한하면 전체 볼륨에 대한 쓰기가 실패하게 되는데, 이는 볼륨이 너무 많은 메모리를 사용하는 탓에 Cloud Run이 인스턴스를 종료하는 것보다 바람직합니다.
- 하나의 Cloud Run 인스턴스에서 서로 다른 컨테이너 간에 인메모리 볼륨 공유 Cloud Run이 서비스의 여러 인스턴스로 수평 확장하면 각 인스턴스는 해당 인스턴스의 모든 컨테이너에서 공유하는 자체 인메모리 볼륨을 갖게 됩니다. 이 볼륨은 트래픽 처리를 위해 Cloud Run이 수평 확장할 때 모든 컨테이너에서 사용할 수 있습니다.
동작
인메모리 볼륨을 만들 때는 크기 한도를 지정하는 것이 좋습니다. 볼륨 크기가 크기 한도에 도달하면 추가 쓰기는 메모리 부족 오류로 인해 실패합니다. 인스턴스는 이 오류를 처리하고 계속 실행할 수 있습니다.
참고로 크기 제한은 한도 설정일 뿐이며, 인메모리 볼륨에 추가 공간을 할당하지는 않습니다. 대신 인메모리 볼륨은 컨테이너에 구성된 메모리를 사용합니다. 컨테이너를 여러 개 배포하는 경우 볼륨에 쓸 때마다 사용되는 메모리는 데이터를 작성한 컨테이너의 메모리 사용량으로 계산됩니다.
크기 제한을 지정하지 않으면 작업 또는 서비스에 있는 모든 컨테이너 총 크기의 절반으로 자동 설정됩니다. 예를 들어 emptyDir
볼륨 크기는 [메모리(컨테이너 A) + 메모리(컨테이너 B) + 메모리(컨테이너 N)]/2입니다.
이러한 기본 동작으로 인해 인메모리 볼륨의 크기 한도가 일부 컨테이너에 할당된 메모리보다 높을 수 있습니다. 이 경우 컨테이너가 볼륨에 메모리를 계속 쓰면 볼륨 크기 한도에 도달하기 전에 할당된 메모리를 초과해서 비정상 종료됩니다.
크기 한도는 선택사항이지만 컨테이너가 메모리 부족 및 비정상 종료로부터 보호되도록 크기 한도를 설정하는 것이 좋습니다.
허용되지 않는 경로
Cloud Run에서는 볼륨을 /dev
, /proc
, /sys
또는 해당 하위 디렉터리에 마운트할 수 없습니다.
인메모리 볼륨 구성
구성을 변경하면 새 버전이 생성됩니다. 이를 변경하는 명시적 업데이트가 없으면 이후 버전에도 이 구성 설정이 자동으로 적용됩니다.
Cloud Run 서비스의 인메모리 볼륨을 구성하면 시작된 모든 Cloud Run 인스턴스에 대해 빈 볼륨이 생성되며 볼륨은 인스턴스가 실행되는 한 존재합니다. 인스턴스 실행이 중지되면 볼륨의 데이터가 영구 삭제됩니다.
콘솔
Google Cloud 콘솔에서 Cloud Run으로 이동합니다.
컨테이너 배포를 클릭하고 서비스를 선택하여 새 서비스를 구성합니다. 기존 서비스를 구성하는 경우 서비스를 클릭한 후 새 버전 수정 및 배포를 클릭합니다.
새 서비스를 구성하는 경우 초기 서비스 설정 페이지를 작성한 후 컨테이너, 볼륨, 네트워킹, 보안을 클릭하여 서비스 구성 페이지를 펼칩니다.
볼륨 탭을 클릭합니다.
- 볼륨에서 다음과 같이 합니다.
- 볼륨 추가를 클릭합니다.
- 볼륨 유형 드롭다운에서 볼륨 유형으로 인메모리를 선택합니다.
- 볼륨 이름 필드에 볼륨에 사용하려는 이름을 입력합니다.
- 완료를 클릭합니다.
- 컨테이너 탭을 클릭합니다.
- 볼륨 마운트 탭을 클릭합니다.
- 볼륨 마운트를 클릭합니다.
- 메뉴에서 인메모리 볼륨을 선택합니다.
- 볼륨을 마운트할 경로를 지정합니다.
- 볼륨 마운트를 클릭합니다.
- 볼륨에서 다음과 같이 합니다.
만들기 또는 배포를 클릭합니다.
gcloud
볼륨을 추가하고 마운트하려면 다음 명령어를 실행합니다.
gcloud beta run services update SERVICE \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
다음과 같이 바꿉니다.
SERVICE
: 서비스 이름- VOLUME_NAME: 볼륨에 사용할 이름. VOLUME_NAME 값은 볼륨을 볼륨 마운트에 매핑하는 데 사용됩니다.
MOUNT_PATH
: 볼륨을 마운트할 컨테이너 파일 시스템 내의 상대 경로(예:/mnt/my-volume
)- SIZE_LIMIT: 볼륨에 할당하려는 메모리 한도, MiB 또는 GiB 단위(Mi 또는 Gi 단위로 지정)(예:
500Mi
). 이 한도는 컨테이너에 지정된 총 메모리보다 작아야 합니다.
여러 컨테이너를 사용하는 경우 먼저 볼륨을 지정한 후 각 컨테이너의 볼륨 마운트를 지정합니다.
gcloud beta run services update SERVICE \ --add-volume=name= VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --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
새 서비스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 서비스를 업데이트하는 경우 YAML 구성을 다운로드합니다.
gcloud run services describe SERVICE --format export > service.yaml
다음과 같이
volumeMounts
및volumes
속성을 구성합니다.apiVersion: serving.knative.dev/v1 kind: Service metadata: annotations: run.googleapis.com/launch-stage: BETA spec: template: spec: containers: - image: IMAGE_URL volumeMounts: - mountPath: MOUNT_PATH name: VOLUME_NAME volumes: - name: VOLUME_NAME emptyDir: sizeLimit: SIZE_LIMIT medium: Memory
다음과 같이 바꿉니다.
- IMAGE_URL: 컨테이너 이미지에 대한 참조(예:
us-docker.pkg.dev/cloudrun/container/hello:latest
). Artifact Registry를 사용하는 경우 저장소 REPO_NAME이 이미 생성되어 있어야 합니다. URL의 형식은LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
입니다. - VOLUME_NAME: 볼륨에 사용할 이름. VOLUME_NAME 값은 볼륨을 볼륨 마운트에 매핑하는 데 사용됩니다.
MOUNT_PATH
: 볼륨을 마운트할 컨테이너 파일 시스템 내의 상대 경로(예:/mnt/my-volume
)- SIZE_LIMIT: 볼륨에 할당하려는 메모리 한도, MiB 또는 GiB 단위(Mi 또는 Gi 단위로 지정)(예:
500Mi
). 이 한도는 컨테이너에 지정된 총 메모리보다 작아야 합니다.
- IMAGE_URL: 컨테이너 이미지에 대한 참조(예:
다음 명령어를 사용하여 서비스를 만들거나 업데이트합니다.
gcloud 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");