Spot 포드에서 더 저렴한 비용으로 내결함성 워크로드 실행


이 페이지에서는 Google Kubernetes Engine (GKE) Autopilot에서 Spot 포드를 사용하여 더 저렴한 비용으로 내결함성 워크로드를 실행하는 방법을 보여줍니다.

개요

GKE Autopilot 클러스터에서 Spot 포드는 Compute Engine Spot VM에서 지원되는 노드에서 실행되는 포드입니다. Spot 포드는 표준 Autopilot 포드보다 저렴하지만 표준 포드를 실행하기 위해 컴퓨팅 리소스가 필요할 때마다 GKE에서 제거할 수 있습니다.

Spot 포드는 이러한 워크로드를 표준 포드로 실행하는 것에 비해 저렴한 비용으로 스테이트리스(Stateless), 일괄 또는 내결함성 워크로드를 실행하는 데 적합합니다. Autopilot 클러스터에서 Spot 포드를 사용하려면 포드 사양으로 매니페스트를 수정하여 Spot 포드를 요청합니다.

기본 범용 Autopilot 컴퓨팅 클래스와 특정 하드웨어 요구사항을 충족하는 특수 컴퓨팅 클래스에서 Spot 포드를 실행할 수 있습니다. 이러한 컴퓨팅 클래스에 대한 자세한 내용은 Autopilot의 컴퓨팅 클래스를 참조하세요.

Autopilot 클러스터의 Spot 포드 가격 책정에 대한 자세한 내용은 Google Kubernetes Engine 가격 책정을 참조하세요.

이점

Autopilot 클러스터에서 Spot 포드를 사용하면 다음과 같은 이점이 있습니다.

  • 표준 Autopilot 포드에서 동일한 워크로드를 실행하는 것보다 낮은 가격 책정
  • GKE는 자동으로 자동 확장과 예약을 관리합니다.
  • GKE는 Spot 포드를 실행하는 노드를 자동으로 taint하여 중요한 워크로드와 같은 표준 포드가 이러한 노드에 예약되지 않도록 합니다. Spot 포드를 사용하는 배포는 해당 내결함성으로 자동으로 업데이트됩니다.

요구사항 및 제한사항

  • GKE 버전 1.21.4 이상이 필요합니다.
  • Spot 포드는 Autopilot 서비스수준계약에서 제외됩니다.
  • GKE는 GKE 버전 1.21.4 이전의 클러스터에서 Spot 포드를 예약할 수 없습니다.
  • Autopilot 클러스터는 cloud.google.com/gke-preemptible 선택기를 사용하여 GKE 버전 1.21.4 이상을 실행하는 클러스터에서 선점형 포드에 대한 요청을 지원합니다. 이 선택기를 사용하는 포드는 Spot 포드로 자동 마이그레이션되고 선택기는 cloud.google.com/gke-spot로 변경됩니다.

시작하기 전에

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

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

Autopilot 워크로드의 Spot 포드 요청

포드가 Spot 포드로 실행되도록 요청하려면 포드 사양의 nodeSelector 또는 노드 어피니티에서 cloud.google.com/gke-spot=true 라벨을 사용하세요. GKE는 Spot 포드를 실행할 수 있는 노드를 자동으로 프로비저닝합니다.

예를 들어 Google Cloud의 다른 곳에서 컴퓨팅 리소스가 필요한 경우 Spot 포드를 제거하고 종료할 수 있습니다. 종료가 발생하면 종료 노드의 Spot 포드는 terminationGracePeriodSeconds 필드를 지정하여 최선의 방식으로 부여되는 최대 25초의 유예 기간을 요청할 수 있습니다.

선점 시 Spot 포드에 적용되는 최대 유예 기간은 25초입니다. terminationGracePeriodSeconds에서 25초 넘게 요청하면 선점 시 25초가 넘지 않습니다. 삭제 시 포드에서 SIGTERM 신호를 수신하며 유예 기간 동안 종료 단계를 수행해야 합니다.

Autopilot의 경우 GKE는 Spot 포드를 실행하기 위해 생성된 노드를 자동으로 taint하고 해당 내결함성을 사용하여 워크로드를 수정합니다. taint는 Spot 포드를 실행하는 노드에 표준 포드가 예약되지 않도록 합니다.

nodeSelector를 사용하여 Spot 포드 요구

nodeSelector를 사용하여 배포에서 Spot 포드를 요구할 수 있습니다. 다음 예시와 같이 배포에 cloud.google.com/gke-spot=true 라벨을 추가합니다.

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

노드 어피니티를 사용하여 Spot 포드 요청

또는 노드 어피니티를 사용하여 Spot 포드를 요청할 수 있습니다. 노드 어피니티는 워크로드를 실행할 노드를 선택할 수 있는 더욱 확장 가능한 방법을 제공합니다. 예를 들어 여러 선택 기준을 결합하여 포드가 실행되는 위치를 더욱 세밀하게 제어할 수 있습니다. 노드 어피니티를 사용하여 Spot 포드를 요청하는 경우 다음과 같이 사용할 노드 어피니티 유형을 지정할 수 있습니다.

  • requiredDuringSchedulingIgnoredDuringExecution: Spot 포드를 사용해야 합니다.
  • preferredDuringSchedulingIgnoredDuringExecution: Spot 포드를 최선의 방식으로 사용합니다.

노드 어피니티를 사용하여 배포에서 Spot 포드를 요구하려면 다음 nodeAffinity 규칙을 배포 매니페스트에 추가합니다.

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

최상의 방식으로 Spot 포드 요청

노드 어피니티를 사용하여 Spot 포드를 최대한 요청하려면 preferredDuringSchedulingIgnoredDuringExecution을 사용합니다. Spot 포드를 선호하는 방식으로 요청하면 GKE는 다음 순서에 따라 포드를 예약합니다.

  1. 사용 가능한 할당 가능 용량이 있는 Spot 포드를 실행할 수 있는 기존 노드입니다.
  2. 할당 가능한 용량을 사용할 수 있는 기존 표준 노드입니다.
  3. 컴퓨팅 리소스를 사용할 수 있는 경우 Spot 포드를 실행할 수 있는 새 노드입니다.
  4. 새 표준 노드입니다.

GKE는 Spot 포드의 새 노드를 만드는 것보다 할당 가능한 용량이 있는 기존 표준 노드를 선호하므로 Spot 포드보다 표준 포드로 더 많은 포드가 실행되므로 더 저렴한 가격으로 제공됩니다.

종료된 포드 찾기 및 삭제

단계적 포드 종료 중에 kubelet은 종료된 포드에 Failed 상태와 Shutdown 이유를 할당합니다. 종료된 포드 수가 기준인 1,000개에 도달하면 가비지 컬렉션이 포드를 삭제합니다. 다음 명령어를 사용하여 수동으로 종료 포드를 삭제할 수도 있습니다.

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

다음 단계