Karpenter (카펜터) 요약
1. 카펜터란?
개요
- AWS 개발 오픈소스 기반 쿠버네티스 노드 오토스케일러
- 기존 Cluster Autoscaler(CA)의 한계를 극복한 차세대 오토스케일러
핵심 특징
- Group-less: ASG 없이 EC2 API 직접 호출로 즉시 프로비저닝
- 포드 중심 지능형 선택: CPU, 메모리, GPU 등 요구사항 분석 후 최적 인스턴스 결정
- 빠른 속도: 노드 준비까지 수 초 이내
- 비용 최적화(Consolidation): 포드 재배치 및 불필요 노드 즉시 반납
작동 원리
- Pending Pod 감시
- 최적 인스턴스 계산 및 결정
- EC2 인스턴스 즉시 생성 및 클러스터 조인
- 불필요 노드 자동 삭제
CA vs Karpenter 비교
비교 항목Cluster AutoscalerKarpenter
| 관리 단위 | 노드 그룹(ASG) 기반 | 개별 인스턴스 직접 관리 |
| 유연성 | 정해진 사양 내에서만 확장 | 모든 EC2 타입 중 자유 선택 |
| 속도 | 상대적으로 느림 | 매우 빠름 (Direct API 호출) |
| 비용 절감 | 소극적 (노드가 비어야 삭제) | 공격적 (포드 재배치 통합) |
2. 카펜터 설정법
1단계: 환경 변수 설정
bash
export CLUSTER_NAME="free-vpc-cluster"
export AWS_REGION="ap-northeast-2"
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
export CLUSTER_ENDPOINT=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.endpoint" --output text)
2단계: IAM 역할 및 인스턴스 프로파일 생성
- 컨트롤러용 IAM 역할에 EC2 관련 권한 직접 주입
- 노드용 IAM 역할 생성 후 필수 정책 연결
- AmazonEKSWorkerNodePolicy
- AmazonEKS_CNI_Policy
- AmazonEC2ContainerRegistryReadOnly
- AmazonSSMManagedInstanceCore
- 인스턴스 프로파일 생성 및 역할 연결
3단계: AWS 리소스 태깅 (Discovery용)
bash
# 서브넷 및 보안 그룹에 karpenter.sh/discovery 태그 부착
aws ec2 create-tags --resources $SUBNET_IDS --tags Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}
aws ec2 create-tags --resources $SG_IDS --tags Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}
4단계: Helm으로 Karpenter 설치 (v1.0.6)
bash
helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter \
--version 1.0.6 \
--namespace karpenter --create-namespace \
--set settings.clusterName=${CLUSTER_NAME} \
--set settings.clusterEndpoint=${CLUSTER_ENDPOINT} \
--set settings.interruptionQueueName=${CLUSTER_NAME} \
--wait
5단계: NodePool & EC2NodeClass 배포
- 인스턴스 타입: t3.micro, t2.micro (프리티어 최적화)
- 용량 타입: on-demand
- Consolidation 정책: WhenEmpty, 30초 후 통합
- AMI: AL2023 (al2023@latest)
6단계: EKS 노드 인증(Access Entry) 등록
bash
eksctl create iamidentitymapping \
--cluster ${CLUSTER_NAME} \
--region ${AWS_REGION} \
--arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-${CLUSTER_NAME} \
--group system:bootstrappers \
--group system:nodes \
--username system:node:{{EC2PrivateDNSName}}
7단계: 테스트
bash
kubectl create deployment karpenter-test --image=registry.k8s.io/pause:3.9
kubectl scale deployment karpenter-test --replicas=5
kubectl get nodes -w
3. 삭제
bash
# Helm 삭제
helm uninstall karpenter -n karpenter
# 관련 리소스 삭제
kubectl patch ec2nodeclass default --type merge -p '{"metadata":{"finalizers":null}}'
kubectl delete nodepool default --ignore-not-found
kubectl delete ec2nodeclass default --ignore-not-found
kubectl delete namespace karpenter
# 테스트 부하 삭제
kubectl delete deployment karpenter-test