Spot VM


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

GKE의 Spot VM 개요

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

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

Compute Engine에서 표준 VM에 대한 리소스가 필요할 때까지 Spot VM은 계속 사용할 수 있습니다. 비용 효율성을 극대화하려면 Spot VM과 GKE에서 비용 최적화 Kubernetes 애플리케이션 실행을 위한 권장사항을 함께 사용합니다.

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초 동안 종료됩니다.

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

kubelet은 system-cluster-critical 또는 system-node-critical 우선순위 클래스가 있는 시스템 포드가 5초 동안 단계적으로 종료된 후 시스템 이외의 포드가 25초 동안 단계적으로 종료되도록 합니다.

단계적 포드 종료 중에 kubelet은 종료된 포드에 Failed 상태와 Shutdown 이유를 할당합니다. 종료된 포드 수가 1, 000개에 도달하면 가비지 컬렉션이 포드를 삭제합니다.

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

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

Spot VM에서 워크로드 예약

GKE는 Spot VM에 사용되는 노드에 cloud.google.com/gke-spot=true 라벨을 자동으로 추가합니다. 다음 예시와 같이 포드 사양의 nodeSelector 필드를 사용하여 Spot VM을 사용하는 노드에서 특정 포드를 예약할 수 있습니다.

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

또는 다음 예시와 같이 노드 어피니티를 사용하여 GKE가 Spot 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 및 노드 자동 프로비저닝

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

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

nodeSelector 또는 노드 어피니티를 사용하여 Spot VM을 필터링하지 않고 톨러레이션(toleration)만 사용할 수도 있습니다. 이 경우 GKE는 Spot VM에서 포드를 예약하려고 시도합니다. 사용 가능한 Spot VM은 없지만 용량이 있는 기존의 표준 VM이 있는 경우 GKE는 대신 표준 VM에 포드를 예약합니다.

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

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

Kubernetes 동작 수정

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

  • GKE 버전 1.20 이전을 실행하는 클러스터에서는 kubelet 단계적 노드 종료 기능이 기본적으로 사용 중지됩니다. GKE는 Compute Engine에서 선점 알림을 받은 후 30초 동안 포드의 유예 기간 없이 Spot VM을 종료합니다.

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

Spot VM 권장사항

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

  • Spot VM에는 가용성이 보장되지 않습니다. GKE는 Spot VM의 일부 또는 전부를 언제든지 회수할 수 있다는 가정하에 새 인스턴스를 사용할 수 있는 시점을 보장하지 않고 시스템을 설계합니다.
  • Spot VM에서 실행되는 포드가 단계적으로 종료된다고 보장할 수 없습니다. GKE는 회수 후 몇 분 동안 노드가 회수되었음을 인식하지 못할 수 있으며, 이로 인해 이러한 포드를 새 노드로 재예약하는 데 지연이 발생합니다.
  • 사용 가능한 Spot VM이 없어도 워크로드 및 작업이 처리되도록 하려면 클러스터에 Spot VM을 사용하는 노드풀과 표준 Compute Engine VM을 사용하는 노드 풀이 혼합되어 있어야 합니다.
  • Spot VM을 사용하는 GPU 노드 풀을 추가하기 전에 클러스터에 표준 VM을 사용하는 GPU가 없는 노드 풀이 하나 이상 있는지 확인합니다.
  • kubelet 단계적 노드 종료 기능이 사용 중지된 1.20 이전 GKE 버전을 실행하는 클러스터의 GCP의 노드 종료 이벤트 핸들러에서 Kubernetes를 사용합니다. 핸들러는 Spot VM이 선점되면 포드를 단계적으로 종료합니다.
  • 일반적으로 노드 재생성 시 노드 이름은 변경되지 않지만 Spot VM에서 사용하는 내부 및 외부 IP 주소는 재생성 후 변경될 수 있습니다.
  • 노드 taint 및 톨러레이션(toleration)을 사용하여 중요한 포드가 Spot VM을 사용하는 노드 풀에 예약되지 않았는지 확인합니다.
  • Spot VM에서 스테이트풀(Stateful) 포드를 사용하지 마세요. StatefulSets에는 기본적으로 최대 1개의 색인당 포드 시맨틱스가 있으며, 이는 Spot VM의 선점으로 인해 데이터가 손실될 수 있습니다.
  • Kubernetes 포드 종료 권장사항을 따릅니다.

다음 단계