이 페이지에서는 Google Kubernetes Engine(GKE)에서 선점형 VM을 사용하는 방법을 보여줍니다.
개요
선점형 VM은 표준 VM보다 가격이 저렴하고 가용성을 보장하지 않는 Compute Engine VM 인스턴스입니다. 선점형 VM은 Spot VM과 비슷한 기능을 제공하지만 생성 후 최대 24시간 동안만 지속됩니다.
경우에 따라 선점형 VM이 24시간 이상 지속될 수 있습니다. 이는 새 Compute Engine 인스턴스가 너무 빠르게 실행되고 Kubernetes가 다른 Compute Engine VM이 생성된 것을 인식하지 못한 경우에 발생할 수 있습니다. 기본 Compute Engine 인스턴스의 최대 기간은 24시간이며 예상 선점형 VM 동작을 따릅니다.
Spot VM 비교
선점형 VM은 Spot VM과 다음과 같이 많은 유사점을 공유합니다.
- Compute Engine에서 표준 VM을 실행하기 위해 리소스가 필요할 때 종료됩니다.
- 스테이트리스(Stateless), 일괄 처리 또는 내결함성 워크로드를 실행하는 데 유용합니다.
- 표준 VM보다 낮은 가격 책정
- GKE 버전 1.20 이상을 실행하는 클러스터에서는 단계적 노드 종료가 기본적으로 사용 설정됩니다.
- 클러스터 자동 확장 처리 및 노드 자동 프로비저닝과 함께 작동합니다.
최대 만료 시간이 없는 Spot VM과 달리 선점형 VM은 생성 후 최대 24시간 동안만 지속됩니다.
새 클러스터 및 노드 풀에서 선점형 VM을 사용 설정할 수 있고, nodeSelector
또는 노드 어피니티를 사용하여 예약을 제어하고, taint 및 톨러레이션(toleration)을 사용하여 노드가 선점형일 때 시스템 워크로드 문제를 방지할 수 있습니다.
선점형 VM 종료 및 단계적 종료
Compute Engine이 선점형 VM에서 사용하는 리소스를 회수해야 하는 경우 선점 알림이 GKE로 전송됩니다. 선점형 VM은 종료 알림을 받은 후 30초 동안 종료됩니다.
GKE 버전 1.20 이상을 실행하는 클러스터에서는 kubelet 단계적 노드 종료 기능이 기본적으로 사용 설정됩니다. kubelet은 종료 알림을 확인하고 노드에서 실행 중인 포드를 단계적으로 종료합니다. 포드가 배포의 일부인 경우 컨트롤러는 종료된 포드를 대체할 새 포드를 만들고 예약합니다.
kubelet은 최상의 방식으로 노드 풀의 GKE 버전에 따라 다음과 같은 단계적 종료 기간을 부여합니다.
- 1.22.8-gke.200 이상:
system-cluster-critical
또는system-node-critical
우선순위 클래스가 있는 시스템 포드가 15초 동안 단계적으로 종료된 후 시스템 이외의 포드가 15초 동안 단계적으로 종료됩니다. - 1.22.8-gke.200 이하:
system-cluster-critical
또는system-node-critical
우선순위 클래스가 있는 시스템 포드가 5초 동안 단계적으로 종료된 후 시스템 이외의 포드가 25초 동안 단계적으로 종료됩니다.
단계적 노드 종료 중에 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
Kubernetes 동작 수정
GKE에서 선점형 VM을 사용하면 Kubernetes가 제공하는 다음과 같은 몇 가지 보증 및 제약조건이 수정됩니다.
GKE는 Compute Engine에서 선점 알림을 받은 후 30초 동안 포드의 유예 기간 없이 선점형 VM을 종료합니다.
선점형 VM 회수는 비자발적이며
PodDisruptionBudgets
이 적용되지 않습니다. 구성된PodDisruptionBudget
보다 더 높은 비가용성을 경험할 수 있습니다.
제한사항
- kubelet 단계적 노드 종료 기능은 GKE 버전 1.20 이상이 실행되는 클러스터에서만 사용 설정됩니다. GKE 버전 1.20 이전에서는 GCP의 Kubernetes 노드 종료 이벤트 핸들러를 사용하여 선점형 VM이 종료될 때 포드를 단계적으로 종료할 수 있습니다.
- 선점형 VM은 Windows Server 노드 풀을 지원하지 않습니다.
선점형 VM이 있는 클러스터 또는 노드 풀 만들기
Google Cloud CLI를 사용하여 선점형 VM이 있는 클러스터 또는 노드 풀을 만들 수 있습니다.
선점형 VM이 있는 클러스터를 만들려면 다음 명령어를 실행하세요.
gcloud container clusters create CLUSTER_NAME \
--preemptible
CLUSTER_NAME
을 새 클러스터 이름으로 바꿉니다.
선점형 VM이있는 노드 풀을 만들려면 다음 명령어를 실행하세요.
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--preemptible
POOL_NAME
을 새 노드 풀 이름으로 바꿉니다.
nodeSelector를 사용하여 선점형 VM에서 포드 예약
GKE는 선점형 VM을 사용하는 노드에 cloud.google.com/gke-preemptible=true
및 cloud.google.com/gke-provisioning=preemptible
(GKE 버전 1.25.5-gke.2500 이상을 실행하는 노드) 라벨을 추가합니다. 배포에서 nodeSelector
를 사용하여 GKE가 선점형 VM에만 포드를 예약하도록 지정할 수 있습니다.
예를 들어 다음 배포는 cloud.google.com/gke-preemptible
라벨을 사용하여 선점형 VM을 필터링합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
spec:
replicas: 3
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
resources:
requests:
cpu: 200m
nodeSelector:
cloud.google.com/gke-preemptible: "true"
선점형 VM에 노드 taint 사용
GKE가 노드에 해당 톨러레이션(toleration)이 있는 포드만 배치할 수 있도록 선점형 VM을 사용하는 노드를 taint할 수 있습니다.
선점형 VM을 사용하는 노드 풀에 노드 taint를 추가하려면 다음 명령어와 비슷하게 노드 풀을 만들 때 --node-taints
플래그를 사용합니다.
gcloud container node-pools create POOL2_NAME \
--cluster=CLUSTER_NAME \
--node-taints=cloud.google.com/gke-preemptible="true":NoSchedule
이제 노드 taint에 대한 내성이 있는 포드만 해당 노드에 예약됩니다.
포드에 관련 톨러레이션(toleration)을 추가하려면 배포를 수정하고 다음을 포드 사양에 추가합니다.
tolerations:
- key: cloud.google.com/gke-preemptible
operator: Equal
value: "true"
effect: NoSchedule
GPU 선점형 VM에 대한 노드 taint
선점형 VM은 GPU 사용을 지원합니다. 선점형 VM을 사용하는 GPU 노드 풀을 추가하려면 먼저 선점형 VM을 사용하지 않는 클러스터에서 다른 노드 풀을 하나 이상 만들어야 합니다. 표준 노드 풀을 사용하면 GKE가 DNS와 같은 시스템 구성요소만 안전하게 배치할 수 있습니다.
선점형 VM을 사용하는 GPU 노드 풀이 포함된 새 클러스터를 만들거나 선점형 VM을 사용하는 새 GPU 노드 풀을 아직 표준 노드 풀이 없는 클러스터에 추가하는 경우 GKE가 nvidia.com/gpu=present:NoSchedule
taint를 노드에 자동으로 추가하지 않습니다. GKE가 시스템 포드를 선점형 VM으로 예약하여 중단이 발생할 수 있습니다. 또한 GPU 노드가 GPU 이외의 노드보다 비용이 높기 때문에 이러한 동작은 리소스 소비를 늘려줍니다.
다음 단계
- 주문형 노드를 대체로 사용하여 Spot VM에서 GKE 애플리케이션을 실행하는 방법 알아보기
- GKE의 스팟 VM에 대해 자세히 알아보기
- taint 및 톨러레이션(toleration)에 대해 자세히 알아보기