선점형 VM 만들기 및 사용

이 페이지에서는 선점형 가상 머신(VM) 인스턴스를 만들고 사용하는 방법을 설명합니다. 선점형 VM은 표준 VM 가격에 비해 60~91% 할인된 가격으로 제공됩니다. 하지만 Compute Engine이 다른 작업 때문에 리소스를 회수해야 하는 경우 이러한 인스턴스를 중지(선점)할 수 있습니다. 선점형 인스턴스는 항상 24시간 후에 중지됩니다. 선점형 인스턴스에 대한 자세한 내용은 선점형 인스턴스 문서를 참조하세요.

선점형 인스턴스는 인스턴스 선점을 견딜 수 있는 내결함성 애플리케이션에만 권장됩니다. 선점형 인스턴스를 만들기로 결정하기 전에 애플리케이션에서 선점을 처리할 수 있는지 확인하세요. 선점형 인스턴스의 위험과 가치를 이해하려면 선점형 인스턴스 문서를 참조하세요.

시작하기 전에

선점형 인스턴스 만들기

Google Cloud Console, gcloud 도구 또는 API를 사용하여 선점형 인스턴스를 만듭니다.

Console

일반 인스턴스를 만들 때와 동일한 방식으로 선점형 인스턴스를 만들되, preemptible 속성을 사용 설정해야 합니다.

  1. Google Cloud Console에서 인스턴스 만들기 페이지로 이동합니다.

    인스턴스 만들기로 이동

  2. VM 세부정보를 지정합니다.

  3. 네트워킹, 디스크, 보안, 관리, 단독 테넌시 섹션을 펼치고 다음을 수행합니다.

    1. 관리 섹션을 펼칩니다.
    2. 가용성 정책에서 선점 가능성 옵션을 사용으로 설정합니다. VM의 자동 다시 시작이 사용 중지되고 호스트 유지보수 작업이 종료로 설정됩니다.
  4. 만들기를 클릭하여 VM을 만들고 시작합니다.

gcloud

gcloud compute를 사용하는 경우 일반 인스턴스를 만들 때와 동일한 instances create 명령어를 사용하되, --preemptible 플래그를 추가합니다.

gcloud compute instances create [VM_NAME] --preemptible

여기에서 [VM_NAME]은 인스턴스 이름입니다.

API

API에서 일반적인 인스턴스 만들기 요청을 작성하되, scheduling 아래에 preemptible 속성을 포함하고 이를 true로 설정합니다. 예를 들면 다음과 같습니다.

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

{
  'machineType': 'zones/[ZONE]/machineTypes/[MACHINE_TYPE]',
  'name': '[INSTANCE_NAME]',
  'scheduling':
  {
    'preemptible': true
  },
  ...
}

선점형 CPU 할당량

선점형 인스턴스에는 일반 인스턴스와 같이 사용 가능한 CPU 할당량이 필요합니다. 선점형 인스턴스에서 일반 인스턴스의 CPU 할당량을 소비하지 않도록 'Preemptible CPU'의 특별 할당량을 요청할 수 있습니다. Compute Engine에서 해당 지역에 선점형 CPU 할당량을 부여한 후 모든 선점형 인스턴스는 해당 할당량에 반영되고, 모든 일반 인스턴스는 계속 일반 CPU 할당량에 반영됩니다.

선점형 CPU 할당량이 없는 리전에서는 일반 CPU 할당량을 사용하여 선점형 인스턴스를 시작할 수 있습니다. 여느 때처럼 충분한 IP와 디스크 할당량도 필요합니다. Compute Engine이 할당량을 부여하지 않으면 gcloud 도구나 Cloud Console 할당량 페이지에 선점형 CPU 할당량이 표시되지 않습니다.

할당량에 대한 자세한 내용은 리소스 할당량 페이지를 참조하세요.

선점형 VM 시작

다른 VM과 마찬가지로 선점형 VM이 중지되거나 선점된 경우 VM을 다시 시작하고 RUNNING 상태로 되돌릴 수 있습니다. 선점형 VM을 시작하면 24시간 카운터가 재설정되지만 여전히 선점형 VM이므로 Compute Engine이 24시간 전에 선점될 수 있습니다. 선점형 인스턴스는 실행 중인 표준 인스턴스로 변환할 수 없습니다.

Compute Engine이 자동 확장 관리형 인스턴스 그룹(MIG) 또는 Google Kubernetes Engine(GKE) 클러스터에서 선점형 VM을 중지하면 리소스를 다시 사용할 수 있을 때 그룹이 VM을 다시 시작합니다.

종료 스크립트로 선점 처리하기

인스턴스가 선점되면 종료 스크립트를 사용하여 인스턴스가 중지되기 전에 정리 작업을 수행 할 수 있습니다. 예를 들어 실행 중인 프로세스를 정상적으로 중지하고 체크포인트 파일을 Cloud Storage에 복사할 수 있습니다.

다음은 실행 중인 선점형 인스턴스에 추가하거나 선점형 인스턴스를 만들 때 추가할 수 있는 종료 스크립트입니다. 이 스크립트는 운영체제의 일반 kill 명령어가 나머지 프로세스를 모두 중지하기 전 인스턴스가 종료되기 시작할 때 실행됩니다. 원하는 프로그램을 정상적으로 중지한 후 스크립트는 Cloud Storage 버킷에 체크포인트 파일을 동시에 업로드합니다.

#!/bin/bash

MY_PROGRAM="[PROGRAM_NAME]" # For example, "apache2" or "nginx"
MY_USER="[LOCAL_USERNAME]"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
GSUTIL_OPTS="-m -o GSUtil:parallel_composite_upload_threshold=32M"
BUCKET_NAME="[BUCKET_NAME]" # For example, "my-checkpoint-files" (without gs://)

echo "Shutting down!  Seeing if ${MY_PROGRAM} is running."

# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"

if [[ "$?" -ne 0 ]]; then
  echo "${MY_PROGRAM} not running, shutting down immediately."
  exit 0
fi

echo "Sending SIGINT to $PID"
kill -2 "$PID"

# Portable waitpid equivalent
while kill -0 "$PID"; do
   sleep 1
done

echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"

su "${MY_USER}" -c "gsutil $GSUTIL_OPTS cp $CHECKPOINT gs://${BUCKET_NAME}/"

echo "Done uploading, shutting down."

이 스크립트를 인스턴스에 추가하려면 인스턴스의 애플리케이션에서 작동하도록 스크립트를 구성한 후 인스턴스 메타데이터에 추가합니다.

  1. 종료 스크립트를 로컬 워크 스테이션으로 복사하거나 다운로드합니다.
  2. 수정할 파일을 열고 다음 변수를 변경합니다.
    • [PROGRAM_NAME]은 종료할 프로세스나 프로그램의 이름입니다. 예를 들면 apache2 또는 nginx입니다.
    • [LOCAL_USER]는 가상 머신에 로그인할 때 사용한 사용자 이름입니다.
    • [BUCKET_NAME]은 프로그램의 체크포인트 파일을 저장할 Cloud Storage 버킷의 이름입니다. 이 경우 버킷 이름은 gs://로 시작되지 않습니다.
  3. 변경사항을 저장합니다.
  4. 새 인스턴스기존 인스턴스에 종료 스크립트를 추가합니다.

이 스크립트는 다음을 가정합니다.

  • 인스턴스가 Cloud Storage에 대한 최소한의 읽기/쓰기 권한으로 생성되었습니다. 적절한 범위로 인스턴스를 만드는 방법에 대한 안내는 인증 문서를 참조하세요.

  • 기존 Cloud Storage 버킷과 이에 대한 쓰기 권한이 있습니다.

인스턴스가 선점형인지 확인하기

Cloud Console, gcloud 도구, API 를 사용하여 인스턴스가 선점형으로 구성되었는지 확인할 수 있습니다.

Console

인스턴스 속성을 보고 인스턴스가 선점형인지 확인합니다.

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 프로젝트를 선택하고 계속을 클릭합니다.

  3. 확인할 인스턴스의 이름을 클릭합니다. 인스턴스 세부정보 페이지가 열립니다.

  4. 선점형 상태는 인스턴스 세부정보의 가용성 정책 섹션에 지정됩니다.

gcloud


gcloud compute에서 instances describe를 사용하여 인스턴스가 선점형인지 여부를 포함하여 인스턴스의 정보를 가져옵니다.

gcloud compute instances describe [INSTANCE_NAME]

여기에서 [INSTANCE_NAME]은 인스턴스 이름입니다.

응답 정보의 예약 섹션에 선점형 상태가 포함되어 있습니다.

...
scheduling:
  automaticRestart: false
  onHostMaintenance: TERMINATE
  preemptible: true
...

API


인스턴스가 선점형인지 확인하려면 API를 사용하여 인스턴스 URI에 GET 요청을 보냅니다.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]

응답 정보의 scheduling 아래에 선점형 상태가 포함되어 있습니다.

{
    "kind": "compute#instance",
    "id": "4468501694759003918",
    "creationTimestamp": "2015-04-15T15:40:59.004-07:00",
    "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
    "status": "RUNNING",
    "name": "example-instance",
    "scheduling":
    {
       "preemptible": true
    },
    ...
 }

또는 인스턴스가 인스턴스 내부에서 선점형인지 확인할 수 있습니다. 메타데이터 서버에서 인스턴스의 기본 인스턴스 메타데이터에 있는 scheduling/preemptible 값을 확인하면 됩니다.

예를 들어 인스턴스 내에서 curl을 사용하여 scheduling/preemptible 메타데이터 경로의 값을 구할 수 있습니다.

curl "http://metadata.google.internal/computeMetadata/v1/instance/scheduling/preemptible" -H "Metadata-Flavor: Google"
TRUE

값이 TRUE이면 인스턴스가 선점형입니다.

인스턴스가 선점되었는지 감지하기

Google Cloud Console, gcloud 도구 또는 API를 사용하여 인스턴스가 선점되었는지 확인합니다.

Console

시스템 활동 로그를 점검하여 인스턴스가 선점되었는지 확인할 수 있습니다.

  1. Google Cloud Console에서 로그 페이지로 이동합니다.

    로그로 이동

  2. 프로젝트를 선택하고 계속을 클릭합니다.

  3. 라벨별 필터링 또는 텍스트 검색 필드에 compute.instances.preempted를 추가합니다.

  4. 원할 경우 특정 인스턴스에 대한 선점 작업을 보려면 인스턴스 이름을 입력해도 됩니다.

  5. Enter 키를 눌러 지정한 필터를 적용합니다. 인스턴스가 선점된 작업만 표시하도록 Cloud Console의 로그 목록이 업데이트됩니다.

  6. 선점된 인스턴스에 대한 세부정보를 보려면 목록에서 작업을 선택합니다.

gcloud


gcloud compute operations list 명령어를 filter 매개변수와 함께 사용하여 프로젝트의 선점 이벤트 목록을 가져올 수 있습니다.

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted"

filter 매개변수를 사용하여 결과 범위를 세부적으로 지정할 수 있습니다. 예를 들어 관리형 인스턴스 그룹 내의 인스턴스에 대한 선점 이벤트만 확인하려면 다음을 실행합니다.

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_INSTANCE_NAME]"

gcloud는 다음과 비슷한 응답을 반환합니다.

NAME                  TYPE                         TARGET                                   HTTP_STATUS STATUS TIMESTAMP
systemevent-xxxxxxxx  compute.instances.preempted  us-central1-f/instances/example-instance-xxx  200         DONE   2015-04-02T12:12:10.881-07:00

작업 유형이 compute.instances.preempted이면 인스턴스가 선점된 것입니다. operations describe 명령어를 사용하여 특정 선점 작업에 대한 자세한 정보를 볼 수 있습니다.

gcloud compute operations describe \
    systemevent-xxxxxxxx

gcloud는 다음과 비슷한 응답을 반환합니다.

...
operationType: compute.instances.preempted
progress: 100
selfLink: https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/operations/systemevent-xxxxxxxx
startTime: '2015-04-02T12:12:10.881-07:00'
status: DONE
statusMessage: Instance was preempted.
...

API


최근 시스템 작업 목록을 가져오려면 영역 작업의 URI에 GET 요청을 보냅니다.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations

응답에는 최근 작업 목록이 포함됩니다.

{
  "kind": "compute#operation",
  "id": "15041793718812375371",
  "name": "systemevent-xxxxxxxx",
  "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/instances/example-instance",
  "targetId": "12820389800990687210",
  "status": "DONE",
  "statusMessage": "Instance was preempted.",
  ...
}

선점 작업만 표시하도록 응답 범위를 지정하려면 다음과 같이 API 요청에 필터를 추가합니다. operationType="compute.instances.preempted" 특정 인스턴스의 선점 작업을 확인하려면 다음과 같이 필터에 targetLink 매개변수를 추가합니다. operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]"

인스턴스가 인스턴스 내부에서 선점되었는지 여부를 확인할 수도 있습니다. 이 기능은 Compute Engine 선점으로 인해 종료 스크립트의 정상 종료와 다른 방식으로 종료를 처리하려는 경우에 유용합니다. 이렇게 하려면 메타데이터 서버에서 인스턴스의 기본 인스턴스 메타데이터에 있는 preempted 값을 확인하면 됩니다.

예를 들어 인스턴스 내에서 curl을 사용하여 preempted 메타데이터 경로의 값을 구할 수 있습니다.

curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
TRUE

이 값이 TRUE이면 인스턴스가 Compute Engine에 의해 선점된 것이고, 그렇지 않으면 FALSE입니다.

종료 스크립트 밖에서 이 값을 사용하려면 URL에 ?wait_for_change=true를 추가하면 됩니다. 그러면 메타데이터가 변경되고 인스턴스가 선점된 경우에만 반환되는 중지된 HTTP GET 요청이 수행됩니다.

curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
TRUE

선점 설정 테스트

인스턴스에서 시뮬레이션된 유지보수 이벤트를 실행해 선점을 강제로 적용해 볼 수 있습니다. 이 기능을 이용해 앱이 선점형 인스턴스를 어떻게 처리하는지 테스트해 보세요. 인스턴스에서 유지보수 이벤트를 테스트하는 방법은 가용성 정책 테스트를 참조하세요.

또한 인스턴스를 중지하여 인스턴스 선점을 시뮬레이션할 수도 있습니다. 이 방법은 유지보수 이벤트를 시뮬레이션하는 대신 사용할 수 있으며, 할당량 제한을 피할 수 있습니다.

권장사항

다음은 선점형 VM 인스턴스를 최대한 활용하는 데 도움이 되는 몇 가지 권장사항입니다.

일괄 인스턴스 API 사용

단일 VM을 만드는 대신 일괄 인스턴스 API를 사용할 수 있습니다.

작은 머신 유형 선택

선점형 VM 인스턴스용 리소스는 초과 및 백업 Google Cloud 용량에서 나옵니다. 대개 더 큰 머신 유형보다 작은 머신 유형을 사용할 경우 더 쉽게 용량을 얻을 수 있습니다.

사전 정의된 유형 사이에 있는 커스텀 머신 유형을 사용하여 더 많은 여유 용량을 확보할 수도 있습니다. 예를 들어 n1-standard-64s가 있는 것보다 48개의 vCPU가 있는 커스텀 머신 유형의 용량이 더 많을 수 있습니다.

사용량이 적을 때 대규모 선점형 VM 클러스터 실행

Google Cloud 데이터 센터의 부하는 위치와 시간에 따라 다르지만 일반적으로 야간과 주말에 가장 낮습니다. 따라서 큰 선점형 VM 클러스터를 실행하기에 가장 좋은 시간은 야간과 주말입니다.

결함 및 선점을 허용하도록 애플리케이션 설계

선점 패턴이 다른 시점에서 변경될 것이라는 사실에 대비하는 것이 중요합니다. 예를 들어, 영역이 부분적으로 중단되는 경우 복구 과정에서 이동해야 하는 일반 인스턴스를 위한 공간을 확보하기 위해 많은 수의 선점형 인스턴스를 선점할 수 있습니다. 이 짧은 기간 동안의 선점률은 여느 날과 매우 달라 보입니다. 애플리케이션에서 선점이 항상 작은 그룹으로 이루어진다고 가정할 경우 이러한 이벤트에 대한 준비가 되어 있지 않을 수 있습니다. VM 인스턴스를 중지하여 선점 발생 시 애플리케이션의 동작을 테스트할 수 있습니다.

선점된 인스턴스 만들기 재시도

VM 인스턴스가 선점되었으면 일반 인스턴스로 돌아가기 전에 선점형 인스턴스를 한두 번 다시 시도하는 것이 좋습니다. 요구사항에 따라 작업이 적절한 속도로 진행되도록 클러스터에서 일반 인스턴스와 선점형 인스턴스를 결합하는 것이 좋습니다.

종료 스크립트 사용

처음부터 다시 시작하지 않고 중단한 부분부터 작업을 다시 진행할 수 있도록 작업 진행 상황을 저장할 수 있는 종료 스크립트로 종료 및 선점 알림을 관리합니다.

다음 단계