Spot VM을 사용하여 저렴한 비용으로 내결함성 워크로드 실행


이 페이지에서는 Google Kubernetes Engine(GKE) 클러스터와 노드 풀에서 Spot VM을 사용하여 저렴한 비용으로 내결함성, 스테이트리스(Stateless) 또는 일괄 워크로드를 실행하는 방법을 설명합니다.

개요

스팟 VM은 기본 표준 VM보다 가격이 저렴한 Compute Engine 가상 머신(VM)으로, 가용성을 보장하지 않습니다. 스팟 VM은 표준 Compute Engine VM과 동일한 머신 유형 및 옵션을 제공합니다. Compute Engine은 표준 VM에 리소스가 필요할 때와 같은 시스템 이벤트로 인해 언제든지 Spot VM을 확보할 수 있습니다.

GKE의 스팟 VM에 대해 자세히 알아보려면 스팟 VM을 참조하세요.

스팟 VM을 사용하면 스테이트리스(Stateless), 일괄 또는 내결함성 워크로드를 실행하기 위해 선점형 VM을 사용할 필요가 없습니다. 24시간 후 만료되는 선점형 VM과 달리 스팟 VM은 만료 시간이 없습니다. Compute Engine에서 표준 VM을 실행하는 데 리소스가 필요하면 Spot VM이 종료됩니다.

Spot VM은 Spot 포드를 통해 GKE Autopilot 클러스터에서도 지원됩니다. Autopilot은 Spot 포드를 사용하여 Spot VM의 워크로드를 자동으로 예약하고 관리합니다.

제한사항

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

Spot VM을 사용하여 클러스터 만들기

Google Cloud CLI 또는 Google Cloud Console에서 Spot VM을 사용하여 새 클러스터를 만들 수 있습니다.

gcloud

표준 VM 대신 기본 노드 풀에서 Spot VM을 사용하는 새 클러스터를 만듭니다.

gcloud container clusters create CLUSTER_NAME \
    --spot

CLUSTER_NAME을 새 클러스터 이름으로 바꿉니다.

콘솔

Spot VM을 사용하여 노드 풀이 있는 새 클러스터를 만들려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭합니다.

  3. 클러스터 만들기 대화상자에서 GKE 표준 옆에 있는 구성을 클릭합니다.

  4. 탐색 메뉴의 노드 풀 섹션에서 구성하려는 노드 풀의 이름을 클릭한 후 노드를 클릭합니다.

  5. Spot VM 사용 설정 체크박스를 선택합니다.

  6. 필요에 따라 클러스터를 구성한 후 만들기를 클릭합니다.

Spot VM을 사용하여 노드 풀 만들기

gcloud CLI 또는 Google Cloud console에서 Spot VM을 사용하여 새 노드 풀을 만들 수 있습니다. 새 노드 풀에서만 Spot VM을 사용 설정할 수 있습니다. 기존 노드 풀에서는 Spot VM을 사용 설정하거나 중지할 수 없습니다.

gcloud

Spot VM을 사용하여 새 노드 풀을 만듭니다.

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --spot

POOL_NAME을 새 노드 풀 이름으로 바꿉니다.

콘솔

Spot VM을 사용하여 새 노드 풀을 만들려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.

  3. 노드 풀 추가를 클릭합니다.

  4. 탐색 메뉴에서 노드를 클릭합니다.

  5. Spot VM 사용 설정 체크박스를 선택합니다.

  6. 필요에 따라 노드 풀을 구성한 후 만들기를 클릭합니다.

스팟 VM에서 워크로드 예약

GKE는 스팟 VM을 사용하는 노드에 cloud.google.com/gke-spot=truecloud.google.com/gke-provisioning=spot(GKE 버전 1.25.5-gke.2500 이상을 실행하는 노드) 라벨을 추가합니다. 포드 사양의 nodeSelector 필드 또는 노드 어피니티를 사용하여 포드 사양에서 이 라벨을 필터링할 수 있습니다.

다음 예시에서는 둘 중 하나에서 스팟 VM이 사용되는 2개의 노드 풀로 구성된 클러스터를 만듭니다. 그런 후 스테이트리스(Stateless) nginx 애플리케이션을 스팟 VM에 배포하고, nodeSelector를 사용하여 GKE가 포드를 배치하는 위치를 제어합니다.

  1. 표준 VM을 사용하여 기본 노드 풀로 새 클러스터를 만듭니다.

    gcloud container clusters create CLUSTER_NAME
    

    CLUSTER_NAME을 새 클러스터 이름으로 바꿉니다.

  2. 클러스터의 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Spot VM을 사용하여 노드 풀을 만듭니다.

    gcloud container node-pools create POOL_NAME \
        --num-nodes=1 \
        --spot
    

    POOL_NAME을 새 노드 풀 이름으로 바꿉니다.

  4. 다음 매니페스트를 pi-app.yaml이라는 파일로 저장합니다.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        metadata:
          labels:
            app: pi
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          terminationGracePeriodSeconds: 25
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    

    이 매니페스트에서 nodeSelector 필드는 GKE가 스팟 VM을 사용하는 노드의 포드만 예약하도록 지정합니다.

  5. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f pi-app.yaml
    
  6. 포드를 설명합니다.

    kubectl describe pod pi
    

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

    Name:         pi-kjbr9
    Namespace:    default
    Priority:     0
    Node:         gke-cluster-2-spot-pool-fb434072-44ct
    ...
    Labels:       app=pi
                  job-name=pi
    Status:       Succeeded
    ...
    Controlled By:  Job/pi
    Containers:
    ...
    Conditions:
      Type              Status
      Initialized       True
      Ready             False
      ContainersReady   False
      PodScheduled      True
    Volumes:
    ...
    Node-Selectors:              cloud.google.com/gke-spot=true
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  4m3s   default-scheduler  Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct
      Normal  Pulling    4m2s   kubelet            Pulling image "perl:5.34.0"
      Normal  Pulled     3m43s  kubelet            Successfully pulled image "perl:5.34.0" in 18.481761978s
      Normal  Created    3m43s  kubelet            Created container pi
      Normal  Started    3m43s  kubelet            Started container pi
    

    Node 필드는 GKE가 Spot VM을 사용하는 노드에서만 포드를 예약한다는 것을 보여줍니다.

스팟 VM에 taint 및 톨러레이션(toleration) 사용

DNS와 같은 시스템 워크로드를 배치할 수 있는 Spot VM 없이 권장사항에 따라 스팟 VM 없이 최소 하나 이상의 노드 풀로 클러스터를 만듭니다. 노드 taint 및 해당 톨러레이션(toleration)을 사용하여 GKE가 Spot VM에 특정 워크로드를 배치하지 않도록 할 수 있습니다.

  1. Spot VM을 사용한 노드 taint가 있는 노드로 노드 풀을 만들려면 노드 풀을 만들 때 --node-taints 플래그를 사용합니다.

    gcloud container node-pools create POOL_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule
        --spot
    
  2. Spot VM에 예약하려는 포드에 해당 톨러레이션(toleration)을 추가하려면 배포를 수정하고 다음을 포드 사양에 추가합니다.

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

    GKE는 노드 taint가 추가된 Spot VM에 대해 이 톨러레이션(toleration)을 포함하는 포드만 예약합니다.

다음 단계