이 페이지에서는 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의 워크로드를 자동으로 예약하고 관리합니다.
제한사항
- kubelet 단계적 노드 종료 기능은 GKE 버전 1.20 이상이 실행되는 클러스터에서만 사용 설정됩니다. GKE 버전 1.20 이전에서는 GCP의 Kubernetes 노드 종료 이벤트 핸들러를 사용하여 Spot VM이 선점될 때 포드를 단계적으로 종료할 수 있습니다.
- 스팟 VM은 Windows Server 노드 풀을 지원하지 않습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- 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 콘솔에서 Spot VM을 사용하여 새 클러스터를 만들 수 있습니다.
gcloud
기본 노드 풀에서 표준 VM 대신 스팟 VM을 사용하는 새 클러스터를 만듭니다.
gcloud container clusters create CLUSTER_NAME \
--spot
CLUSTER_NAME
을 새 클러스터 이름으로 바꿉니다.
콘솔
Spot VM을 사용하여 노드 풀이 있는 새 클러스터를 만들려면 다음 단계를 따르세요.
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
add_box만들기를 클릭합니다.
클러스터 만들기 대화상자에서 GKE 표준 옆에 있는 구성을 클릭합니다.
탐색 메뉴의 노드 풀 섹션에서 구성하려는 노드 풀의 이름을 클릭한 후 노드를 클릭합니다.
Spot VM 사용 설정 체크박스를 선택합니다.
필요에 따라 클러스터를 구성한 후 만들기를 클릭합니다.
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을 사용하여 새 노드 풀을 만들려면 다음 단계를 수행합니다.
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.
노드 풀 추가를 클릭합니다.
탐색 메뉴에서 노드를 클릭합니다.
Spot VM 사용 설정 체크박스를 선택합니다.
필요에 따라 노드 풀을 구성한 후 만들기를 클릭합니다.
스팟 VM에서 워크로드 예약
GKE는 스팟 VM을 사용하는 노드에 cloud.google.com/gke-spot=true
및 cloud.google.com/gke-provisioning=spot
(GKE 버전 1.25.5-gke.2500 이상을 실행하는 노드) 라벨을 추가합니다. 포드 사양의 nodeSelector
필드 또는 노드 어피니티를 사용하여 포드 사양에서 이 라벨을 필터링할 수 있습니다.
다음 예시에서는 둘 중 하나에서 스팟 VM이 사용되는 2개의 노드 풀로 구성된 클러스터를 만듭니다. 그런 후 스테이트리스(Stateless) nginx
애플리케이션을 스팟 VM에 배포하고, nodeSelector
를 사용하여 GKE가 포드를 배치하는 위치를 제어합니다.
표준 VM을 사용하여 기본 노드 풀로 새 클러스터를 만듭니다.
gcloud container clusters create CLUSTER_NAME
CLUSTER_NAME
을 새 클러스터 이름으로 바꿉니다.클러스터의 사용자 인증 정보를 가져옵니다.
gcloud container clusters get-credentials CLUSTER_NAME
Spot VM을 사용하여 노드 풀을 만듭니다.
gcloud container node-pools create POOL_NAME \ --num-nodes=1 \ --spot
POOL_NAME
을 새 노드 풀 이름으로 바꿉니다.다음 매니페스트를
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을 사용하는 노드의 포드만 예약하도록 지정합니다.매니페스트를 클러스터에 적용합니다.
kubectl apply -f pi-app.yaml
포드를 설명합니다.
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에 특정 워크로드를 배치하지 않도록 할 수 있습니다.
Spot VM을 사용한 노드 taint가 있는 노드로 노드 풀을 만들려면 노드 풀을 만들 때
--node-taints
플래그를 사용합니다.gcloud container node-pools create POOL_NAME \ --node-taints=cloud.google.com/gke-spot="true":NoSchedule --spot
스팟 VM에 예약하려는 포드에 해당 톨러레이션(toleration)을 추가하려면 배포를 수정하고 다음을 포드 사양에 추가합니다.
tolerations: - key: cloud.google.com/gke-spot operator: Equal value: "true" effect: NoSchedule
GKE는 노드 taint가 추가된 Spot VM에 대해 이 톨러레이션(toleration)을 포함하는 포드만 예약합니다.
다음 단계
- 주문형 노드를 대체 수단으로 사용하여 스팟 VM에서 GKE 애플리케이션을 실행하는 방법 알아보기
- GKE의 스팟 VM에 대해 자세히 알아보기
- GKE에서 Spot VM을 사용하여 일괄 워크로드 배포에 대한 튜토리얼 이용하기