disruption:
# 노드가 비어 있을 때 통합(제거)
consolidationPolicy: WhenEmpty
# 노드가 비어 있은 후 통합(제거)까지의 시간
consolidateAfter: 30s
# 노드 생성 후 제거하기까지의 최대 시간
expireAfter: 720h # 30일
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: default
spec:
# 서브넷 선택
subnetSelector:
karpenter.sh/discovery: "true"
# 보안 그룹 선택
securityGroupSelector:
karpenter.sh/discovery: "true"
# 인스턴스 태그
tags:
karpenter.sh/discovery: "true"
environment: production
# 블록 디바이스 매핑
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 100Gi
volumeType: gp3
deleteOnTermination: true
encrypted: true
# 세부 인스턴스 구성
instanceProfile: KarpenterNodeInstanceProfile
amiFamily: AL2
userData: |
#!/bin/bash
echo "Hello from Karpenter node!"
# 메타데이터 옵션
metadataOptions:
httpEndpoint: enabled
httpProtocolIPv6: disabled
httpPutResponseHopLimit: 2
httpTokens: required
# 서브넷 선택
subnetSelector:
karpenter.sh/discovery: "true"
Name: "private-*"
# 보안 그룹 선택
securityGroupSelector:
karpenter.sh/discovery: "true"
aws:eks:cluster-name: "my-cluster"
# Amazon Linux 2
amiFamily: AL2
# Bottlerocket
amiFamily: Bottlerocket
# Ubuntu
amiFamily: Ubuntu
# 사용자 정의 AMI
amiSelector:
aws:ec2:image:id: "ami-0123456789abcdef0"
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: optimized
spec:
# 다양한 인스턴스 유형 허용
template:
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: [
"m5.large", "m5.xlarge", "m5.2xlarge",
"c5.large", "c5.xlarge", "c5.2xlarge",
"r5.large", "r5.xlarge", "r5.2xlarge"
]
nodeClassRef:
name: optimized
# 적절한 TTL 설정
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 720h # 30일
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: cost-optimized
spec:
# 스팟 인스턴스 사용
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot"]
nodeClassRef:
name: cost-optimized
# 제로 스케일링 및 노드 만료 설정
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 168h # 7일
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: high-availability
spec:
# 다중 가용 영역 사용
template:
spec:
requirements:
- key: topology.kubernetes.io/zone
operator: In
values: ["us-west-2a", "us-west-2b", "us-west-2c"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand", "spot"]
nodeClassRef:
name: high-availability
# 인터럽션 처리 최적화
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 60s
ttlSecondsUntilExpired: 2592000 # 30일
# 노드 통합 설정
consolidation:
enabled: true
# Karpenter 로그 확인
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -c controller
# 프로비저너 상태 확인
kubectl describe provisioner <name>
# 파드 이벤트 확인
kubectl describe pod <name>
# 노드 상태 확인
kubectl describe node <name>
# 노드 레이블 확인
kubectl get node <name> --show-labels
# Karpenter 로그 확인
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -c controller | grep "node termination"
# 프로비저너 요구 사항 확인
kubectl get provisioner <name> -o yaml
# 파드 리소스 요청 확인
kubectl describe pod <name>
# 노드 정보 확인
kubectl describe node <name>
# Karpenter 버전 확인
kubectl get deployment -n karpenter karpenter -o jsonpath="{.spec.template.spec.containers[0].image}"
# Karpenter 로그 확인
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -c controller
# 프로비저너 목록 확인
kubectl get provisioners
# 노드 템플릿 목록 확인
kubectl get awsnodetemplates
# 이벤트 확인
kubectl get events --sort-by='.lastTimestamp'
# 디버그 로그 활성화
kubectl patch configmap -n karpenter karpenter-global-settings --type merge -p '{"data":{"logLevel":"debug"}}'