스팟 VM


이 페이지에서는 Spot VM의 정의와 Spot VM이 Google Kubernetes Engine(GKE)에서 어떤 방식으로 작동하는지에 대해 설명합니다. Spot VM 사용 방법은 Spot VM 사용을 참조하세요.

GKE의 Spot VM 개요

스팟 VM은 표준 Compute Engine VM보다 저렴하고 가용성을 보장하지 않는 Compute Engine 가상 머신(VM) 인스턴스입니다. 스팟 VM은 표준 VM과 동일한 머신 유형 및 옵션을 제공합니다.

클러스터 및 노드 풀에서 Spot VM을 사용하면 Spot VM의 임시 특성으로 인한 중단을 허용할 수 있는 스테이트리스(Stateless), 일괄 또는 내결함성 워크로드를 실행할 수 있습니다.

Compute Engine에서 표준 VM에 대한 리소스가 필요할 때까지 Spot VM은 계속 사용할 수 있습니다.

Spot VM에 대한 자세한 내용은 Compute Engine 문서의 Spot VM을 참조하세요.

Spot VM의 이점

Spot VM 및 선점형 VM에는 다음과 같은 많은 이점이 있습니다.

24시간 후 만료되는 선점형 VM과 달리 Spot VM은 만료 시간이 없습니다. Spot VM은 Compute Engine에서 다른 곳에 리소스를 필요로 하는 경우에만 종료됩니다.

GKE에서 Spot VM 작동 방식

Spot VM이 있는 클러스터 또는 노드 풀을 만들면 GKE는 관리형 인스턴스 그룹(MIG)처럼 작동하는 기본 Compute Engine Spot VM을 만듭니다. Spot VM을 사용하는 노드는 표준 GKE 노드처럼 작동하지만 가용성을 보장하지 않습니다. Spot VM에서 사용하는 리소스가 표준 VM을 실행하는 데 필요한 경우 Compute Engine은 다른 위치에서 리소스를 사용하도록 Spot VM을 종료합니다.

Spot VM의 종료 및 단계적 종료

Compute Engine이 Spot VM에서 사용하는 리소스를 회수해야 하는 경우 종료 알림이 GKE로 전송됩니다. Spot VM은 종료 알림을 받은 후 30초 동안 종료됩니다.

기본적으로 클러스터는 단계적 노드 종료를 사용합니다. kubelet은 종료 알림을 확인하고 노드에서 실행 중인 포드를 단계적으로 종료합니다. 포드가 배포의 일부인 경우 컨트롤러는 종료된 포드를 대체할 새 포드를 만들고 예약합니다.

kubelet은 최상의 방식으로 비시스템 포드에 15초의 단계적 종료 기간을 부여하며 이후 시스템 포드(system-cluster-critical 또는 system-node-critical priorityClasses 가진)는 15초 동안 단계적으로 종료됩니다.

단계적 노드 종료 중에 kubelet은 포드 상태를 업데이트하여 Failed 단계와 Terminated 이유를 종료된 포드에 할당합니다.

종료된 포드 수가 노드 100개 미만인 클러스터의 경우 1,000개, 노드 수가 100개 이상인 클러스터의 경우 5,000개의 기준점에 도달하면 가비지 컬렉션이 포드를 삭제합니다.

다음 명령어를 사용하여 종료된 포드를 수동으로 삭제할 수도 있습니다.

  kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
  kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

스팟 VM에서 워크로드 예약

GKE는 cloud.google.com/gke-spot=truecloud.google.com/gke-provisioning=spot(GKE 버전 1.25.5-gke.2500 이상을 실행하는 노드) 라벨을 자동으로 스팟 VM을 사용하는 노드에 추가합니다. 포드 사양의 nodeSelector 필드를 사용하여 스팟 VM을 사용하는 노드에서 특정 포드를 예약할 수 있습니다. 다음 예시에서는 cloud.google.com/gke-spot 라벨을 사용합니다.

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-spot: "true"

또는 다음 예시와 같이 노드 어피니티를 사용하여 GKE가 스팟 VM에서 포드를 예약하도록 지정할 수 있습니다.

apiVersion: v1
kind: Pod
spec:
...
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: cloud.google.com/gke-spot
            operator: In
            values:
            - "true"
...

또한 nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution을 사용하여 GKE가 Spot VM 사용 노드에 포드를 배치하는 것을 선호하도록 할 수도 있습니다. 대신에 GKE가 표준 VM을 사용하는 기존 노드에 포드를 예약할 수도 있으므로 Spot VM을 우선 사용하는 것은 권장하지 않습니다.

예약에 taint 및 톨러레이션(toleration) 사용

시스템 중단을 방지하기 위해서는 노드 taint를 사용하여 GKE가 중요한 워크로드를 Spot VM에 예약하지 않는지 확인합니다. Spot VM을 사용하는 노드를 taint하면 GKE는 해당 노드에 대한 해당 톨러레이션(toleration)이 있는 포드만 예약합니다.

노드 taint를 사용하는 경우 표준 Compute Engine VM을 사용하는 노드 풀이 클러스터에 하나 이상 있어야 합니다. 표준 VM을 사용하는 노드 풀은 GKE가 DNS와 같은 중요한 시스템 구성요소를 예약할 수 있는 안정적인 위치를 제공합니다.

Spot VM에 노드 taint를 사용하는 방법은 Spot VM에 taint 및 톨러레이션(toleration) 사용을 참조하세요.

GPU 노드 풀에 Spot VM 사용

Spot VM은 GPU 사용을 지원합니다. 새 GPU 노드 풀을 만들면 GKE가 자동으로 nvidia.com/gpu=present:NoSchedule taint를 새 노드에 추가합니다. 해당 톨러레이션(toleration)이 있는 포드만 이러한 노드에서 실행될 수 있습니다. GKE는 GPU를 요청하는 포드에 이 톨러레이션(toleration)을 자동으로 추가합니다.

Spot VM을 사용하는 GPU 노드 풀을 만들려면 먼저 표준 VM을 사용하는 비GPU 노드 풀이 클러스터에 하나 이상 있어야 합니다. 클러스터에 Spot VM을 사용하는 GPU 노드 풀만 있는 경우 GKE는 해당 노드에 nvidia.com/gpu=present:NoSchedule taint를 추가하지 않습니다. 따라서 GKE는 Spot VM을 사용하는 GPU 노드 풀에 시스템 워크로드를 예약할 수 있습니다. GPU 노드가 비GPU 노드보다 컴퓨팅 비용이 높기 때문에 Spot VM으로 인해 중단이 발생할 수 있으며 리소스 소비를 늘릴 수 있습니다.

클러스터 자동 확장 처리 및 노드 자동 프로비저닝

클러스터 자동 확장 처리노드 자동 프로비저닝을 사용하여 워크로드의 요구에 따라 클러스터 및 노드 풀을 자동으로 확장할 수 있습니다. 클러스터 자동 확장 처리와 노드 자동 프로비저닝은 모두 Spot VM을 사용하여 지원됩니다.

Spot VM 및 노드 자동 프로비저닝

노드 자동 프로비저닝은 워크로드의 요구사항을 충족하도록 클러스터의 노드 풀을 자동으로 만들고 삭제합니다. nodeSelector 또는 노드 어피니티를 사용하여 Spot VM이 필요한 워크로드를 예약하면 노드 자동 프로비저닝이 워크로드의 포드를 수용하기 위해 새 노드 풀을 만듭니다. GKE는 새 노드 풀의 노드에 cloud.google.com/gke-spot=true:NoSchedule taint를 자동으로 추가합니다. 해당 톨러레이션(toleration)이 있는 포드만 이러한 노드 풀의 노드에서 실행될 수 있습니다. GKE가 Spot VM에 포드를 배치할 수 있도록 배포에 해당 톨러레이션(toleration)을 추가해야 합니다.

   tolerations:
   - key: cloud.google.com/gke-spot
     operator: Equal
     value: "true"
     effect: NoSchedule

톨러레이션(toleration)과 nodeSelector 또는 노드 어피니티 규칙을 모두 사용하여 GKE Spot VM에서 포드를 예약하도록 할 수 있습니다.

톨러레이션(toleration)만 사용하여 워크로드를 예약하면 GKE는 Spot VM 또는 용량이 있는 기존 표준 VM에 Pod를 예약할 수 있습니다. 스팟 VM에 워크로드를 예약해야 하는 경우 톨러레이션(toleration) 외에도 nodeSelector 또는 노드 어피니티를 사용합니다. 자세한 내용은 스팟 VM에서 워크로드 예약을 참조하세요.

Spot VM 및 클러스터 자동 확장 처리

클러스터 자동 확장 처리는 필요에 따라 노드 풀의 노드를 자동으로 추가하고 삭제합니다. 클러스터에 기존 Spot VM에 배치할 수 없는 포드가 있는 경우 클러스터 자동 확장 처리는 Spot VM을 사용하는 새 노드를 추가합니다.

기본 정책

GKE 버전 1.24.1-gke.800부터 자동 확장 처리 위치 정책을 정의할 수 있습니다. 리소스를 사용할 수 있고 기본 위치 정책이 ANY로 설정되면 클러스터 자동 확장 처리가 스팟 VM 노드 풀을 프로비저닝하려고 시도합니다. 이 정책에서 Spot VM은 선점될 위험이 낮습니다. 다른 VM 유형의 경우 기본 클러스터 자동 확장 처리 배포 정책은 BALANCED입니다.

스팟 VM을 사용하여 Standard 노드 풀 업그레이드

스팟 VM을 사용하는 Standard 클러스터 노드 풀이 일시 급증 업그레이드를 사용하도록 구성된 경우 GKE는 스팟 VM으로 일시 급증 노드를 만듭니다. 하지만 GKE는 스팟 VM에서 가용성을 보장하지 않으므로 기존 노드를 차단하고 드레이닝하기 전에 스팟 VM이 준비될 때까지 기다리지 않습니다. 자세한 내용은 일시 급증 업그레이드를 참조하세요.

Kubernetes 동작 수정

GKE에서 Spot VM을 사용하면 Kubernetes가 제공하는 다음과 같은 몇 가지 보증 및 제약조건이 수정됩니다.

  • Spot VM 회수는 비자발적이며 PodDisruptionBudgets이 적용되지 않습니다. 구성된 PodDisruptionBudget보다 더 높은 비가용성을 경험할 수 있습니다.

Spot VM 권장사항

Spot VM을 사용하는 시스템을 설계할 때 다음 가이드라인을 사용하면 심각한 중단을 방지할 수 있습니다.

  • Spot VM에는 가용성이 보장되지 않습니다. GKE는 Spot VM의 일부 또는 전부를 언제든지 회수할 수 있다는 가정하에 새 인스턴스를 사용할 수 있는 시점을 보장하지 않고 시스템을 설계합니다.
  • 사용 가능한 Spot VM이 없어도 워크로드 및 작업이 처리되도록 하려면 클러스터에 Spot VM을 사용하는 노드풀과 표준 Compute Engine VM을 사용하는 노드 풀이 혼합되어 있어야 합니다.
  • Spot VM을 사용하는 GPU 노드 풀을 추가하기 전에 클러스터에 표준 VM을 사용하는 GPU가 없는 노드 풀이 하나 이상 있는지 확인합니다.
  • 일반적으로 노드 재생성 시 노드 이름은 변경되지 않지만 Spot VM에서 사용하는 내부 및 외부 IP 주소는 재생성 후 변경될 수 있습니다.
  • 노드 taint 및 톨러레이션(toleration)을 사용하여 중요한 포드가 Spot VM을 사용하는 노드 풀에 예약되지 않았는지 확인합니다.
  • 스팟 VM에서 스테이트풀(Stateful) 워크로드를 실행하려면 종료 후 25초 이내에 워크로드가 정상적으로 종료되는지 테스트하여 영구 볼륨 데이터 손상 위험을 최소화합니다.
  • Kubernetes 포드 종료 권장사항을 따릅니다.

다음 단계