본문으로 건너뛰기

EKS GPU 노드 전략: Auto Mode + Karpenter + Hybrid Node

1. 개요

EKS에서 GPU 워크로드를 운영할 때 노드 타입 선택은 운영 복잡도, 비용, 기능 활용도에 직접적인 영향을 미칩니다. GPU 추론과 훈련 워크로드는 일반 컨테이너 워크로드와 달리 다음과 같은 특수한 요구사항을 가집니다:

  • 드라이버 의존성: NVIDIA GPU 드라이버, Container Toolkit, Device Plugin
  • 고급 기능: MIG (Multi-Instance GPU), vGPU, Time-Slicing
  • 모니터링: DCGM (Data Center GPU Manager) 기반 메트릭
  • 스케줄링: Fractional GPU, Topology-Aware Placement, Gang Scheduling

AWS EKS는 GPU 워크로드를 위해 4가지 노드 타입을 제공합니다:

  1. EKS Auto Mode: AWS가 전체 노드 라이프사이클을 관리 (드라이버 사전 설치)
  2. Karpenter (Self-Managed): 자동 스케일링 + 사용자 정의 가능
  3. Managed Node Group: AWS 관리 노드 그룹 (제한적 자동 스케일링)
  4. Hybrid Node: 온프레미스 서버를 EKS 클러스터에 연결

핵심 원칙: 하나의 EKS 클러스터에서 여러 노드 타입을 동시에 운영할 수 있습니다. 이를 활용해 워크로드 특성에 맞는 최적의 노드 전략을 구성할 수 있습니다.

주요 목표

  • Auto Mode의 제약사항 이해 (특히 GPU Operator 불가 이유)
  • Karpenter + GPU Operator 조합의 장점
  • Run:ai, DCGM, GPU Operator 의존 관계
  • 하이브리드 아키텍처 설계 (Auto Mode + Karpenter + Hybrid Node)

2. EKS 노드 타입별 특성 비교

특성Auto ModeKarpenterManaged Node GroupHybrid Node
관리 주체AWS 완전 관리Self-Managed (사용자)AWS 관리On-Premises 관리
자동 스케일링자동 (AWS 제어)자동 (NodePool 기반)수동/제한적수동
Custom AMI불가가능가능가능
SSH 접근불가가능가능가능
GPU 드라이버사전 설치 (AWS)사용자 설치사용자 설치사용자 설치
GPU Operator 호환불가가능가능가능
Privileged DaemonSet제한적가능가능가능
Root FilesystemRead-OnlyRead-WriteRead-WriteRead-Write
SELinuxEnforcingPermissivePermissive사용자 설정
MIG 지원불가 (GPU Operator 필요)가능가능가능
DCGM Exporter수동 설치 가능GPU Operator 포함수동 설치GPU Operator 포함
Run:ai 호환불가가능가능가능
비용낮음 (관리 불필요)중간중간낮음 (Capex)
적합 워크로드단순 추론고급 GPU 기능정적 워크로드온프레미스 통합

핵심 인사이트:

  • Auto Mode: GPU 드라이버가 사전 설치되어 즉시 사용 가능하지만, GPU Operator를 설치할 수 없음
  • Karpenter: Auto Mode의 자동 스케일링 장점 + GPU Operator 설치 가능
  • Hybrid Node: 온프레미스 GPU 서버를 EKS로 통합 (GPU Operator 필수)

3. EKS Auto Mode의 GPU 지원과 제약

3.1 Auto Mode가 자동 제공하는 GPU 스택

EKS Auto Mode는 GPU 인스턴스 (p5, g6e, g5 등)에서 다음을 사전 설치합니다:

# Auto Mode GPU Node에서 자동 제공되는 컴포넌트

1. NVIDIA GPU 드라이버
- AWS가 관리하는 드라이버 버전
- /dev/nvidia* 디바이스 자동 생성

2. NVIDIA Container Toolkit
- containerd 플러그인 자동 구성
- nvidia-container-runtime 설치

3. NVIDIA Device Plugin
- kubernetes.io/nvidia-gpu 리소스 자동 등록
- GPU 디바이스 스케줄링 가능

4. GPU 리소스 등록
- Pod에서 nvidia.com/gpu: 1 요청 가능
- Topology-aware scheduling 지원

장점: Pod에서 바로 GPU 사용 가능

apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
containers:
- name: cuda-test
image: nvidia/cuda:12.2.0-runtime-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
karpenter.sh/nodepool: auto-mode-gpu # Auto Mode NodePool

3.2 Auto Mode에서 GPU Operator를 설치할 수 없는 이유

핵심: "안 하는 게 아니라 못 하는 것"

많은 사용자가 "Auto Mode에서 GPU Operator를 설치하면 되지 않나?"라고 질문합니다. 하지만 기술적으로 불가능합니다.

구조적 제약 사항

GPU Operator 동작필요 권한Auto Mode 상태결과
Driver DaemonSetHost /lib/modules 쓰기Read-Only FilesystemFAIL
Container ToolkitHost /usr/bin, /etc/containerd 쓰기Read-Only + AWS 관리FAIL
Device PluginPrivileged DaemonSet이미 AWS가 등록CONFLICT
MIG Managernvidia-smi 호스트 실행Read-Only + No SSHFAIL
DCGM ExporterGPU 디바이스 접근Partially PossiblePARTIAL

1) Read-Only Root Filesystem

# Auto Mode 노드에 접근 불가 (SSH/SSM 차단)
# 만약 접근 가능했다면 다음과 같은 상태:

$ mount | grep "/ "
/dev/nvme0n1p1 on / type ext4 (ro,relatime)
# ↑ "ro" = read-only

# GPU Operator Driver DaemonSet가 시도하는 작업:
$ nvidia-installer --kernel-module-only
ERROR: Unable to write to /lib/modules/5.15.0-1234-aws/
ERROR: Filesystem is read-only

GPU Operator의 Driver DaemonSet은 호스트 /lib/modules에 커널 모듈을 설치해야 하는데, Auto Mode는 루트 파일시스템이 Read-Only입니다.

2) SELinux Enforcing

$ getenforce
Enforcing

# GPU Operator Container Toolkit이 시도하는 작업:
$ ln -s /usr/bin/nvidia-container-toolkit /host/usr/bin/
ln: failed to create symbolic link: SELinux policy denies access

Auto Mode는 SELinux Enforcing 모드로 고정되어 GPU Operator의 호스트 파일 수정이 차단됩니다.

3) Device Plugin 이중 등록 충돌

# Auto Mode는 이미 AWS가 관리하는 Device Plugin 실행 중

$ kubectl get pods -n kube-system | grep device-plugin
nvidia-device-plugin-daemonset-aws-managed-xxxxx 1/1 Running

# GPU Operator를 설치하면:
$ helm install gpu-operator nvidia/gpu-operator

# 결과: 두 개의 Device Plugin이 동일한 리소스 등록 시도
nvidia.com/gpu (AWS)
nvidia.com/gpu (GPU Operator)

# Kubelet 에러 발생:
E0316 12:34:56.789012 kubelet.go:2345] Failed to register resource provider:
duplicate resource name "nvidia.com/gpu"

Auto Mode의 AWS 관리 Device Plugin과 GPU Operator의 Device Plugin이 동일한 리소스를 등록하려고 하면 충돌이 발생합니다.

4) No SSH / No SSM Access

# Auto Mode 노드는 SSH, SSM Session Manager 모두 차단
$ aws ssm start-session --target i-0123456789abcdef
An error occurred (TargetNotConnected): The specified target instance is not connected.

# MIG 설정, 드라이버 업그레이드, 디버깅 모두 불가
$ nvidia-smi -mig 1
ERROR: Cannot access node shell

GPU Operator의 MIG Manager는 노드 셸 접근이 필요하지만, Auto Mode는 보안상 모든 접근을 차단합니다.

3.3 "driver: false 로 설치하면?" — 그래도 안 되는 이유

일부 사용자는 다음과 같이 시도합니다:

# GPU Operator Helm Values
driver:
enabled: false # AWS가 이미 설치했으니 드라이버 스킵

toolkit:
enabled: false # Container Toolkit도 스킵

devicePlugin:
enabled: true # Device Plugin만 사용

migManager:
enabled: true # MIG 관리 활성화

dcgm:
enabled: true # 모니터링 활성화

이 방법도 실패합니다. 이유:

1) Device Plugin 이중 등록 충돌 (위와 동일)

# AWS Device Plugin vs GPU Operator Device Plugin
# 동일한 nvidia.com/gpu 리소스 등록 시도 → 충돌

2) MIG Manager 호스트 접근 불가

# MIG Manager DaemonSet이 시도하는 작업:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-mig-manager
spec:
template:
spec:
hostPID: true # 호스트 PID 네임스페이스 접근
containers:
- name: mig-manager
securityContext:
privileged: true
command:
- nvidia-smi
- -mig
- 1
volumeMounts:
- name: host-root
mountPath: /host
readOnly: false # ← 쓰기 필요

Auto Mode의 Read-Only Filesystem 때문에 MIG 설정 파일을 /etc/nvidia/mig/ 에 쓸 수 없습니다.

3) 노드 교체 시 설정 초기화

# Auto Mode는 노드를 자주 교체 (Spot, Scale-down)
# GPU Operator 설정은 영속성 없음

Node auto-mode-gpu-node-1 (RUNNING)
├── GPU Operator DaemonSet 배포
└── MIG 프로파일 설정 (메모리에만 존재)

Node auto-mode-gpu-node-1 (TERMINATED) # Auto Mode가 노드 교체
Node auto-mode-gpu-node-2 (NEW) # 새 노드: 설정 초기화됨

Auto Mode는 노드를 Stateless로 관리하므로, GPU Operator의 설정이 유지되지 않습니다.


4. Karpenter + GPU Operator: 최적의 조합

4.1 왜 Karpenter인가

Karpenter는 Auto Mode의 자동 스케일링 장점을 유지하면서, GPU Operator를 완전히 활용할 수 있습니다.

기능Auto ModeKarpenterSelf-Managed Node Group
자동 스케일링자동 (AWS 제어)자동 (NodePool 기반)수동 (ASG 기반)
GPU Operator불가가능가능
Custom AMI불가가능가능
Root FilesystemRead-OnlyRead-WriteRead-Write
MIG 지원불가가능가능
Run:ai 호환불가가능가능
Spot Instance제한적완전 지원제한적
노드 교체 속도빠름매우 빠름느림 (ASG)
비용 최적화AWS 자동사용자 제어사용자 제어

결론: Karpenter는 Auto Mode의 자동화 + Self-Managed의 유연성을 모두 제공합니다.

4.2 Karpenter GPU NodePool 설정

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-inference
namespace: karpenter
spec:
# 노드 템플릿
template:
metadata:
labels:
node-type: gpu-inference
gpu-operator: enabled
workload: llm-inference
spec:
# 인스턴스 타입 제약
requirements:
# GPU 인스턴스 타입
- key: node.kubernetes.io/instance-type
operator: In
values:
- p5.48xlarge # H100 x8 (640GB HBM3)
- g6e.12xlarge # L40S x4 (192GB GDDR6)
- g5.12xlarge # A10G x4 (96GB GDDR6)
- g5.48xlarge # A10G x8 (192GB GDDR6)

# Capacity Type (Spot 제외 - 추론 워크로드는 On-Demand 권장)
- key: karpenter.sh/capacity-type
operator: In
values: [on-demand]

# Availability Zone (Multi-AZ 분산)
- key: topology.kubernetes.io/zone
operator: In
values: [us-west-2a, us-west-2b, us-west-2c]

# GPU 노드 Taints (일반 워크로드 배치 방지)
taints:
- key: nvidia.com/gpu
effect: NoSchedule
value: "true"

# Kubelet 설정
kubelet:
# GPU 워크로드는 메모리 집약적
maxPods: 110
# Eviction 임계값 조정
evictionHard:
memory.available: "10Gi"
nodefs.available: "10%"
# Image Pull 병렬화
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

# 중단 정책 (비용 최적화)
disruption:
# 노드가 비어 있으면 5분 후 종료
consolidationPolicy: WhenEmpty
consolidateAfter: 5m
# 사용 중인 노드는 유지
budgets:
- nodes: "100%"
duration: 10m

# 리소스 제한 (비용 폭발 방지)
limits:
cpu: "1000"
memory: "4000Gi"
nvidia.com/gpu: "32" # 최대 32개 GPU (p5.48xlarge 4대)

---
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-training
namespace: karpenter
spec:
template:
metadata:
labels:
node-type: gpu-training
gpu-operator: enabled
workload: model-training
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values:
- p5.48xlarge # H100 x8 (훈련 최적화)
- p4d.24xlarge # A100 x8 (40GB)

# Spot Instance 허용 (훈련은 중단 허용)
- key: karpenter.sh/capacity-type
operator: In
values: [spot, on-demand]

taints:
- key: workload
effect: NoSchedule
value: "training"

kubelet:
maxPods: 50 # 훈련 워크로드는 Pod 수 제한
evictionHard:
memory.available: "20Gi" # 훈련은 메모리 여유 필요

disruption:
# Spot 중단 시에도 10분 유예
consolidationPolicy: WhenUnderutilized
consolidateAfter: 10m

limits:
nvidia.com/gpu: "64" # 최대 64개 GPU (p5.48xlarge 8대)

4.3 EC2NodeClass 설정

apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: gpu-inference
namespace: karpenter
spec:
# AMI 선택 (GPU 최적화 AMI)
amiSelectorTerms:
- alias: al2023 # Amazon Linux 2023 (권장)
# 또는 Custom AMI:
# id: ami-0123456789abcdef (NVIDIA 드라이버 사전 설치)

# IAM Role
role: KarpenterNodeRole-eks-genai-cluster

# Subnet 선택 (Private Subnet)
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: eks-genai-cluster
subnet-type: private

# Security Group
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: eks-genai-cluster

# User Data (GPU Operator 설치 준비)
userData: |
#!/bin/bash
set -ex

# GPU Operator를 위한 사전 작업

# 1. NVIDIA Fabric Manager 설치 (NVLink 필요 시)
# p5.48xlarge, p4d.24xlarge는 NVLink 사용
if [[ $(ec2-metadata --instance-type | grep -E "p5|p4d") ]]; then
yum install -y nvidia-fabricmanager
systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
fi

# 2. Kernel Headers 설치 (GPU Operator가 드라이버 컴파일)
yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)

# 3. Containerd 설정 (nvidia-container-runtime 준비)
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd

# 4. 대용량 모델 다운로드를 위한 디스크 확장
# EBS 볼륨을 200Gi로 확장 (NodeClass blockDeviceMappings에서 설정)

# 5. 노드 레이블 추가 (GPU Operator NodeSelector)
echo "KUBELET_EXTRA_ARGS='--node-labels=gpu-operator=enabled'" >> /etc/sysconfig/kubelet

# EBS 볼륨 설정
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 200Gi # LLM 모델 캐싱용
volumeType: gp3
iops: 16000 # 높은 IOPS (모델 로딩 속도 향상)
throughput: 1000 # 1000 MB/s
encrypted: true
deleteOnTermination: true

# Metadata Options (IMDSv2 필수)
metadataOptions:
httpEndpoint: enabled
httpProtocolIPv6: disabled
httpPutResponseHopLimit: 2
httpTokens: required # IMDSv2

# Tags (비용 추적)
tags:
Environment: production
Team: ml-platform
ManagedBy: karpenter
Workload: gpu-inference

4.4 GPU Operator 설치 (Karpenter 노드 전용)

# Helm Values for GPU Operator
# helm install gpu-operator nvidia/gpu-operator -f gpu-operator-values.yaml

# 1. Driver 설정
driver:
enabled: true
version: "550.90.07" # CUDA 12.4 호환
repository: nvcr.io/nvidia
image: driver

# Karpenter 노드에만 배포
nodeSelector:
gpu-operator: enabled

tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

# 라이선스 설정 (vGPU 사용 시)
licensingConfig:
configMapName: "" # 일반 GPU는 불필요

# 2. Toolkit 설정
toolkit:
enabled: true
version: 1.14.6-ubuntu22.04

nodeSelector:
gpu-operator: enabled

tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

# 3. Device Plugin 설정
devicePlugin:
enabled: true
version: v0.15.0

# Resource 이름 설정
config:
name: time-slicing-config # ConfigMap 이름
default: "any"

nodeSelector:
gpu-operator: enabled

tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

# 4. MIG Manager 설정
migManager:
enabled: true
version: v0.7.0

# MIG 전략 (Auto Mode에서는 불가능)
config:
name: mig-parted-config
default: "all-balanced" # 모든 GPU를 균등 분할

nodeSelector:
gpu-operator: enabled

tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

# 5. DCGM Exporter 설정 (Prometheus 메트릭)
dcgmExporter:
enabled: true
version: 3.3.5-3.4.1-ubuntu22.04

# 메트릭 수집 주기
config:
name: dcgm-exporter-metrics

serviceMonitor:
enabled: true
interval: 15s
honorLabels: true

nodeSelector:
gpu-operator: enabled

tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

# 6. Node Feature Discovery
nfd:
enabled: true # GPU 기능 자동 탐지

# 7. GFD (GPU Feature Discovery)
gfd:
enabled: true

nodeSelector:
gpu-operator: enabled

# 8. Operator 자체 설정
operator:
# Auto Mode 노드 제외 (중요!)
nodeSelector:
node-type: gpu-inference # Karpenter NodePool 레이블

tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

defaultRuntime: containerd

# Validator 비활성화 (Auto Mode 노드와 충돌 방지)
validator:
nodeSelector:
gpu-operator: enabled

핵심 설정:

  1. nodeSelector: gpu-operator: enabled: Auto Mode 노드 제외
  2. MIG Manager 활성화: Auto Mode에서는 불가능했던 MIG 기능
  3. DCGM Exporter: GPU 메트릭 자동 수집 (Prometheus 통합)

5. GPU Operator / DCGM / Run:ai 아키텍처

5.1 계층 구조 다이어그램

의존 관계:

Run:ai (최상위 스케줄링 레이어)
↓ depends on
GPU Operator (인프라 자동화 레이어)
↓ includes
DCGM (모니터링 엔진)
↓ requires
NVIDIA Driver (커널 모듈)

Physical GPU (하드웨어)

5.2 GPU Operator의 역할

GPU Operator는 Kubernetes에서 GPU 워크로드를 자동화하는 인프라 계층입니다.

컴포넌트역할Auto ModeKarpenter
nvidia-driverGPU 커널 모듈 설치AWS 사전 설치GPU Operator 설치
container-toolkitContainer runtime 통합AWS 사전 구성GPU Operator 구성
device-pluginGPU 리소스 등록AWS Device PluginGPU Operator Plugin
gpu-feature-discoveryGPU 속성 라벨링제한적완전 지원
mig-managerMIG 프로파일 관리불가가능
dcgm-exporterPrometheus 메트릭수동 설치자동 포함
node-status-exporter노드 상태 메트릭불가자동 포함

GPU Operator의 핵심 가치:

# GPU Operator 없이 직접 구성하려면:
# 1. 각 노드에 SSH 접근
# 2. NVIDIA 드라이버 수동 설치
# 3. Container Toolkit 수동 구성
# 4. Device Plugin Manifest 수동 배포
# 5. DCGM 수동 설치
# 6. MIG 수동 설정
# → 노드 100대면 100번 반복

# GPU Operator 사용 시:
helm install gpu-operator nvidia/gpu-operator
# → 모든 노드에 자동 배포, 자동 업그레이드, 자동 모니터링

5.3 DCGM의 역할

DCGM (Data Center GPU Manager)은 NVIDIA GPU의 모니터링 엔진입니다.

수집 메트릭 유형

1. 성능 메트릭

# GPU SM (Streaming Multiprocessor) 사용률
DCGM_FI_DEV_GPU_UTIL{gpu="0", namespace="inference"} 75

# Tensor Core 사용률 (AI 워크로드 핵심 지표)
DCGM_FI_PROF_PIPE_TENSOR_ACTIVE{gpu="0"} 92

# 메모리 사용률
DCGM_FI_DEV_FB_USED{gpu="0"} 68719476736 # 64GB / 80GB (A100)

# PCIe/NVLink Throughput
DCGM_FI_PROF_PCIE_TX_BYTES{gpu="0"} 15728640000 # 15 GB/s
DCGM_FI_PROF_NVLINK_TX_BYTES{gpu="0"} 629145600000 # 600 GB/s (p5.48xlarge)

# Power Consumption
DCGM_FI_DEV_POWER_USAGE{gpu="0"} 450 # 450W / 700W (H100)

# Temperature
DCGM_FI_DEV_GPU_TEMP{gpu="0"} 68 # 68°C

2. 헬스 체크

# ECC (Error Correcting Code) 오류
DCGM_FI_DEV_ECC_DBE_VOL_TOTAL{gpu="0"} 0 # Double Bit Errors (심각)

# XID 오류 (하드웨어 오류 코드)
DCGM_FI_DEV_XID_ERRORS{gpu="0"} 0

# Thermal Throttling (과열로 인한 성능 저하)
DCGM_FI_DEV_THERMAL_VIOLATION{gpu="0"} 0

# Clock Throttling Reason
DCGM_FI_DEV_CLOCK_THROTTLE_REASONS{gpu="0", reason="hw_thermal"} 0

3. 프로파일링

# Per-Process GPU 메모리 사용량
DCGM_FI_DEV_FB_USED_BY_PROCESS{pid="12345", process="python3"} 17179869184 # 16GB

# MIG Instance별 메트릭
DCGM_FI_DEV_GPU_UTIL{gpu="0", mig_instance="1g.10gb"} 45

# Per-User GPU 사용률 (Run:ai 연동)
runai_gpu_utilization{user="data-scientist-1", team="ml-team"} 0.87

5.4 Run:ai의 역할

Run:ai는 GPU Operator + DCGM 위에서 동작하는 스케줄링 및 오케스트레이션 계층입니다.

Run:ai 핵심 기능

1. GPU 스케줄링 고급 기능

# Fractional GPU (GPU 분할 스케줄링)
apiVersion: run.ai/v1
kind: RunaiJob
metadata:
name: inference-job
spec:
gpuFraction: 0.5 # GPU 1개를 0.5개로 요청 (2개 Pod이 1개 GPU 공유)
gpuMemory: 20Gi # 메모리 한계 설정

# Run:ai가 자동 처리:
# - CUDA_VISIBLE_DEVICES 환경변수 설정
# - GPU 메모리 제한 (nvidia-smi 기반)
# - Time-Slicing 스케줄링

---
# Dynamic MIG (런타임에 MIG 프로파일 변경)
apiVersion: run.ai/v1
kind: RunaiJob
metadata:
name: training-job
spec:
migProfile: "3g.40gb" # MIG 3-slice (A100 40GB → 3개 인스턴스)

# Run:ai가 자동 처리:
# - nvidia-smi mig 명령 실행
# - MIG UUID 자동 할당
# - Pod에 MIG Instance 매핑

---
# Gang Scheduling (분산 훈련 동시 시작)
apiVersion: run.ai/v1
kind: DistributedJob
metadata:
name: llama-70b-training
spec:
workers: 8 # 8개 Pod 동시 필요
gpusPerWorker: 8 # 각 Pod에 GPU 8개

# Run:ai가 자동 처리:
# - 64개 GPU가 동시에 Available할 때만 스케줄링
# - 모든 Pod이 동시에 시작
# - 하나라도 실패하면 전체 롤백

---
# Bin Packing + Topology-Aware
apiVersion: run.ai/v1
kind: RunaiJob
spec:
topology: "same-node" # GPU가 동일 노드에 있어야 함

# Run:ai가 자동 처리:
# - NVLink 연결된 GPU끼리 매칭
# - PCIe Bandwidth 최적화
# - NUMA Affinity 고려

2. 리소스 관리

# Department → Project → User 계층 구조
Department: "ML Platform Team"
├── Project: "LLM Inference"
│ ├── GPU Quota: 32
│ ├── Over-Quota: 16 (idle 시 사용 가능)
│ └── Users:
│ ├── ml-engineer-1 (Quota: 8)
│ └── ml-engineer-2 (Quota: 4)
└── Project: "Model Training"
├── GPU Quota: 64
├── Over-Quota: 32
└── Fairness Policy: "DRF" # Dominant Resource Fairness

# Preemption (우선순위 기반 선점)
Job: high-priority-inference
Priority: 100
→ 낮은 우선순위 Job을 선점하고 GPU 확보

# Fairness (공정성 알고리즘)
Algorithm: "Dominant Resource Fairness"
→ 각 User의 GPU 사용 시간을 추적
→ 적게 사용한 User에게 우선권

3. 가시성 및 거버넌스

# Run:ai Dashboard 제공 메트릭 (DCGM 기반)

Per-User GPU Utilization:
ml-engineer-1: 87% (GPU 8개, 평균 87% 활용)
ml-engineer-2: 45% (GPU 4개, 평균 45% 활용)

Per-Team GPU Cost:
ML Platform Team: $12,450/month (GPU 64개)
├── LLM Inference: $8,200/month (GPU 32개)
└── Model Training: $4,250/month (GPU 32개)

Idle GPU Detection:
gpu-node-5: GPU 2,3번 Idle (12시간) → 알림 발송

Job Queueing:
Pending Jobs: 8
├── training-job-1: 대기 중 (GPU 16개 필요, 현재 8개 Available)
└── inference-job-2: 실행 중 (GPU 4개 사용)

5.5 의존 관계 정리

조합가능?사용 사례
GPU Operator만YES기본 GPU 추론, 간단한 훈련
GPU Operator + DCGMYESGPU 모니터링 + Alerting
GPU Operator + Run:aiYES엔터프라이즈 GPU 관리 (권장)
DCGM만YES베어메탈 환경 GPU 모니터링
Run:aiNOGPU Operator 필수 (Driver, Plugin 필요)
Auto Mode + Run:aiNOGPU Operator 설치 불가
Auto Mode + DCGM ExporterYES수동 설치 가능 (제한적)

핵심 인사이트:

  • Run:ai는 GPU Operator 위에서만 동작 (Driver, Device Plugin 필요)
  • Auto Mode는 GPU Operator를 설치할 수 없으므로 Run:ai 불가
  • Karpenter + GPU Operator + Run:ai = 엔터프라이즈 GPU 플랫폼 최적 구성

6. 권장 하이브리드 아키텍처

하나의 EKS 클러스터에서 3가지 노드 타입을 동시에 운영하는 전략입니다.

6.1 워크로드별 노드 배치 전략

워크로드 유형노드 타입GPU Operator이유
시스템 컴포넌트Auto Mode불필요관리 불필요, 비용 최소화
API GatewayAuto Mode불필요CPU 워크로드
Agent OrchestrationAuto Mode불필요CPU 워크로드
간단한 GPU 추론Auto Mode불필요MIG 불필요, 빠른 스케일링
MIG 기반 추론Karpenter필수MIG Manager 필요
Fractional GPUKarpenter필수Run:ai 필요
모델 훈련Karpenter필수Gang Scheduling 필요
온프레미스 GPUHybrid Node필수AWS 관리 GPU 스택 없음

6.2 Karpenter NodePool 구성 (상세)

# 1. 간단한 추론 (Auto Mode로 처리)
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: auto-mode-gpu-simple
spec:
template:
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: [g5.xlarge, g5.2xlarge] # 소형 GPU
- key: karpenter.sh/capacity-type
operator: In
values: [on-demand]
limits:
nvidia.com/gpu: "8"

---
# 2. 고급 추론 (Karpenter + GPU Operator)
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: karpenter-gpu-advanced
spec:
template:
metadata:
labels:
gpu-operator: enabled
runai-enabled: "true"
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: [p5.48xlarge, g6e.12xlarge]
taints:
- key: nvidia.com/gpu
effect: NoSchedule
limits:
nvidia.com/gpu: "64"

---
# 3. 모델 훈련 (Karpenter + Spot)
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: karpenter-gpu-training
spec:
template:
metadata:
labels:
gpu-operator: enabled
workload: training
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: [p5.48xlarge] # H100만 사용
- key: karpenter.sh/capacity-type
operator: In
values: [spot, on-demand] # Spot 우선
taints:
- key: workload
effect: NoSchedule
value: "training"
disruption:
consolidationPolicy: WhenUnderutilized
consolidateAfter: 30m # 훈련 중단 방지
limits:
nvidia.com/gpu: "128"

6.3 GPU Operator 배포 (Karpenter 노드만)

# GPU Operator Helm Values
operator:
# Auto Mode 노드 제외 (핵심 설정)
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
# gpu-operator=enabled 레이블이 있는 노드만
- key: gpu-operator
operator: In
values: [enabled]
# Auto Mode 노드 제외
- key: eks.amazonaws.com/compute-type
operator: NotIn
values: [auto]

driver:
nodeSelector:
gpu-operator: enabled

migManager:
enabled: true
nodeSelector:
gpu-operator: enabled
config:
name: mig-config
default: all-balanced

dcgmExporter:
enabled: true
nodeSelector:
gpu-operator: enabled
serviceMonitor:
enabled: true

runai:
enabled: true # Run:ai 통합 활성화

7. EKS Hybrid Node GPU 팜

7.1 Hybrid Node 개념

EKS Hybrid Node는 온프레미스 서버를 EKS 클러스터에 등록하는 기능입니다 (2024년 11월 GA).

핵심 특징:

  • 온프레미스 GPU 서버를 EKS에 등록 (IAM, Kubelet 인증)
  • AWS 관리 GPU 스택 없음 → GPU Operator 필수
  • VPN 또는 AWS Direct Connect 필요
  • EKS Control Plane은 AWS 관리, 워커 노드는 온프레미스

7.2 Hybrid Node 등록

# 1. Hybrid Node IAM Role 생성
aws iam create-role \
--role-name EKSHybridNodeRole \
--assume-role-policy-document file://hybrid-node-trust-policy.json

aws iam attach-role-policy \
--role-name EKSHybridNodeRole \
--policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy

# 2. Hybrid Node 등록 (온프레미스 서버에서 실행)
curl -o hybrid-node-installer.sh https://hybrid.eks.amazonaws.com/installer
chmod +x hybrid-node-installer.sh

sudo ./hybrid-node-installer.sh \
--cluster-name genai-platform \
--region us-west-2 \
--role-arn arn:aws:iam::123456789012:role/EKSHybridNodeRole \
--credential-provider ssm # AWS SSM을 통한 인증

# 3. GPU Operator 자동 설치 (Hybrid Node 감지 시)
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: gpu-operator-config
namespace: gpu-operator
data:
hybrid-node-detected: "true"
auto-install-driver: "true"
EOF

# 4. 노드 확인
kubectl get nodes -l node.kubernetes.io/instance-type=hybrid
NAME STATUS ROLES AGE VERSION
dgx-a100-station-1 Ready <none> 5m v1.29.0
gpu-server-pool-1 Ready <none> 5m v1.29.0

7.3 Hybrid Node GPU Operator 설치

# GPU Operator Helm Values (Hybrid Node 전용)
operator:
nodeSelector:
node.kubernetes.io/instance-type: hybrid

driver:
enabled: true
# Hybrid Node는 Ubuntu/RHEL 등 다양한 OS
repository: nvcr.io/nvidia
version: "550.90.07"

nodeSelector:
node.kubernetes.io/instance-type: hybrid

toolkit:
enabled: true
nodeSelector:
node.kubernetes.io/instance-type: hybrid

devicePlugin:
enabled: true
nodeSelector:
node.kubernetes.io/instance-type: hybrid

migManager:
enabled: true
nodeSelector:
node.kubernetes.io/instance-type: hybrid

dcgmExporter:
enabled: true
nodeSelector:
node.kubernetes.io/instance-type: hybrid
serviceMonitor:
enabled: true
additionalLabels:
location: on-premises

7.4 3-노드 타입 공존 전략

# Pod 배치 전략 (NodeSelector + Affinity)

# 1. 간단한 추론 → Auto Mode
apiVersion: v1
kind: Pod
metadata:
name: simple-inference
spec:
containers:
- name: llama-7b
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
eks.amazonaws.com/compute-type: auto # Auto Mode 노드

---
# 2. MIG 기반 추론 → Karpenter
apiVersion: v1
kind: Pod
metadata:
name: mig-inference
spec:
containers:
- name: llama-70b
resources:
limits:
nvidia.com/mig-1g.10gb: 1 # MIG Instance
nodeSelector:
gpu-operator: enabled
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node.kubernetes.io/instance-type
operator: In
values: [p5.48xlarge, g6e.12xlarge]

---
# 3. 온프레미스 GPU → Hybrid Node
apiVersion: v1
kind: Pod
metadata:
name: onprem-training
spec:
containers:
- name: pytorch-ddp
resources:
limits:
nvidia.com/gpu: 8
nodeSelector:
node.kubernetes.io/instance-type: hybrid
tolerations:
- key: on-premises
operator: Exists
effect: NoSchedule

8. llm-d와 모델 크기별 노드 전략

8.1 llm-d on EKS Auto Mode: 가능하지만 제약 있음

llm-d는 KV-cache 인식 라우팅과 분산 추론을 제공하는 Kubernetes 네이티브 추론 스케줄러입니다. llm-d의 핵심 가치는 GPU 파티셔닝이 아니라 요청 라우팅 최적화이므로, Auto Mode에서도 핵심 기능은 동작합니다.

llm-d 기능Auto ModeKarpenter + GPU Operator
InferencePool/InferenceModel CRD동작동작
KV-cache aware routing동작동작
Prefix caching 라우팅동작동작
모델 메트릭 기반 로드 밸런싱동작동작
Pod/노드 자동 스케일링동작동작
MIG로 GPU 분할 후 Pod 배치불가동작
Fractional GPU (0.5 GPU)불가동작
DCGM 상세 GPU 메트릭제한적동작

그러나 GPU fraction을 제어할 수 없으므로, 모델 크기에 따라 GPU 활용 효율이 크게 달라집니다.

8.2 모델 크기별 GPU 활용 효율

대형 모델 (70B+) -- Auto Mode 적합

Qwen3-72B on H100 80GB
┌────────────────────────────────────────────┐
│ ████████████████████████████████████████░░ │
│ GPU 메모리 사용: ~75GB / 80GB (93%) │
│ GPU Utilization: 85-95% │
│ llm-d KV-cache 라우팅: 효과적 │
│ → GPU를 거의 다 사용, 낭비 없음 │
└────────────────────────────────────────────┘

중소형 모델 (7B-13B) -- Auto Mode 비효율

Llama-3-8B on H100 80GB
┌────────────────────────────────────────────┐
│ ████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ GPU 메모리 사용: ~16GB / 80GB (20%) │
│ GPU Utilization: 20-40% │
│ llm-d KV-cache 라우팅: 효과적 │
│ → 라우팅은 최적이지만 GPU 80%가 유휴 상태 │
└────────────────────────────────────────────┘

MIG 분할 시 (Karpenter + GPU Operator)

H100을 MIG 3g.40gb x 2로 분할
┌───────────────────┐ ┌───────────────────┐
│ MIG 1: Llama-8B │ │ MIG 2: Llama-8B │
│ ████████░░░░░░░░░ │ │ ████████░░░░░░░░░ │
│ 16GB / 40GB │ │ 16GB / 40GB │
│ Pod A │ │ Pod B │
└───────────────────┘ └───────────────────┘
→ 하나의 GPU에서 2개 모델 인스턴스 운영
→ 비용 50% 절감 + llm-d 라우팅까지 적용

8.3 비용 영향 시뮬레이션

p5.48xlarge (H100 x8) 기준, 월 비용 약 $98,000:

구성7B 모델 인스턴스 수GPU 사용량GPU 활용률실효 비용/인스턴스
Auto Mode (GPU 전체 할당)8개GPU 8개~25%$12,250
Karpenter + MIG (4분할)8개GPU 2개~80%$3,063
절감 효과동일75% 절감3.2배 향상75% 절감
모델 크기와 비용 효율

모델 파라미터 수가 작을수록 Auto Mode에서의 GPU 낭비가 커집니다. 7B 모델을 H100에서 운영하면 GPU 메모리의 80%가 유휴 상태로 남으며, 이는 직접적인 비용 낭비입니다. MIG 파티셔닝이 필수적인 이유입니다.

8.4 모델 크기별 권장 노드 전략

모델 크기예시권장 노드이유
70B+Qwen3-72B, Llama-3-70BAuto Mode + llm-dGPU를 거의 다 사용, 관리 편의성
30B-65BQwen3-32B, CodeLlama-34BAuto Mode 또는 KarpenterGPU 메모리 50%+ 사용, 상황에 따라 선택
13B-30BLlama-3-13BKarpenter + MIG 2분할GPU 활용률 개선 필요
7B 이하Llama-3-8B, Mistral-7BKarpenter + MIG 4-7분할GPU 낭비 심각, MIG 필수
멀티 모델 서빙여러 모델 동시 운영Karpenter + MIG모델별 MIG 파티션 분리
개발/테스트모델 무관Auto Mode빠른 시작, 비용 민감하지 않음

8.5 실전 하이브리드 배치 예시

# 대형 모델: Auto Mode + llm-d (GPU 전체 사용)
apiVersion: inference.ai/v1alpha2
kind: InferencePool
metadata:
name: qwen3-72b-pool
namespace: ai-inference
spec:
targetPortNumber: 8000
selector:
app: vllm-qwen3-72b
extensionRef:
name: llm-d-endpoint-picker
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-qwen3-72b
namespace: ai-inference
spec:
replicas: 4
template:
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args: ["--model", "Qwen/Qwen3-72B", "--tensor-parallel-size", "4"]
resources:
limits:
nvidia.com/gpu: 4 # GPU 전체 사용 (Auto Mode OK)
nodeSelector:
eks.amazonaws.com/compute-type: auto

---
# 소형 모델: Karpenter + MIG + llm-d (GPU 분할)
apiVersion: inference.ai/v1alpha2
kind: InferencePool
metadata:
name: llama3-8b-pool
namespace: ai-inference
spec:
targetPortNumber: 8000
selector:
app: vllm-llama3-8b
extensionRef:
name: llm-d-endpoint-picker
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-llama3-8b
namespace: ai-inference
spec:
replicas: 8
template:
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args: ["--model", "meta-llama/Llama-3-8B", "--gpu-memory-utilization", "0.9"]
resources:
limits:
nvidia.com/mig-3g.40gb: 1 # MIG 인스턴스 사용 (Karpenter)
nodeSelector:
gpu-operator: enabled
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule

9. 노드 전략 의사결정 플로우차트

의사결정 테이블

질문답변권장 노드 타입GPU Operator이유
GPU 불필요-Auto Mode불필요비용 최소화
간단한 GPU 추론MIG 불필요Auto Mode GPU불필요빠른 배포
MIG 필요-Karpenter필수MIG Manager 필요
Fractional GPU-Karpenter필수Run:ai 필요
Run:ai 스케줄링-Karpenter필수GPU Operator 기반
온프레미스 GPU-Hybrid Node필수AWS 드라이버 없음
비용 최소화Spot 허용Karpenter Spot필수유연한 Spot 관리
대규모 훈련Gang SchedulingKarpenter + Run:ai필수동시 시작 보장

10. 요약

10.1 노드 타입별 최적 시나리오

시나리오노드 타입GPU OperatorRun:ai설정 복잡도비용
단순 GPU 추론Auto Mode불필요불가낮음낮음
MIG 기반 추론Karpenter필수선택중간중간
Fractional GPUKarpenter필수필수높음중간
모델 훈련Karpenter필수선택중간높음
Gang SchedulingKarpenter필수필수높음높음
온프레미스 GPUHybrid Node필수선택높음낮음 (Capex)
하이브리드 클라우드Auto + Karpenter + Hybrid부분 필수선택매우 높음혼합

10.2 핵심 원칙

1. Auto Mode의 제약을 이해하라

# Auto Mode는 GPU Operator를 설치할 수 없음 (기술적 불가능)
이유:
- Read-Only Root Filesystem
- SELinux Enforcing
- Device Plugin 이중 등록 충돌
- No SSH / SSM Access

결론:
→ MIG, Run:ai, DCGM 자동 설치 불가
→ 간단한 GPU 추론만 가능

2. Karpenter는 최적의 균형점

장점:
- Auto Mode의 자동 스케일링 유지
- GPU Operator 완전 설치 가능
- Custom AMI 지원
- Spot Instance 유연한 관리

단점:
- Self-Managed (사용자가 업그레이드 관리)
- 초기 설정 복잡도

결론:
→ 엔터프라이즈 GPU 플랫폼의 표준

3. Hybrid Node는 온프레미스 통합 전용

사용 사례:
- 기존 GPU 서버 자산 활용
- 데이터 주권 (Data Residency)
- 레거시 시스템 통합

필수 요구사항:
- GPU Operator 필수
- VPN / Direct Connect 필요
- 네트워크 지연 고려

결론:
→ 클라우드 + 온프레미스 하이브리드 전략

9.3 권장 아키텍처

소규모 스타트업 (< 32 GPU)

구성: Auto Mode Only
- 간단한 GPU 추론
- 관리 오버헤드 최소화
- GPU Operator 불필요

비용: $5,000 - $15,000/월
복잡도: 낮음

중규모 기업 (32 - 128 GPU)

구성: Auto Mode + Karpenter
- Auto Mode: 일반 워크로드 + 간단한 추론
- Karpenter: MIG 기반 추론, DCGM 모니터링

비용: $15,000 - $80,000/월
복잡도: 중간

대규모 엔터프라이즈 (> 128 GPU)

구성: Auto Mode + Karpenter + Hybrid Node
- Auto Mode: 시스템 워크로드
- Karpenter: GPU Operator + Run:ai
- Hybrid Node: 온프레미스 GPU 팜

비용: $80,000 - $500,000/월 (클라우드) + Capex (온프레미스)
복잡도: 높음

10. 다음 단계 & 참고 자료

10.1 다음 단계

  1. EKS Auto Mode 테스트

    eksctl create cluster --name test-auto \
    --region us-west-2 \
    --node-type=auto
  2. Karpenter + GPU Operator PoC

    helm install karpenter oci://public.ecr.aws/karpenter/karpenter
    helm install gpu-operator nvidia/gpu-operator
  3. Run:ai 평가판

  4. Hybrid Node 파일럿

    curl -o hybrid-installer.sh https://hybrid.eks.amazonaws.com/installer
    sudo ./hybrid-installer.sh --cluster-name test-cluster

10.2 참고 자료

AWS 공식 문서

NVIDIA 문서

Run:ai 문서

커뮤니티 리소스

관련 문서


마지막 업데이트: 2026-03-16 작성자: devfloor9 태그: eks gpu auto-mode karpenter hybrid-node gpu-operator nvidia run-ai