[Kubernetes] Cluster Autoscaler에서 Karpenter로 마이그레이션: 언제, 어떻게 전환할까요?
안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 Kubernetes(쿠버네티스) 환경에서 노드 오토스케일링(Auto Scaling)을 고민하는 분들을 위한 이야기를 해볼까 합니다. 특히 EKS (Amazon Elastic Kubernetes Service)를 운영하면서 Cluster Autoscaler (CA)의 한계를 느끼고 Karpenter로의 마이그레이션을 고민하는 분들이라면, 제가 직접 겪었던 경험과 삽질 끝에 얻은 노하우가 도움이 될 거예요.
클라우드 환경에서 Kubernetes 클러스터를 운영하다 보면, 워크로드(Workload)의 변화에 따라 노드를 유연하게 늘리고 줄이는 것이 정말 중요합니다. 비용 최적화는 물론이고, 서비스 안정성에도 직결되거든요. 처음에는 Cluster Autoscaler(클러스터 오토스케일러)가 만능인 줄 알았는데, 막상 써보니 아쉬운 점들이 꽤 있더라고요. 특히 급작스러운 트래픽 증가나 스팟 인스턴스(Spot Instance) 활용 시 Karpenter가 보여주는 퍼포먼스는 저를 깜짝 놀라게 했습니다.
오늘은 Cluster Autoscaler에서 Karpenter로의 전환을 언제 고려해야 하는지, 그리고 실제 전환은 어떻게 진행해야 하는지에 대한 저만의 결정 기준과 전략을 솔직하게 공유해 드릴게요. 삽질 과정도 가감 없이 보여드릴 테니, 함께 살펴보시죠!
Karpenter가 도입된 Kubernetes 클러스터의 노드 오토스케일링 아키텍처 개요도
Cluster Autoscaler와 Karpenter: 핵심 개념 차이
본격적인 마이그레이션 이야기를 하기 전에, 두 오토스케일링 도구가 어떻게 다른지 간단히 짚고 넘어갈게요. 쉽게 말해 접근 방식 자체가 다릅니다.
Cluster Autoscaler (CA): 그룹 기반 오토스케일링
- 작동 방식: Cluster Autoscaler는 AWS Auto Scaling Group (ASG)을 기반으로 작동합니다. 즉, 미리 정의된 ASG의 최소/최대 인스턴스 개수 범위 내에서 노드를 추가하거나 줄이죠.
- 장점: 비교적 설정이 간단하고, 오랫동안 사용되어 안정성이 검증되었습니다. 기존 EC2 인스턴스 관리 방식에 익숙하다면 접근하기 쉽습니다.
- 단점:
- 느린 스케일 아웃(Scale Out) 속도: ASG가 새 인스턴스를 프로비저닝(Provisioning)하는 데 시간이 걸립니다. 워크로드 요청이 급증할 때 노드 부족 현상이 생길 수 있어요.
- 비효율적인 리소스 활용: 특정 파드(Pod)에 필요한 리소스 타입을 정확히 맞추기 어렵습니다. ASG는 특정 인스턴스 타입이나 몇 가지 인스턴스 타입 묶음으로 구성되니까요. 이 때문에 kube-scheduler (쿠베 스케줄러)가 파드를 노드에 배치하지 못하는 ‘스케줄링 불가(unschedulable)’ 상태가 발생할 수 있습니다.
- 스팟 인스턴스 활용 제약: 스팟 인스턴스를 활용하더라도, ASG의 인스턴스 풀(Pool)이 제한적이라 유연성이 떨어집니다.
Karpenter: 파드 기반 오토스케일링
- 작동 방식: Karpenter는 스케줄링되지 않은 파드를 직접 감지하고, 해당 파드에 가장 적합한 EC2 인스턴스를 직접 프로비저닝합니다. ASG를 거치지 않고 EC2 RunInstances API를 직접 호출해서 노드를 띄우는 거죠.
- 장점:
- 압도적인 스케일 아웃 속도: 필요한 노드를 거의 실시간으로 생성하기 때문에 워크로드 변화에 매우 빠르게 대응합니다. 제가 직접 써보니 CA보다 훨씬 빨랐습니다.
- 최적의 리소스 활용: 파드가 요구하는 CPU, 메모리, GPU 등 리소스에 맞춰 가장 효율적인 EC2 인스턴스 타입을 선택합니다. 스팟 인스턴스 활용도 극대화해서 비용 절감 효과가 커요.
- 단순한 관리: ASG를 직접 관리할 필요 없이, Karpenter의 Provisioner (프로비저너) 설정 하나로 노드 프로비저닝 정책을 관리할 수 있습니다.
- 단점:
- 초기 학습 곡선: 새로운 개념과 설정이 필요해서 처음에는 좀 낯설 수 있습니다.
- 클라우드 종속성: 현재는 AWS EKS에 특화되어 있습니다 (다른 클라우드 지원도 개발 중이지만, 현재로선 AWS가 주력입니다).
Karpenter로의 마이그레이션 결정 기준: 언제 전환해야 할까요?
제가 13년차 인프라 엔지니어로서 여러 환경을 경험해보니, 마이그레이션은 항상 신중해야 하더라고요. 무조건 좋다고 따라가는 것보다, 우리 서비스에 어떤 이점이 있을지 명확히 파악하는 게 중요합니다. 다음 질문들에 해당한다면 Karpenter로의 전환을 적극적으로 고려해볼 때입니다.
- 잦은 스케일링 이벤트와 느린 노드 확장 속도에 불만이 있다:
특히 이벤트 기반(Event-driven) 서비스나 예측 불가능한 트래픽 패턴을 가진 서비스라면 CA의 스케일 아웃 속도가 병목이 될 수 있습니다. "파드가 Pending(대기) 상태인데 노드가 왜 이렇게 늦게 뜨지?" 라는 질문을 자주 하셨다면 Karpenter가 답이 될 수 있습니다.
- 클라우드 비용 최적화가 시급하다:
CA는 ASG가 정해준 인스턴스 타입 내에서만 노드를 띄우다 보니, 파드의 리소스 요구사항과 정확히 일치하는 인스턴스를 찾기 어렵습니다. Karpenter는 파드에 딱 맞는 최적의 인스턴스를 찾아 스팟 인스턴스까지 적극적으로 활용하기 때문에, 불필요한 리소스 낭비를 줄여줍니다. 저희 홈랩에서도 스팟 인스턴스 활용률이 훨씬 높아지면서 비용이 꽤 절감됐습니다.
- 노드 타입 관리가 복잡하다고 느낀다:
CA를 사용하면 다양한 워크로드를 위해 여러 ASG를 만들고 관리해야 할 때가 많습니다. Karpenter는 Provisioner (프로비저너) 하나로 다양한 인스턴스 타입을 유연하게 관리할 수 있어 운영 부담이 줄어듭니다.
- 특정 리소스(GPU, 고성능 CPU 등) 요구사항이 있는 파드가 많다:
머신러닝(Machine Learning) 워크로드처럼 특정 GPU나 고성능 CPU를 요구하는 파드들이 있다면, Karpenter가 해당 파드에 맞는 노드를 즉시 프로비저닝해서 스케줄링 효율을 극대화할 수 있습니다.
Karpenter로의 전환 전략: 실전 구현
이제 Karpenter로 마이그레이션하는 실제 과정을 단계별로 살펴보겠습니다. 저는 EKS 환경을 기준으로 설명드릴게요.
단계 1: Karpenter 설치 및 IAM 권한 설정
Karpenter는 AWS API를 직접 호출해서 EC2 인스턴스를 생성하고 관리해야 하므로, 적절한 IAM(Identity and Access Management) 권한이 필수입니다. 공식 문서에 따라 IAM Role과 Service Account를 생성하고, Karpenter 컨트롤러를 설치합니다. 이 부분은 공식 문서가 워낙 잘 되어 있어서 그대로 따라가시면 됩니다. 핵심은 Karpenter가 EC2, IAM, SSM 등의 리소스에 접근할 수 있는 권한을 부여하는 것입니다.
설치 후에는 Karpenter Controller Pod가 잘 뜨는지 확인해야 합니다.
kubectl get pods -n karpenter
# 예시 출력:
# NAME READY STATUS RESTARTS AGE
# karpenter-controller-xxxxx 1/1 Running 0 5m
단계 2: Provisioner 설정
Karpenter의 핵심은 바로 Provisioner 리소스입니다. 어떤 종류의 노드를, 어떤 조건으로 생성할지 여기에 정의합니다. 처음에는 너무 복잡하게 생각하지 마시고, 가장 기본적인 설정으로 시작하는 것을 추천합니다.

Karpenter Provisioner YAML 설정 예시와 주요 파라미터 설명
apiVersion: karpenter.sh/v1beta1
kind: Provisioner
metadata:
name: default
spec:
# Karpenter가 사용할 AMI Family를 정의합니다. EKS 최신 Optimized AMI를 사용하세요.
# (예: AL2, AL2023, Bottlerocket, Ubuntu)
# Karpenter는 여기에 지정된 AMI Family의 최신 EKS Optimized AMI를 자동으로 선택합니다.
# official EKS AMIs: https://docs.aws.amazon.com/eks/latest/userguide/retrieve-ami-id.html
amiFamily: AL2 # Amazon Linux 2 (EKS Optimized AMI) 또는 AL2023
# 인스턴스 프로비저닝에 대한 요구사항을 정의합니다.
# 여기서는 amd64 아키텍처의 온디맨드 또는 스팟 인스턴스를 사용하도록 설정했습니다.
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand", "spot"] # 스팟 인스턴스 활용을 적극 권장합니다!
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m", "r"] # 컴퓨팅, 메모리, 범용 인스턴스 카테고리
- key: karpenter.k8s.aws/instance-family
operator: In
values: ["c5", "c6i", "m5", "m6i", "r5", "r6i"] # 자주 사용하는 인스턴스 패밀리
- key: karpenter.k8s.aws/instance-size
operator: NotIn
values: ["nano", "micro"] # 너무 작은 인스턴스는 제외
# 노드가 어떤 서브넷(Subnet)에 생성될지 태그(Tag)로 정의합니다.
# EKS 클러스터가 사용하는 서브넷 태그와 일치해야 합니다.
subnetSelector:
karpenter.sh/discovery: "your-eks-cluster-name" # EKS 클러스터 이름으로 교체
# 노드가 어떤 보안 그룹(Security Group)을 사용할지 태그로 정의합니다.
securityGroupSelector:
karpenter.sh/discovery: "your-eks-cluster-name" # EKS 클러스터 이름으로 교체
# 노드에 적용될 테인츠(Taints)를 정의합니다.
# 여기에 테인트가 있으면, 해당 테인트를 허용하는 파드만 스케줄링됩니다.
# - key: my-app
# effect: NoSchedule
# 노드 템플릿입니다. SSH 키페어, IAM 인스턴스 프로파일 등을 지정할 수 있습니다.
providerRef:
name: default
# 노드 삭제 정책 (consolidation).
# 기본적으로 파드가 없거나, 더 효율적인 노드로 대체될 수 있으면 노드를 삭제합니다.
consolidation:
enabled: true
# consolidateAfter: 5m # 노드 생성 후 최소 5분은 유지 (선택 사항)
# 노드 TTL(Time To Live) 설정. 노드가 일정 시간 동안 유휴 상태이거나
# 최대 수명을 넘으면 삭제됩니다.
ttlSecondsAfterEmpty: 300 # 노드에 파드가 없으면 300초(5분) 후 삭제
ttlSecondsUntilExpired: 604800 # 노드는 최대 7일(604800초)까지만 유지 (수명 관리)
---
apiVersion: karpenter.k8s.aws/v1beta1
kind: AWSNodeTemplate
metadata:
name: default
spec:
# Karpenter가 사용할 IAM 인스턴스 프로파일을 지정합니다.
# EKS 노드에 필요한 권한이 포함된 프로파일이어야 합니다.
# 보통 `eksctl create iamserviceaccount` 등으로 생성됩니다.
instanceProfile: "KarpenterNodeInstanceProfile-your-cluster-name" # 실제 프로파일 이름으로 교체
# SSH 키페어를 지정하여 노드에 SSH 접속이 가능하도록 합니다. (선택 사항)
# sshName: your-ssh-key-name
# 노드에 추가적인 태그를 붙일 수 있습니다.
tags:
environment: production
managed-by: karpenter
karpenter.sh/cluster-name: "your-eks-cluster-name" # 클러스터 이름으로 교체
위 YAML을 적용하면 Karpenter가 이제 파드를 감지하고 노드를 프로비저닝할 준비가 됩니다. 여기서 중요한 포인트는 requirements 섹션입니다. 어떤 인스턴스 타입을 사용할지, 스팟(Spot)을 쓸지 온디맨드(On-Demand)를 쓸지 등 Karpenter의 동작 방식을 결정하는 핵심 설정입니다. 저는 스팟 인스턴스를 적극적으로 활용해서 비용을 절감하는 방향으로 설정했습니다.
단계 3: Cluster Autoscaler (CA) 노드 그룹 점진적 비활성화
Karpenter가 잘 작동하는지 확인하면서, 기존 CA가 관리하던 노드 그룹(ASG)을 점진적으로 스케일 다운(Scale Down)해야 합니다. 한 번에 모든 노드 그룹을 비활성화하면 서비스 중단 위험이 있으니, 워밍업(Warm-up) 기간을 두는 것이 좋습니다.
- 새로운 파드를 배포하거나 기존 파드를 재시작하여 Karpenter가 새 노드를 잘 띄우는지 관찰합니다.
- Karpenter가 프로비저닝한 노드가 충분히 확보되었다고 판단되면, CA가 관리하는 ASG의 desired capacity를 0으로 설정합니다.
- ASG의 최소/최대 인스턴스 수도 0으로 설정하여 CA가 더 이상 노드를 관리하지 않도록 합니다.
# EKS 노드 그룹 목록 확인 (eksctl 사용 예시)
eksctl get nodegroup --cluster your-eks-cluster-name
# 특정 노드 그룹의 desired capacity를 0으로 설정
# (eksctl 명령은 ASG도 함께 조정합니다)
eksctl scale nodegroup --cluster your-eks-cluster-name --name your-nodegroup-name --nodes 0 --nodes-min 0 --nodes-max 0
# 또는 AWS CLI로 ASG 직접 수정 (ASG 이름 확인 필요)
# aws autoscaling update-auto-scaling-group --auto-scaling-group-name your-asg-name --desired-capacity 0 --min-size 0 --max-size 0
이렇게 하면 CA가 관리하던 노드들은 서서히 드레인(Drain)되고 종료되며, Karpenter가 그 역할을 완전히 넘겨받게 됩니다. 이 과정에서 파드들이 새로운 Karpenter 노드로 잘 재스케줄링되는지 꼼꼼히 확인해야 합니다.
주의사항 및 트러블슈팅: 삽질 경험
제가 Karpenter를 도입하면서 겪었던 몇 가지 삽질 경험과 주의사항을 공유합니다. 이걸 미리 아셨다면 여러분은 저보다 훨씬 적게 고생하실 거예요. 😅
- ⚠️ IAM 권한은 정말 중요합니다!
Karpenter가 EC2 인스턴스를 직접 다루기 때문에 IAM 권한이 조금만 잘못되어도 노드가 뜨지 않습니다. 특히
ec2:RunInstances,ec2:TerminateInstances,iam:PassRole등의 권한이 제대로 부여되었는지 반드시 확인하세요. 저는iam:PassRole을 빼먹어서 한참 헤맸습니다. Karpenter Controller 로그를 확인하면 어떤 권한이 부족한지 명확하게 나옵니다.# Karpenter Controller 로그 확인 kubectl logs -f -n karpenter $(kubectl get pods -n karpenter -l app.kubernetes.io/name=karpenter -o name) - Pod Disruption Budget (PDB) 고려:
Karpenter는 노드 통합(Consolidation) 기능을 통해 불필요한 노드를 효율적으로 제거합니다. 이때 PDB (Pod Disruption Budget)가 설정된 파드들은 Karpenter의 노드 종료 작업을 방해할 수 있습니다. PDB가 너무 엄격하면 Karpenter가 노드를 줄이지 못하고 비용이 낭비될 수 있으니, 워크로드의 특성에 맞춰 PDB를 적절히 설정해야 합니다.
- Initial Scale-up Delay (초기 스케일업 지연) 착시:
Karpenter는 ASG를 사용하지 않고 바로 EC2 인스턴스를 띄우기 때문에, 처음 노드가 올라올 때까지의 시간이 CA보다 오히려 길게 느껴질 수 있습니다. 하지만 이는 인스턴스 부팅 및 EKS 클러스터 조인(Join) 과정이 포함되기 때문이고, 실제 “스케줄링되지 않은 파드”를 “노드에 할당”하는 과정은 훨씬 빠릅니다. 이 차이를 이해하고 인내심을 가져야 합니다. 🙂
- Spot Instance Interruptions (스팟 인스턴스 중단) 대비:
Karpenter는 스팟 인스턴스를 적극 활용하여 비용을 절감하지만, 스팟 인스턴스는 언제든지 AWS에 의해 중단될 수 있습니다. 중요한 스테이트풀(Stateful) 워크로드에는 스팟 인스턴스를 사용하지 않거나, 중단에 강한 아키텍처(예: 분산 시스템, 재시작 가능한 작업)를 구성하는 것이 중요합니다.
검증 및 결과 확인
Karpenter 마이그레이션이 성공적으로 이루어졌는지 확인하는 방법은 다음과 같습니다.
- 노드 상태 확인:
kubectl get nodes명령으로 노드가 잘 뜨고 준비(Ready) 상태인지 확인합니다. Karpenter가 띄운 노드에는 특정 레이블(Label)이나 태그가 붙어있으니 쉽게 구분할 수 있습니다.kubectl get nodes -l karpenter.sh/provisioner-name=default # 예시 출력: # NAME STATUS ROLES AGE VERSION # ip-10-0-x-x.ap-northeast-2.compute.internal Ready <none> 5m v1.28.x - 파드 스케줄링 확인: 새로운 파드를 배포하거나, 기존 파드의 리소스 요청을 늘려서 Karpenter가 노드를 빠르게 프로비저닝하고 파드를 스케줄링하는지 확인합니다.
- Karpenter Provisioner 상태 확인:
kubectl describe provisioner default # 이 명령을 통해 Karpenter가 어떤 노드를 프로비저닝하고 있는지, # 그리고 어떤 이벤트가 발생했는지 상세히 볼 수 있습니다. - AWS EC2 콘솔 확인: EC2 콘솔에서 인스턴스가 Karpenter에 의해 생성되고 종료되는 것을 직접 관찰합니다. 태그를 통해 Karpenter가 관리하는 인스턴스인지 쉽게 알 수 있습니다.
- 비용 모니터링: AWS Cost Explorer를 통해 마이그레이션 전후의 비용 변화를 모니터링합니다. 특히 스팟 인스턴스 활용률이 높아지면서 비용이 얼마나 절감되었는지 확인하는 것이 중요합니다.

Karpenter 도입 후 EKS 클러스터의 노드 및 파드 스케일링 성능 대시보드
Cluster Autoscaler vs. Karpenter: 비교 및 선택 기준
제가 경험한 바를 바탕으로 두 오토스케일러의 핵심 차이점을 표로 정리해봤습니다. 어떤 상황에서 어떤 도구가 더 유리한지 판단하는 데 도움이 될 거예요.
| 구분 | Cluster Autoscaler (CA) | Karpenter |
|---|---|---|
| 작동 방식 | Auto Scaling Group (ASG) 기반 | 스케줄링되지 않은 파드 직접 감지, EC2 API 호출 |
| 노드 프로비저닝 속도 | 상대적으로 느림 (ASG의 인스턴스 생성 시간) | 매우 빠름 (파드 요구사항에 맞춰 즉시 생성) |
| 리소스 효율성 | ASG 인스턴스 타입 내에서 선택, 비효율 가능성 | 파드 요구사항에 가장 적합한 인스턴스 선택, 높은 효율성 |
| 비용 최적화 | ASG 설정에 의존, 스팟 활용 제한적 | 스팟 인스턴스 적극 활용, 비용 절감 효과 큼 |
| 관리 복잡성 | 여러 ASG 관리 필요 | Provisioner 리소스 하나로 관리, 단순함 |
| 주요 사용 사례 | 워크로드 변동이 적고 안정적인 환경, 온디맨드 위주 | 잦은 스케일링, 비용 최적화, 스팟 인스턴스 적극 활용 환경 |
| 트러블슈팅 난이도 | ASG 문제, CA 로그 | Karpenter Controller 로그, IAM 권한, Provisioner 설정 |

Kubernetes Cluster Autoscaler와 Karpenter의 주요 특징 및 마이그레이션 결정 기준 비교
마무리하며: 더 나은 클러스터 운영을 위한 선택
Cluster Autoscaler에서 Karpenter로의 마이그레이션은 단순히 도구를 바꾸는 것을 넘어, Kubernetes 클러스터의 리소스 관리 효율성과 비용 최적화를 한 단계 끌어올리는 중요한 결정입니다. 제가 직접 경험해보니, 특히 워크로드 변동성이 크고 스팟 인스턴스 활용을 통해 비용을 절감하고자 하는 환경이라면 Karpenter가 단연코 훌륭한 선택지였습니다.
물론 새로운 도구를 도입하는 데는 초기 설정과 학습 비용이 따릅니다. 하지만 Karpenter가 제공하는 유연성과 효율성을 고려하면 충분히 투자할 가치가 있다고 생각합니다. 이 글이 여러분의 Karpenter 마이그레이션 여정에 작은 등불이 되었기를 바랍니다. 혹시 더 궁금한 점이나 제가 겪지 못했던 다른 삽질 경험이 있다면 댓글로 공유해주세요. 함께 배우고 성장하는 것이 인프라 엔지니어의 숙명이 아니겠습니까! 다음번에는 Karpenter의 고급 기능이나 다른 클라우드 환경에서의 활용 방안에 대해서도 이야기해볼 수 있으면 좋겠네요. 🎉
![[k8s] Cluster Autoscaler에서 Karpenter로 마이그레이션 결정 기준 및 전환 전략](https://blog.pswq.net/wp-content/uploads/2026/09/cluster-autoscaler-karpenter-migration-strategy-thumbnail.jpg)
![[Cloud] FinOps 클라우드 비용 관리 베스트 프랙티스 체크리스트 10가지](https://blog.pswq.net/wp-content/uploads/2026/06/finops-cloud-cost-management-checklist-thumbnail.jpg)



