선점형 VM 실행

이 페이지에서는 Google Kubernetes Engine(GKE)에서의 선점형 가상 머신(VM) 지원 개요를 설명합니다.

개요

선점형 VM은 최대 24시간 동안 지속되고 가용성을 보장하지 않는 Compute Engine VM 인스턴스입니다. 선점형 VM은 표준 Compute Engine VM보다 낮은 가격으로 동일한 머신 유형과 옵션을 제공합니다.

GKE 클러스터 또는 노드 풀에서 선점형 VM을 사용하여 선점형 VM의 임시성과 비보장성에 덜 민감한 일괄 작업이나 내결함성 작업을 실행할 수 있습니다.

선점형 VM에 대한 자세한 내용은 Compute Engine 문서의 선점형 VM을 참조하세요.

선점형 VM 작동 방식

GKE 클러스터나 노드 풀이 생성하는 Compute Engine VM은 관리형 인스턴스 그룹처럼 동작합니다. GKE의 선점형 VM은 관리형 인스턴스 그룹의 선점형 인스턴스와 동일한 제한을 받습니다. 선점형 인스턴스는 선점 알림을 수신하고 나서 30초 후에 종료됩니다.

또한 이러한 선점형 VM에는 Kubernetes 라벨 cloud.google.com/gke-preemptible=true가 부여됩니다. nodeSelector 필드에서 Kubernetes 라벨을 사용하여 Pod를 특정 노드에 예약할 수 있습니다.

다음은 선점형 VM을 필터링하기 위한 선택기의 예시입니다.

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

Kubernetes 제약조건 위반

GKE에서 선점형 VM을 사용하면 일부 Kubernetes 보증이 무효화됩니다. 다음 제약조건은 선점형 VM에 의해 수정됩니다.

  • 노드 선점은 Pod를 비정상적으로 종료하고 구성된 Pod 유예 기간을 무시합니다. 즉, Pod가 예고 없이 종료됩니다.

  • Pod 중단 예산 문서에 따르면 "예산은 모든 비가용성 원인이 아닌 자발적 제거로부터만 보호될 수 있습니다." 선점은 자발적이 아니므로 Pod 중단 예산에 명시된 것보다 더 높은 비가용성을 경험할 수 있습니다.

권장사항

선점형 VM은 가용성을 보장하지 않기 때문에 Compute Engine 인스턴스의 일부 또는 전부가 선점되어 사용할 수 없게 될 수도 있다는 가정하에 시스템을 설계해야 합니다. 새 인스턴스를 사용할 수 있는 시점도 보장하지 않습니다.

또한 선점형 VM에서 실행 중인 Pod가 항상 정상적으로 종료된다고 보장할 수도 없습니다. GKE에서 노드가 선점되었고 Pod가 더 이상 실행되고 있지 않음을 감지하는 데 몇 분 정도 걸리므로 Pod가 새 노드로 다시 예약되는 동안 지연이 발생합니다.

사용 가능한 선점형 VM이 없어도 작업 또는 워크로드가 처리되도록 하려면 클러스터에 비선점형 노드 풀과 선점형 노드 풀을 모두 만들면 됩니다.

선점 후 대체될 경우 일반적으로 노드 이름은 동일하게 유지되지만 내부 및 외부 선점형 VM IP가 선점 시 변경될 수 있습니다.

스테이트풀(Stateful) Pod가 있는 선점형 VM은 StatefulSet의 고유한 의미 체계를 위반할 수 있으며 데이터 손실을 초래할 수 있으므로 사용하면 안됩니다.

노드 taint를 사용하여 선점형 VM 노드에 예약되지 않도록 하기

시스템 중단을 방지하기 위해서는 노드 taint를 사용하여 중요한 Pod가 선점형 VM 노드에 예약되지 않았는지 확인합니다.

노드 tainting을 적용하지 않을 경우에는 클러스터에 비선점형 비taint 노드도 있어서 항상 DNS와 같은 시스템 구성요소를 실행할 표준 VM 노드 풀이 있는지 확인합니다.

선점형 VM의 노드 tainting

선점형 VM이 있는 노드에 노드 taint를 추가하려면 다음 명령어를 실행합니다.

kubectl taint nodes node-name cloud.google.com/gke-preemptible="true":NoSchedule

여기서 node-name은 노드의 이름입니다.

이제 노드 taint에 대한 내성이 있는 Pod만 해당 노드에 예약됩니다.

Pod에 내결함성 추가

Pod에 관련 내결함성을 추가하려면 Pod의 사양 또는 객체의 Pod 템플릿 사양에 다음을 추가하세요.

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

GPU 선점형 노드 taint

선점형 GPU 노드 풀을 추가하기 전에 비선점형 노드로 클러스터를 만들어야 합니다. 이렇게 하면 선점형 GPU 노드 풀을 추가하기 전에 항상 DNS와 같은 시스템 구성요소를 실행할 표준 VM의 노드 풀이 있어야 합니다.

GPU가 있는 선점형 노드 풀이 클러스터에 추가될 때 클러스터에 다른 노드 풀이 없는 경우(예: 클러스터가 처음에 선점형 GPU 노드 풀을 사용하여 생성된 경우) 정상적인 "nvidia.com/gpu":NoSchedule taint가 할당되지 않습니다. 즉, 선점형 노드에 시스템 Pod가 예약되므로 선점 시 중단이 발생할 수 있습니다. 이러한 Pod는 GPU 노드의 리소스도 소모합니다. GPU 노드는 비 GPU 노드보다 비싸므로 이는 용량뿐만 아니라 비용 면에서도 낭비입니다.

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

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

gcloud

--preemptible 플래그를 지정하여 선점형 VM이 있는 클러스터 또는 노드 풀을 만들 수 있습니다.

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

gcloud container clusters create cluster-name --preemptible

여기서 cluster-name은 만들 클러스터의 이름입니다.

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

gcloud container node-pools create pool-name --preemptible \
    --cluster cluster-name

각 항목의 의미는 다음과 같습니다.

  • pool-name은 만들 노드 풀의 이름입니다.
  • cluster-name은 노드 풀의 클러스터 이름입니다.

콘솔

  1. Cloud Console에서 Google Kubernetes Engine 메뉴로 이동합니다.

    Google Kubernetes Engine 메뉴로 이동

  2. 클러스터 만들기 버튼을 클릭합니다.

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

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

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

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

다음 단계