메인 콘텐츠로 건너뛰기
page thumbnail

AWS EKS에서 Karpenter와 Spot 인스턴스 인터럽션 처리 이해하기

설탕사과
설탕사과
조회수 21
요약

AWS EKS에서 Karpenter와 Spot 인스턴스 인터럽션 처리 이해하기 image 1

EC2 Spot 인스턴스란?

AWS EC2 Spot 인스턴스는 AWS가 남는 컴퓨팅 자원을 할인된 가격에 임시로 제공하는 서비스입니다. 수요에 따라 인스턴스가 예고 없이 종료될 수 있기 때문에, 비용은 저렴하지만 작업 중단을 감수해야 합니다.

Karpenter의 역할과 장점

Karpenter는 AWS에서 제공하는 오픈소스 Kubernetes 오토스케일러입니다. 클러스터의 상태와 워크로드를 분석해서 필요한 만큼 노드를 자동으로 생성하고 오토스케일링합니다. Spot 인스턴스와 온디맨드 인스턴스를 모두 사용할 수 있어, 자원을 효율적이면서도 경제적으로 운영할 수 있습니다.

Spot 인스턴스 종료 지연 문제

Spot 인스턴스가 종료될 때, 영속적인 볼륨을 사용하는 파드들은 볼륨이 제대로 분리되지 않아 재시작에 6분 이상 지연이 생길 수 있습니다. 이는 데이터 손상을 막기 위한 Kubernetes 컨트롤러의 안전장치 때문입니다.

Karpenter 인터럽션 처리 기능

Karpenter는 인터럽션 상황을 미리 감지하고 대응하는 기능을 가지고 있습니다. 노드를 미리 cordon, drain한 뒤 종료해주어, 파드가 안전하게 이전되고 데이터 손실 위험을 줄여줍니다. 이를 통해 예상치 못한 Spot 인스턴스 종료에도 서비스 안정성이 향상됩니다.

Karpenter가 다루는 주요 인터럽션 이벤트

Karpenter는 다음 네 가지 이벤트에 대해 인터럽션 대응을 합니다.

  • Spot 인스턴스 중단 알림: AWS가 2분 전에 제공하는 종료 예고

  • 정기 유지보수 알림(AWS Health Event)

  • EC2 인스턴스 종료/정지 상태 변경 알림

  • Spot 인스턴스 리밸런스 추천: 종료 위험이 감지될 때 미리 알림

인터럽션 이벤트 처리 아키텍처

Amazon EventBridge가 인터럽션 이벤트를 감지해 Amazon SQS 큐로 메시지를 전달합니다. Karpenter는 이 큐를 구독하여 이벤트를 실시간으로 받아, 노드 대피 및 새 노드 프로비저닝을 자동으로 실행합니다.

SQS 큐와 EventBridge 설정 예시

아래 코드처럼 SQS 큐에 대한 권한과 EventBridge 룰을 설정합니다.

// SQS 큐 정책 예시
statement {
  sid = SqsWrite
  actions = [sqs:SendMessage]
  resources = [ARN_OF_THE_SQS_QUEUE]
  principals {
    type = Service
    identifiers = [
      events.amazonaws.com,
      sqs.amazonaws.com,
    ]
  }
}
statement {
  sid = DenyHTTP
  effect = Deny
  actions = [sqs:*]
  resources = [ARN_OF_THE_SQS_QUEUE]
  condition {
    test = StringEquals
    variable = aws:SecureTransport
    values = [false]
  }
  principals {
    type = *
    identifiers = [*]
  }
}
// EventBridge 룰 이벤트 패턴 예시
{ detail-type: [EC2 Spot Instance Interruption Warning], source: [aws.ec2]}
{ detail-type: [AWS Health Event], source: [aws.health]}
{ detail-type: [EC2 Instance State-change Notification], source: [aws.ec2]}
{ detail-type: [EC2 Instance Rebalance Recommendation], source: [aws.ec2]}

Karpenter 권한 및 관계 설정

Karpenter가 SQS 큐에서 메시지를 안전하게 처리할 수 있도록 아래와 같이 IAM 정책을 설정합니다.

statement {
  sid = AllowInterruptionQueueActions
  actions = [
    sqs:DeleteMessage,
    sqs:GetQueueAttributes,
    sqs:GetQueueUrl,
    sqs:ReceiveMessage
  ]
  resources = [ARN_OF_THE_SQS_QUEUE]
  effect = Allow
}

실무에서의 Tips

Spot 인스턴스를 대규모로 운영할 때는 2분 내에 모든 작업을 마치기 힘들 수 있습니다. 가장 중요한 것은 인터럽션 대응을 미리 설계하여, 서비스 중단 없이 리소스를 효과적으로 관리하는 것입니다. Karpenter를 이용하면 이런 처리를 자동화할 수 있어 운영 부담이 크게 줄어듭니다.