선점형 VM을 사용하여 내결함성 워크로드 실행


이 페이지에서는 Google Kubernetes Engine(GKE)에서 선점형 VM을 사용하는 방법을 보여줍니다.

개요

선점형 VM은 최대 24시간 동안 지속되고 가용성을 보장하지 않는 Compute Engine VM 인스턴스입니다. 선점형 VM은 Spot VM과 비슷한 기능을 제공하지만 생성 후 최대 24시간 동안만 지속됩니다.

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

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

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

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

Kubernetes 동작 수정

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

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

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

제한사항

선점형 VM이 있는 클러스터 또는 노드 풀 만들기

gcloud 명령줄 도구 또는 Cloud Console을 사용하여 선점형 VM이 있는 클러스터 또는 노드 풀을 만들 수 있습니다.

gcloud

선점형 VM이 있는 클러스터를 만들려면 다음 명령어를 실행하세요.

gcloud container clusters create CLUSTER_NAME \
    --preemptible

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

선점형 VM이있는 노드 풀을 만들려면 다음 명령어를 실행하세요.

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

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

Console

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

    Google Kubernetes Engine으로 이동

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

  3. 원하는 대로 클러스터를 구성합니다.

  4. 탐색창의 노드 풀에서 구성하려는 노드 풀의 노드를 선택합니다.

  5. 선점형 노드 사용 설정 체크박스를 선택합니다.

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

nodeSelector를 사용하여 선점형 VM에서 포드 예약

GKE는 선점형 VM을 사용하는 노드에 cloud.google.com/gke-preemptible=true 노드 라벨을 추가합니다. 배포에서 nodeSelector를 사용하여 GKE가 선점형 VM에만 포드를 예약하도록 지정할 수 있습니다.

예를 들어 다음 배포는 선점형 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 \
    --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 이외의 노드보다 비용이 높기 때문에 이러한 동작은 리소스 소비를 늘려줍니다.

다음 단계