EKS Auto Mode 디버깅
2026-04-07 작성2026-06-30 수정7분 읽기
EKS Auto Mode는 노드 프로비저닝, 네트워킹, 스토리지를 AWS가 완전 관리하는 운영 모델입니다. 편리하지만, 관리 영역이 줄어든 만큼 디버깅 접근 방식도 달라집니다.
Auto Mode vs Standard Mode 차이점
| 항목 | Standard Mode | Auto Mode | 디버깅 영향 |
|---|---|---|---|
| 노드 관리 | 사용자 (MNG/Karpenter) | AWS 관리 (NodePool) | NodePool CRD로 상태 확인, EC2 API 제한적 |
| VPC CNI | 수동 설정/업그레이드 | 자동 관리 | Custom CNI 설정 불가, ENI 디버깅 간소화 |
| GPU Driver | GPU Operator 설치 | AWS 관리 | Device Plugin 충돌 주의 (devicePlugin=false) |
| 스토리지 | EBS CSI 별도 설치 | 내장 드라이버 (gp3) | io2 Block Express 제약, EFS는 별도 설치 |
| CoreDNS | Add-on 관리 | 자동 관리 | Custom CoreDNS 설정 제한 |
| 노드 SSH | 가능 (MNG/Karpenter) | 제한적 (AWS Systems Manager) | kubectl debug node 사용 필수 |
| Auto Scaling | Karpenter/CA | NodePool auto-scaling | Spot 중단 처리 자동화 |
| 네트워크 정책 | Calico/Cilium 설치 가능 | VPC CNI Network Policy | 기능 제약 존재 |
NodePool 아키텍처
Auto Mode의 노드 라이프사이클:
NodePool 디버깅
NodePool 상태 확인
# NodePool 목록
kubectl get nodepools
# 출력 예시
# NAME READY AGE
# default True 7d
# gpu-nodepool True 2d
# NodePool 상세 정보
kubectl describe nodepool default
# 주요 확인 항목:
# - Conditions: Ready, CapacityAvailable
# - Instance Types: 허용된 인스턴스 타입
# - Constraints: 레이블, 테인트, 가용 영역
NodeClaim 라이프사이클
# NodeClaim 목록 (실제 노드 요청)
kubectl get nodeclaims
# 출력 예시
# NAME TYPE CAPACITY READY AGE
# default-abc123 t3.xlarge 4 True 2d
# default-def456 t3.xlarge 4 True 1d
# gpu-nodepool-xyz789 g5.2xlarge 8 True 6h
# NodeClaim 상세 정보
kubectl describe nodeclaim <nodeclaim-name>
# 주요 필드:
# - Phase: Pending/Launched/Registered/Ready/Terminating
# - Conditions: Initialized, Ready, Drifted
# - Instance ID: EC2 인스턴스 ID
# - Node Name: 대응되는 Kubernetes 노드
NodeClaim 상태 전이
인스턴스 타입 선택 실패
증상: Pod가 Pending 상태로 멈춤, NodeClaim이 생성되지 않음
# Pod 이벤트 확인
kubectl describe pod <pod-name>
# 에러 예시:
# Warning FailedScheduling No nodes available to schedule pod
# NodePool 제약 확인
kubectl get nodepool <nodepool-name> -o yaml | grep -A 10 requirements
# 일반적인 원인:
# 1. Pod 리소스 요청이 NodePool의 모든 인스턴스 타입을 초과
# 2. 가용 영역 제약 (특정 AZ에만 용량 부족)
# 3. Spot 용량 부족 (capacityType: spot)
해결 방법:
# NodePool 수정: 더 큰 인스턴스 타입 추가
apiVersion: eks.amazonaws.com/v1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values:
- t3.large
- t3.xlarge
- t3.2xlarge # ← 추가
- key: karpenter.sh/capacity-type
operator: In
values:
- spot
- on-demand # ← Spot 부족 시 On-Demand 폴백
스토리지 디버깅
Auto Mode 스토리지 제약
| 스토리지 타입 | Standard Mode | Auto Mode | 제약 사항 |
|---|---|---|---|
| gp3 | EBS CSI 설치 필요 | 내장 지원 | 기본 제공, 별도 설정 불필요 |
| gp2 | 지원 | 미지원 | gp3로 마이그레이션 필요 |
| io2 | 지원 | 제한적 지원 | io2 Block Express 미지원 |
| EFS | EFS CSI 설치 | EFS CSI 설치 필요 | 자동 지원 안 됨 |
| FSx for Lustre | FSx CSI 설치 | FSx CSI 설치 필요 | 자동 지원 안 됨 |
| EBS 암호화 | KMS 키 지정 가능 | 기본 EBS 암호화 | 커스텀 KMS 키 제약 |
PVC Pending 디버깅
# PVC 상태 확인
kubectl get pvc
# 출력 예시 (문제 발생)
# NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
# my-pvc Pending gp3 5m
# PVC 이벤트 확인
kubectl describe pvc my-pvc
# 일반적인 에러:
# 1. "waiting for a volume to be created" → 스토리지 드라이버 확인
# 2. "failed to provision volume" → IAM 권한 확인
# 3. "io2-block-express is not supported" → gp3로 변경
StorageClass 확인
# StorageClass 목록
kubectl get storageclass
# Auto Mode 기본 StorageClass
# NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
# gp3 (default) ebs.csi.aws.com Delete WaitForFirstConsumer true 7d
# io2 Block Express는 미지원 (Auto Mode 제약)
네트워킹 디버깅
VPC CNI 자동 관리
Auto Mode에서는 VPC CNI를 직접 설정할 수 없습니다:
# VPC CNI 버전 확인 (자동 관리됨)
kubectl get daemonset -n kube-system aws-node -o yaml | grep image:
# Custom CNI 설정 시도 시 에러 발생
# Auto Mode는 VPC CNI ConfigMap 수정을 차단
kubectl edit configmap -n kube-system aws-node
# Error: Auto Mode managed resource cannot be modified
제약 사항:
- ✅ 지원: ENI 자동 할당, Security Group for Pods, IPv6
- ❌ 미지원: Custom CIDR 블록, Prefix Delegation 비활성화, ENI 수동 관리
Pod 네트워크 문제
# Pod IP 할당 확인
kubectl get pods -o wide
# ENI 할당 상태 확인 (노드 레벨)
kubectl describe node <node-name> | grep -A 5 "Allocatable"
# 출력 예시:
# Allocatable:
# vpc.amazonaws.com/pod-eni: 38 # ← ENI 기반 IP 수
# Security Group for Pods 확인
kubectl get securitygrouppolicies -A
CoreDNS 디버깅
# CoreDNS Pod 상태
kubectl get pods -n kube-system -l k8s-app=kube-dns
# CoreDNS 로그 확인
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100
# DNS 해석 테스트
kubectl run -it --rm debug --image=busybox -- nslookup kubernetes.default
# 일반적인 문제:
# 1. CoreDNS Pod가 Running이 아님 → 노드 리소스 부족
# 2. DNS 쿼리 타임아웃 → Security Group에서 UDP 53 허용 확인
GPU 워크로드와 Auto Mode
GPU Operator 충돌
Auto Mode는 GPU Driver를 자동 관리합니다. GPU Operator를 설치하면 Device Plugin 충돌이 발생합니다.
하이브리드 구성 (권장)
Auto Mode에서 GPU 워크로드를 실행하려면 MNG를 추가하여 하이브리드로 구성합니다:
GPU MNG 설정
# ClusterPolicy: Device Plugin 비활성화 필수
apiVersion: nvidia.com/v1
kind: ClusterPolicy
metadata:
name: gpu-cluster-policy
spec:
operator:
defaultRuntime: containerd
driver:
enabled: true
devicePlugin:
enabled: false # ← Auto Mode와의 충돌 방지
dcgm:
enabled: true # 메트릭 수집은 가능
gfd:
enabled: true # GPU Feature Discovery 가능
nodeStatusExporter:
enabled: true
# MNG 노드에 Taint 추가 (GPU 워크로드 전용)
apiVersion: v1
kind: Node
metadata:
name: gpu-node-1
spec:
taints:
- key: nvidia.com/gpu
value: "true"
effect: NoSchedule
# GPU Pod는 Toleration 추가
apiVersion: v1
kind: Pod
metadata:
name: vllm-server
spec:
tolerations:
- key: nvidia.com/gpu
operator: Equal
value: "true"
effect: NoSchedule
containers:
- name: vllm
image: vllm/vllm-openai:latest
resources:
limits:
nvidia.com/gpu: 4
자세한 GPU 디버깅은 GPU/AI 워크로드 디버깅을 참조하세요.