VM 예약을 사용하여 리소스 가용성 확보

이 문서에서는 예약된 리소스에서 실행되는 작업을 만드는 방법과 작업이 예약을 사용하지 못하도록 차단하는 방법을 설명합니다.

예약은 Compute Engine의 기능입니다. 예약을 사용하면 지정된 하드웨어 구성을 사용하여 하나 이상의 VM에 대한 용량을 매우 높은 수준으로 확보할 수 있습니다. VM을 예약하면 예약을 만들 때부터 예약을 삭제할 때까지 VM 비용이 발생합니다. 하지만 이 VM을 사용하는 동안 총 비용은 예약이 없는 VM과 동일합니다.

일반적으로 예약은 용량 가용성이 매우 중요한 작업이거나 리소스를 가져오는 데 오류가 발생해서는 안 될 때 유용합니다. 특히 Batch의 경우 작업 예약 시간을 최소화하는 데 도움이 되는 전용 예약을 사용하거나 사용하지 않고 있던 기존 예약을 사용해 보세요. 약정 사용 할인에 필요한 예약과 같이 사용량이 적은 예약이 있으면, 사용되지 않는 동안 이를 사용하도록 작업을 구성하여 이를 통해 발생하게 되는 비용을 최적화할 수 있습니다. 또는 프로젝트의 다른 워크로드에 리소스 가용성을 우선하는 경우 작업이 예약을 사용하지 못하도록 명시적으로 차단할 수 있습니다.

예약에 대한 자세한 내용은 예약에 관한 Compute Engine 문서를 참고하세요.

시작하기 전에

  1. Batch를 사용한 적이 없으면 Batch 시작하기를 검토하고 프로젝트 및 사용자 기본 요건을 완료하여 Batch를 사용 설정하세요.
  2. 필요에 따라 작업의 VM에서 사용할 예약을 생성하거나 기존 예약을 열람할 권한을 확보해 둡니다.
  3. 작업을 만드는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

    역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

제한사항

예약에 대한 일반적인 제한사항 외에도 Batch에는 다음과 같은 제한사항이 있습니다.

  • 작업의 VM은 공유 예약을 사용할 수 없습니다.
  • 작업의 VM이 압축 배치 정책을 지정하는 경우 예약을 사용할 수 없습니다.

요구사항

이 섹션에는 작업의 VM이 예약을 사용할 때의 요구사항이 요약되어 있습니다. 모든 요구사항에 대한 자세한 내용은 Compute Engine 문서의 예약 일반 요구사항구성 계획 절차를 참조하세요.

  • 작업의 VM이 일반적으로 예약을 사용할 수 있으려면 다음 조건을 모두 충족해야 합니다.

    • 작업과 예약은 정확히 일치하는 VM 속성을 지정해야 합니다.

    • 이 문서의 모든 제한사항과 예약에 관한 기타 모든 일반 요구사항을 준수해야 합니다.

  • 작업의 각 VM이 예약을 성공적으로 사용하려면 예약에 VM의 런타임 중에 사용할 수 있는 사용되지 않은 용량이 있어야 합니다.

    예약의 사용되지 않은 용량은 VM 수와 현재 이를 사용하는 VM 수의 차이입니다. 미사용 예약 용량이 있을 때마다 VM은 예약을 사용하려고 시도합니다. 따라서 VM이 만들어진 후 또는 나중에 실행되었을 때 VM이 예약을 사용하기 시작할 수 있습니다. VM은 VM 실행이 중지되거나 예약이 삭제될 때까지 예약 사용을 중지하지 않습니다.

    총 사용되지 않은 예약 용량에 따라 작업의 VM 중 일부 또는 전부가 예약을 사용할 수 있으며, 예약된 VM의 양은 작업 실행 시간 중에 달라질 수 있습니다.

예약된 VM을 사용할 수 있는 작업 만들기 및 실행

  1. 구성 계획하기: 작업과 예약이 호환되는지 확인하려면 다음 단계를 완료하세요.

    이미 존재하는 예약을 사용하려면 상응하는 구성으로 작업을 만들어야 합니다. 새 예약을 만들려는 경우 원하는 구성 옵션을 선택합니다.

    1. 예약 속성 결정하기: 제한사항으로 인해 공유 유형은 예약의 기본 옵션인 단일 프로젝트여야 합니다. 다음 예약 속성에 사용할 값을 결정합니다.

      • 소비 유형*
      • VM 수

      *예약의 소비 유형(특히 타겟팅됨 또는 자동 소비됨)은 어느 VM이 예약을 사용할 것인지 결정합니다.

      VM 수는 예약의 총 용량을 나타냅니다. 이 값을 결정할 때는 작업의 VM 수를 고려하세요.

    2. 작업 및 예약의 VM 속성 확인하기. 이 제한으로 인해 작업과 예약 모두 압축 배치 정책을 지정할 수 없습니다. 압축 배치 정책은 예약과 작업 모두의 기본 옵션입니다. 다음 VM 속성에 대해서 예약과 작업에 대해 정확히 일치하는 값을 결정하세요.

      • 프로젝트
      • 영역*
      • 머신 유형
      • 최소 CPU 플랫폼(해당하는 경우)
      • GPU 유형 및 수량(해당하는 경우)
      • 로컬 SSD 유형 및 수량(해당하는 경우)
      • 예약 어피니티#

      *작업 VM은 예약된 VM과 동일한 영역에 있어야 합니다. 작업의 allowedLocations[] 필드에 이 영역을 포함하거나 allowedLocations[] 필드를 생략하는 경우 작업의 위치를 이 영역이 포함된 리전으로 설정해야 합니다.

      작업은 policy 하위 필드 또는 VM 인스턴스 템플릿을 사용하여 이러한 모든 속성을 정의해야 합니다. 작업은 policy 하위 필드와 템플릿의 조합을 지정할 수 없습니다.

      선택적 필드는 한 리소스에 정의되고 다른 리소스에서 생략될 수 없습니다. 예약과 작업 모두에 대해 선택적 필드를 정의하거나 생략합니다. 작업에서 VM 인스턴스 템플릿을 지정하는 경우 지정된 템플릿의 필드에도 적용됩니다.

      #예약의 소비 유형은 작업의 VM에 필요한 예약 어피니티를 결정하며, 이는 다음과 같이 작업에서 지정해야 합니다.

      • 작업에서 VM 인스턴스 템플릿을 사용하는 경우 템플릿은 예약 문서에 설명된 대로 예약 어피니티를 구성해야 합니다.
      • 작업에서 템플릿을 사용하지 않고 예약이 구체적으로 타겟팅된 경우 작업의 reservation 필드에 예약 이름을 지정합니다.
      • 그렇지 않고 작업에서 템플릿을 사용하지 않고 예약이 자동으로 사용되는 경우 작업의 reservation 필드를 생략합니다.
  2. 예약 준비하기: 아직 예약을 생성하지 않았다면 작업의 VM에서 사용할 예약을 만듭니다. 예약에 계획한 속성이 있는지 확인합니다.

  3. 작업을 만들고 실행하기: gcloud CLI 또는 Batch API를 사용하여 준비된 예약에서 VM을 사용하는 작업을 만들고 실행할 수 있습니다.

    gcloud

    1. VM 인스턴스 리소스(instances[]) 하위 필드를 예약의 VM 속성과 정확하게 일치하도록 설정하여 작업의 구성 세부정보를 지정하는 JSON 파일을 만듭니다.

      예를 들어 예약에서 VM을 사용하는 기본 스크립트 작업을 만들려면 다음 콘텐츠가 포함된 JSON 파일을 만듭니다.

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      이전 단계에서 계획한 instances[] 하위 필드를 지정하여 작업에서 사용할 예약과 일치하는 VM 리소스로 VM_RESOURCES를 바꿉니다.

      예를 들어 다음 VM_RESOURCES 값부터 시작합니다.

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      이 값을 사용하려면 다음을 모두 변경하세요.

      1. 인스턴스 템플릿을 사용하고 싶으신가요?

        • 예: policy 필드를 instanceTemplate 필드로 바꾸고 예약과 일치하는 기존 VM 인스턴스 템플릿을 지정합니다. 예를 들어 VM 인스턴스 템플릿 사용에 관한 코드 샘플을 참고하세요. 예약에서 GPU 또는 로컬 SSD를 사용하는 경우 작업의 installGpuDrivers 필드와 volumes[] 필드도 각각 구성해야 합니다. 그렇지 않으면 나머지 변경사항을 건너뜁니다.

        • 아니요: MACHINE_TYPE를 예약과 동일한 머신 유형으로 바꿉니다.

      2. 예약에 최소 CPU 플랫폼이 포함되나요?

        • 예: MIN_CPU_PLATFORM을 동일한 최소 CPU 플랫폼으로 바꿉니다.

        • 아니요: minCpuPlatform 필드를 삭제합니다.

      3. 예약에 GPU가 포함되나요?

        • 예: INSTALL_GPU_DRIVERS, GPU_TYPE, GPU_COUNT를 예약과 일치하도록 바꿉니다. 예를 들어 GPU 사용에 관한 코드 샘플을 참고하세요.

        • 아니요: installGpuDrivers 필드와 accelerators[] 필드를 삭제합니다.

      4. 예약에 로컬 SSD가 포함되어 있나요?

        • : LOCAL_SSD_SIZELOCAL_SSD_NAME를 예약과 일치하도록 바꾸고 작업에 volumes[] 필드를 추가하여 로컬 SSD를 마운트합니다. 예를 들어 로컬 SSD 사용에 관한 코드 샘플을 참고하세요.

        • 아니요: disks[] 필드를 삭제합니다.

      5. 예약에서 특히 타겟팅된 소비 유형을 사용하나요?

        • 예: SPECIFIC_RESERVATION_NAME을 예약 이름으로 바꿉니다.

        • 아니요: reservation 필드를 삭제합니다.

      예를 들어 최소 CPU 플랫폼, GPU 또는 로컬 SSD를 지정하지 않은 n2-standard-32 VM에 자동으로 사용되는 예약을 사용하고 있다고 가정해 보겠습니다. 또한 VM 인스턴스 템플릿을 지정하지 않으려고 합니다. 이 경우 VM_RESOURCES를 다음 값으로 바꿔야 합니다.

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. 작업을 만들고 실행하려면 gcloud batch jobs submit 명령어를 사용합니다.

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

      다음을 바꿉니다.

      • JOB_NAME: 작업의 이름

      • LOCATION: 작업의 위치. 작업에서 allowedLocations[] 필드를 지정하지 않는 한 예약 영역이 포함된 리전이어야 합니다.

      • JSON_CONFIGURATION_FILE: 작업의 구성 세부정보가 포함된 JSON 파일의 경로

    API

    VM 인스턴스 리소스(instances[]) 하위 필드가 예약의 VM 속성과 정확하게 일치하도록 설정하는 jobs.create 메서드POST 요청을 만듭니다.

    예를 들어 예약에서 VM을 사용하는 기본 스크립트 작업을 만들려면 다음 요청을 실행합니다.

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트의 프로젝트 ID

    • LOCATION: 작업의 위치. 작업에서 allowedLocations[] 필드를 지정하지 않는 한 예약 영역이 포함된 리전이어야 합니다.

    • JOB_NAME: 작업의 이름

    • VM_RESOURCES: 이전 단계에서 계획한 instances[] 하위 필드를 지정하여 작업에서 사용할 예약과 일치하는 VM 리소스

      예를 들어 다음 VM_RESOURCES 값부터 시작합니다.

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }

      이 값을 사용하려면 다음을 모두 변경하세요.

      1. 인스턴스 템플릿을 사용하고 싶으신가요?

        • 예: policy 필드를 instanceTemplate 필드로 바꾸고 예약과 일치하는 기존 VM 인스턴스 템플릿을 지정합니다. 예를 들어 VM 인스턴스 템플릿 사용에 관한 코드 샘플을 참고하세요. 예약에서 GPU 또는 로컬 SSD를 사용하는 경우 작업의 installGpuDrivers 필드와 volumes[] 필드도 각각 구성해야 합니다. 그렇지 않으면 나머지 변경사항을 건너뜁니다.

        • 아니요: MACHINE_TYPE를 예약과 동일한 머신 유형으로 바꿉니다.

      2. 예약에 최소 CPU 플랫폼이 포함되나요?

        • 예: MIN_CPU_PLATFORM을 동일한 최소 CPU 플랫폼으로 바꿉니다.

        • 아니요: minCpuPlatform 필드를 삭제합니다.

      3. 예약에 GPU가 포함되나요?

        • 예: INSTALL_GPU_DRIVERS, GPU_TYPE, GPU_COUNT를 예약과 일치하도록 바꿉니다. 예를 들어 GPU 사용에 관한 코드 샘플을 참고하세요.

        • 아니요: installGpuDrivers 필드와 accelerators[] 필드를 삭제합니다.

      4. 예약에 로컬 SSD가 포함되어 있나요?

        • : LOCAL_SSD_SIZELOCAL_SSD_NAME를 예약과 일치하도록 바꾸고 작업에 volumes[] 필드를 추가하여 로컬 SSD를 마운트합니다. 예를 들어 로컬 SSD 사용에 관한 코드 샘플을 참고하세요.

        • 아니요: disks[] 필드를 삭제합니다.

      5. 예약에서 특히 타겟팅된 소비 유형을 사용하나요?

        • 예: SPECIFIC_RESERVATION_NAME을 예약 이름으로 바꿉니다.

        • 아니요: reservation 필드를 삭제합니다.

      예를 들어 최소 CPU 플랫폼, GPU 또는 로컬 SSD를 지정하지 않은 n2-standard-32 VM에 자동으로 사용되는 예약을 사용하고 있다고 가정해 보겠습니다. 또한 VM 인스턴스 템플릿을 지정하지 않으려고 합니다. 이 경우 VM_RESOURCES를 다음 값으로 바꿔야 합니다.

      "policy": {
        "machineType": "n2-standard-32"
      }

예약된 VM을 사용할 수 없는 작업 만들기 및 실행

작업이 예약을 사용하지 못하도록 차단하려면 reservation 필드NO_RESERVATION으로 설정합니다. 예약 사용을 방지하는 방법에 관한 자세한 내용은 Compute Engine 문서의 예약을 사용하지 않고 VM 만들기를 참고하세요.

gcloud CLI 또는 Batch API를 사용하여 예약된 VM을 사용할 수 없는 작업을 만들고 실행할 수 있습니다.

gcloud

  1. 작업의 구성 세부정보를 지정하고 reservation 필드를 NO_RESERVATION로 설정하는 JSON 파일을 만드세요.

    예를 들어 예약을 사용할 수 없는 기본 스크립트 작업을 만들려면 다음 콘텐츠가 포함된 JSON 파일을 만듭니다.

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. 작업을 만들고 실행하려면 gcloud batch jobs submit 명령어를 사용합니다.

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    다음을 바꿉니다.

    • JOB_NAME: 작업의 이름

    • LOCATION: 작업의 위치

    • JSON_CONFIGURATION_FILE: 작업의 구성 세부정보가 포함된 JSON 파일의 경로

API

reservation 필드를 NO_RESERVATION로 설정하는 jobs.create 메서드에 대해 POST 요청을 실행합니다.

예를 들어 예약을 사용할 수 없는 기본 스크립트 작업을 만들려면 다음 요청을 실행합니다.

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

다음을 바꿉니다.

다음 단계