선점형 VM 인스턴스 만들기 및 시작

이 페이지에서는 선점형 가상 머신(VM) 인스턴스를 만들고 사용하는 방법을 설명합니다. 선점형 인스턴스는 일반 인스턴스보다 훨씬 더 낮은 가격으로 만들고 실행할 수 있는 인스턴스입니다. 하지만 다른 작업 때문에 리소스에 액세스해야 하는 경우 Compute Engine이 이러한 인스턴스를 종료(선점)할 수 있습니다. 선점형 인스턴스는 항상 24시간 후에 종료됩니다. 선점형 인스턴스에 대해 더 자세히 알아보려면 선점형 인스턴스 문서를 참조하세요.

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

시작하기 전에

선점형 인스턴스 만들기

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

Console

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

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

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.
  3. 새 인스턴스 만들기 페이지에서 인스턴스의 속성을 입력합니다.
  4. 관리, 보안, 디스크, 네트워킹, 단독 테넌시를 클릭합니다.
  5. 가용성 정책에서 선점 가능성 옵션을 사용으로 설정합니다. 그러면 인스턴스의 자동 다시 시작이 사용 중지되고 호스트 유지보수 작업이 종료로 설정됩니다.
  6. 만들기를 클릭하여 인스턴스를 만듭니다.

gcloud

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

gcloud compute instances create [INSTANCE_NAME] --preemptible

여기에서 [INSTANCE_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 도구나 GCP Console의 할당량 페이지에 선점형 CPU 할당량이 표시되지 않습니다.

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

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

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

다음은 실행 중인 선점형 인스턴스에 추가하거나 선점형 인스턴스를 만들 때 추가할 수 있는 종료 스크립트입니다. 이 스크립트는 운영체제의 일반 kill 명령어가 나머지 프로세스를 모두 종료하기 전 인스턴스가 종료되기 시작할 때 실행됩니다. 원하는 프로그램을 정상적으로 종료한 후 스크립트는 Google 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 버킷과 이에 대한 쓰기 권한이 있습니다.

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

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

Console


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

  1. 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://compute.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 Platform Console, gcloud 도구 또는 API를 사용하여 인스턴스가 선점되었는지 확인합니다.

Console


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

  1. 로그 페이지로 이동합니다.

    로그 페이지로 이동

  2. 프로젝트를 선택하고 계속을 클릭합니다.
  3. 라벨별 필터링 또는 텍스트 검색 필드에 compute.instances.preempted를 추가합니다.
  4. 원할 경우 특정 인스턴스에 대한 선점 작업을 보려면 인스턴스 이름을 입력해도 됩니다.
  5. Enter 키를 눌러 지정한 필터를 적용합니다. 인스턴스가 선점된 작업만 표시하도록 GCP 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://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://compute.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://compute.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 인스턴스를 최대한 활용하는 데 도움이 되는 몇 가지 권장사항입니다.

작은 머신 유형 선택

선점형 VM 인스턴스용 리소스는 초과 및 백업 Google Cloud Platform 용량에서 나옵니다. 대개 더 큰 머신 유형보다 작은 머신 유형을 사용할 경우 더 쉽게 선점형 용량을 얻을 수 있습니다. 기존 기록을 볼 때 코어가 32개 미만인 작은 머신 유형의 선점률도 큰 머신 유형보다 낮습니다.

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

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

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

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

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

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

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

종료 스크립트 사용

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

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서