라이브 마이그레이션 알림 받기


메타데이터 서버는 scheduling/ 메타데이터 디렉터리 목록 및 maintenance-event 메타데이터 키를 통해 가상 머신(VM) 인스턴스의 예약 옵션과 설정에 대한 정보를 제공합니다. 이러한 메타데이터 키를 사용하여 VM의 예약 옵션에 대해 알아보고 유지보수 이벤트가 발생할 때 알림을 받을 수 있습니다.

기본적으로 Z3를 제외한 모든 VM은 라이브 마이그레이션으로 설정되어 있으며 VM 인스턴스가 라이브 마이그레이션되기 전에 메타데이터 서버가 유지보수 이벤트 알림을 수신합니다. 하지만 다른 예약 옵션을 선택할 경우 유지보수 이벤트 및 VM 동작이 다를 수 있습니다. 유지보수 이벤트와 이벤트 중 VM 동작에 대한 자세한 내용은 호스트 유지보수 개요를 참조하세요.

시작하기 전에

  • Windows Server VM의 경우 PowerShell 3.0 이상을 사용하세요. ctrl+v를 사용하여 복사된 코드 블록을 붙여넣는 것이 좋습니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    이 페이지의 Python 샘플을 로컬 개발 환경에서 사용하려면 gcloud CLI를 설치 및 초기화한 다음 사용자 인증 정보로 애플리케이션 기본 사용자 인증 정보를 설정하세요.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    자세한 내용은 다음을 참조하세요: Set up authentication for a local development environment.

라이브 마이그레이션 알림 받기

maintenance-event 메타데이터 키를 주기적으로 쿼리하여 유지보수 이벤트가 발생할 시간을 알 수 있습니다.

maintenance-event 메타데이터 키는 VM의 예약 옵션을 migrate로 설정한 경우 또는 VM에 GPU가 연결된 경우에만 유지보수 이벤트에 대해 채워집니다.

이 메타데이터 키 값이 유지보수 이벤트가 시작되기 60초 전에 변경되어 데이터 백업 또는 로그 업데이트와 같이 유지보수 이벤트 전에 수행하려는 모든 태스크를 트리거하는 방법을 애플리케이션 코드에 제공합니다.

간단히 말해서 Compute Engine은 다음 경우에만 60초 경고를 제공합니다.

  • 유지보수 이벤트 중에 라이브 마이그레이션되도록 VM의 가용성 옵션을 설정한 경우

  • 마지막 유지보수 이벤트 이후로 maintenance-event 메타데이터 키를 최소 1회 이상 쿼리한 경우

    • maintenance-event 메타데이터 키를 쿼리한 적이 전혀 없거나 마지막 마이그레이션 이후로 쿼리한 적이 없으면 Compute Engine은 VM에 유지보수 이벤트 사전 경고가 필요하지 않다고 간주합니다. 60초 경고를 건너뛰고 유지보수 이벤트가 즉시 시작됩니다.

    • 60초 경고를 건너뛰지 않으려면 마이그레이션 이벤트 사이에 클라이언트 코드에서 maintenance-event 메타데이터 키를 최소 한 번 이상 쿼리해야 합니다. 이 메타데이터 키를 감시하고 있는지 확인하려면 Compute Engine에 대해 직접 maintenance-event 메타데이터 키를 쿼리해야 합니다. 상위 수준 메타데이터를 쿼리할 경우에는 사전 알림이 트리거되지 않습니다.

GPU가 연결된 VM의 경우 종료 후 다른 호스트에서 다시 시작할 수 있는 시간을 제공하기 위해 VM이 중지되기 60초 전에 값이 변경됩니다. GPU가 연결된 VM은 라이브 마이그레이션되지 않고 중지 후 선택적으로 다시 시작됩니다. 자세한 내용은 GPU 호스트 유지보수 이벤트 처리를 참조하세요.

특정 VM 집합의 경우 VM 유지보수 옵션이 더 유연합니다. 자세한 내용은 호스트 유지보수 이벤트 모니터링 및 계획을 참조하세요.

유지보수 이벤트 메타데이터 키 쿼리

Linux VM

Linux VM에서 maintenance-event 메타데이터 키를 쿼리하려면 다음 명령어를 실행합니다.

user@myinst:~$ curl http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event -H "Metadata-Flavor: Google"

출력은 다음과 비슷합니다.

NONE

wait-for-change 옵션을 사용할 수도 있습니다. 이 옵션을 지정하면 유지보수 이벤트가 시작되고 종료될 때만 요청이 출력을 반환합니다.

user@myinst:~$ curl http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event?wait_for_change=true -H "Metadata-Flavor: Google"

Windows VM

Windows VM에서 maintenance-event 메타데이터 키를 쿼리하려면 다음 명령어를 실행합니다.

PS C:\> 
$value = (Invoke-RestMethod `
         -Headers @{'Metadata-Flavor' = 'Google'} `
         -Uri "http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event")
$value

출력은 다음과 비슷합니다.

NONE

wait-for-change 옵션을 사용할 수도 있습니다. 이 옵션을 지정하면 유지보수 이벤트가 시작되고 종료될 때만 요청이 출력을 반환합니다.

PS C:\> 
$value = (Invoke-RestMethod `
         -Headers @{'Metadata-Flavor' = 'Google'} `
         -Uri "http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event?wait_for_change=true")
$value

Python

업데이트 대기 기능과 함께 maintenance-event 메타데이터를 사용하여 유지보수 이벤트가 시작 및 종료될 때 스크립트 및 애플리케이션에 알림을 제공할 수 있습니다. 이렇게 하면 이벤트 전후에 실행할 모든 작업을 자동화할 수 있습니다.

다음 Python 샘플에서는 이 두 기능을 함께 구현하는 방법의 예시를 보여줍니다.


import time
from typing import Callable, NoReturn, Optional

import requests


METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}


def wait_for_maintenance(callback: Callable[[Optional[str]], None]) -> NoReturn:
    """
    Start an infinite loop waiting for maintenance signal.

    Args:
        callback: Function to be called when a maintenance is scheduled.

    Returns:
        Never returns, unless there's an error.
    """
    url = METADATA_URL + "instance/maintenance-event"
    last_maintenance_event = None
    last_etag = "0"

    while True:
        r = requests.get(
            url,
            params={"last_etag": last_etag, "wait_for_change": True},
            headers=METADATA_HEADERS,
        )

        # During maintenance the service can return a 503, so these should
        # be retried.
        if r.status_code == 503:
            time.sleep(1)
            continue
        r.raise_for_status()

        last_etag = r.headers["etag"]

        if r.text == "NONE":
            maintenance_event = None
        else:
            maintenance_event = r.text

        if maintenance_event != last_maintenance_event:
            last_maintenance_event = maintenance_event
            callback(maintenance_event)


def maintenance_callback(event: Optional[str]) -> None:
    """
    Example callback function to handle the maintenance event.

    Args:
        event: details about scheduled maintenance.
    """
    if event:
        print(f"Undergoing host maintenance: {event}")
    else:
        print("Finished host maintenance")


def main():
    wait_for_maintenance(maintenance_callback)


if __name__ == "__main__":
    main()

출력 검토

maintenance-event 메타데이터 키의 초기 및 기본값은 NONE입니다.

  • GPU가 연결된 VM의 경우 유지보수 이벤트 기간 동안 값이 NONE에서 TERMINATE_ON_HOST_MAINTENANCE로 변경됩니다. 이 값은 중지 이벤트가 시작되기 60분 전에 업데이트됩니다.

  • migrate 예약 옵션을 사용하는 비GPU VM의 경우 maintenance-event 값이 다음과 같이 변경됩니다.

    1. 마이그레이션 이벤트가 시작되면 값이 NONE에서 MIGRATE_ON_HOST_MAINTENANCE로 변경됩니다. 이 값은 중지 이벤트가 시작되기 60초 전에 업데이트됩니다.
    2. 이벤트가 지속되고 VM 인스턴스가 라이브 마이그레이션되는 동안 이 값은 MIGRATE_ON_HOST_MAINTENANCE로 유지됩니다.
    3. 유지보수 이벤트가 종료된 후에는 값이 NONE으로 되돌아갑니다.
  • 단독 테넌트 VM의 경우 호스트 유지보수 이벤트 중에 maintenance-event 메타데이터 키 값이 변경되지 않으며 이벤트 시작부터 끝까지 NONE으로 유지됩니다.

다음 단계