프로그래밍공부(Programming Study)/DevOps

Argo Rollout과 AWS Spot Termination Event 대응: Pod 하나일 경우 순단 방지 및 Pod Drain 후 즉시 재배치하는 방법

Chann._.y 2024. 9. 20.
728x90

1. Argo Rollout이란?

Argo Rollout은 Kubernetes의 고급 배포 전략 도구로, 무중단 배포를 지원합니다. 카나리 배포나 블루-그린 배포 등 다양한 배포 방식을 쉽게 구현할 수 있으며, 실시간 모니터링 및 트래픽 제어 기능도 제공합니다.


2. AWS Spot Termination Event란?

AWS Spot Termination Event는 AWS에서 Spot Instance가 종료되기 2분 전에 발생하는 이벤트로, 이를 활용해 Pod를 안전하게 drain하고 다른 노드로 재배치할 수 있습니다. 하지만, Pod 하나만 존재하는 경우에는 순단(서비스 중단)이 발생할 수 있습니다.


3. Pod 하나일 경우 순단 발생 문제

Pod가 하나만 있는 경우, Spot Instance 종료 시 해당 Pod가 다른 노드로 재배치되기 전에 서비스가 중단될 수 있습니다. 이를 순단이라고 하며, 특히 단일 Pod로 운영되는 서비스는 Spot Instance 종료 이벤트에 의해 서비스가 일시적으로 멈출 수 있습니다.

이를 방지하려면 다중 인스턴스로 구성하거나, 중복 배치를 통해 서비스를 유지할 수 있어야 합니다.


4. Pod Drain 후 즉시 다른 노드로 Scheduling하는 방법

AWS Spot Termination 이벤트 발생 시, Node Termination Handler를 사용하여 노드가 종료되기 전에 Pod를 drain 처리하고 Argo Rollout을 통해 다른 노드에 재배치할 수 있습니다. 그러나 Pod가 하나만 있을 경우, 이 재배치 사이에 서비스 중단이 발생할 수 있으므로 고급 배포 전략을 통해 이를 해결해야 합니다.


5. Pod 하나일 경우 순단 방지하는 구체적인 방법

Pod 하나만 존재할 때 순단을 방지하는 방법은 크게 두 가지입니다.

5.1 다중 복제본 구성

Pod의 복제본(replica)을 여러 개로 설정하면, 한 개의 Pod가 종료되더라도 나머지 Pod가 계속 서비스 중일 수 있습니다. Kubernetes의 Horizontal Pod Autoscaler(HPA)나 Argo Rollout의 replica 설정을 통해 여러 Pod 인스턴스를 관리할 수 있습니다.

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: my-app-rollout
spec:
  replicas: 2  # 최소 2개 이상의 복제본을 설정
  strategy:
    canary:
      steps:
      - setWeight: 50
      - pause: {duration: 10s}
      - setWeight: 100

이 설정은 복제본을 2개로 설정하여, Spot Instance 종료 이벤트가 발생해도 최소 하나의 Pod는 계속 실행될 수 있게 합니다.

5.2 블루-그린 배포 전략 사용

블루-그린 배포(Blue-Green Deployment)는 Argo Rollout에서 지원하는 배포 전략 중 하나로, 두 개의 Pod 그룹을 동시에 운영하고 트래픽을 전환하여 무중단 배포를 가능하게 합니다. 이렇게 설정하면 하나의 Pod 그룹이 종료되더라도 다른 그룹에서 트래픽을 처리할 수 있습니다.

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: my-app-rollout
spec:
  replicas: 1
  strategy:
    blueGreen:
      activeService: my-app-active
      previewService: my-app-preview
      autoPromotionEnabled: true

이 설정은 blue-green 배포 전략을 통해 무중단 배포를 구현합니다. Spot Instance가 중단될 때, 블루-그린 배포 전략을 사용하면 트래픽이 다른 서비스로 자동 전환되므로 순단 없이 서비스를 유지할 수 있습니다.

5.3 Spot Instance와 온디맨드 인스턴스 혼합 사용

온디맨드 인스턴스와 Spot Instance를 혼합하여 사용하면, Spot Instance가 중단될 경우에도 온디맨드 인스턴스에서 서비스가 계속 유지됩니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 2
  template:
    spec:
      nodeSelector:
        spot: "true"  # Spot 인스턴스에서 실행
      tolerations:
      - key: "node.kubernetes.io/lifecycle"
        operator: "Equal"
        value: "spot"
        effect: "NoExecute"

이 방법을 사용하면 Spot Instance에서 중단이 발생하더라도 온디맨드 인스턴스에서 서비스가 계속 동작하기 때문에 순단을 방지할 수 있습니다.


6. 구체적인 사례

아래는 Spot Instance 중단 이벤트 발생 시, 다중 복제본을 사용하여 순단을 방지하고, Argo Rollout과 Node Termination Handler가 이를 자동으로 처리하는 예시입니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  containers:
    - name: my-app-container
      image: my-app:latest
      resources:
        requests:
          memory: "256Mi"
          cpu: "500m"
        limits:
          memory: "512Mi"
          cpu: "1000m"
  nodeSelector:
    lifecycle: spot
  tolerations:
    - key: "node.kubernetes.io/lifecycle"
      operator: "Equal"
      value: "spot"
      effect: "NoExecute"
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: my-app-rollout
spec:
  replicas: 2  # 복제본을 2개로 설정하여 순단 방지
  strategy:
    canary:
      steps:
      - setWeight: 50
      - pause: {duration: 10s}
      - setWeight: 100

이 설정은 복제본 2개를 사용하여, Spot Instance 종료 시에도 다른 노드에서 Pod가 계속 실행되므로 서비스 순단이 발생하지 않습니다.

태그

  • Argo Rollout
  • AWS Spot Termination Event
  • Kubernetes
  • Pod 순단 방지
  • Pod Drain
  • Node Scheduling
  • Spot Instance
  • 무중단 배포
728x90

댓글