Karpenter GPU 노드 구성
GPU 워크로드를 실행할 수 있도록 GPU Operator를 설치하고 Karpenter의 GPU 전용 NodePool을 구성합니다.
Kubernetes Engine용 Karpenter Provider는 Virtual Machine 기반의 NVIDIA T4(gn1i)와 NVIDIA A100(p2i) 인스턴스를 지원합니다. Karpenter는 GPU 인스턴스를 생성하여 클러스터에 연결하지만, containerd의 NVIDIA 런타임 설정과 NVIDIA device plugin은 구성하지 않습니다.
GPU Operator는 호스트 파일 시스템에 접근하고 containerd 설정을 변경하며, 설치 과정에서 GPU 노드의 containerd를 재시작할 수 있습니다. 기존 GPU 워크로드에 영향을 줄 수 있으므로 운영 워크로드를 배포하기 전에 설치와 검증을 완료하시기 바랍니다.
Pod Security Admission을 사용하는 경우 gpu-operator 네임스페이스에 privileged 정책이 필요합니다.
사전 작업
다음 항목을 확인합니다.
- Karpenter 설치 및 노드 구성에 따라 Karpenter가 설치되어 있어야 합니다.
- 사용할 KCNodeClass의
Ready조건이True여야 합니다. - GPU 인스턴스 쿼터와 서브넷의 가용 IP를 확인해야 합니다.
- GPU 노드에서 접근할 수 있는 컨테이너 이미지 레지스트리를 준비해야 합니다.
GPU Operator가 이미 설치되어 있는지 확인합니다.
helm list -A | grep -E '(^|[[:space:]])gpu-operator([[:space:]]|$)' || true
GPU Operator가 표시되면 기존 설치를 유지하고 Step 2. GPU NodePool 생성으로 이동합니다. 기존 Operator의 버전과 설정은 변경하지 않습니다.
GPU Operator가 없지만 Kubernetes Engine 관리형 GPU 노드에서 NVIDIA device plugin을 별도로 사용하고 있다면, Operator를 설치하기 전에 기존 GPU 노드에 미치는 영향을 검토해야 합니다. 해당 환경에서는 헬프데스크 > 기술 문의를 통해 구성을 확인한 후 진행하시기 바랍니다.
Step 1. GPU Operator 설치
GPU Operator가 설치되어 있지 않다면 먼저 Node Feature Discovery(NFD)의 설치 여부를 확인합니다.
kubectl get daemonset -A \
| grep -E 'node-feature-discovery|nfd-worker' || true
NFD가 이미 설치되어 있으면 아래 Helm 명령에 --set nfd.enabled=false를 추가하여 중복 설치를 방지합니다.
GPU Operator를 설치합니다. Kubernetes Engine GPU 워커 이미지에는 NVIDIA 드라이버가 포함되어 있으므로 driver.enabled=false로 설정합니다.
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
kubectl create namespace gpu-operator --dry-run=client -o yaml \
| kubectl apply -f -
kubectl label namespace gpu-operator --overwrite \
pod-security.kubernetes.io/enforce=privileged
helm upgrade --install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--version v26.3.2 \
--set driver.enabled=false \
--set toolkit.enabled=true \
--set devicePlugin.enabled=true \
--wait \
--timeout 15m
GPU Operator와 operand 파드가 정상 실행되는지 확인합니다.
kubectl -n gpu-operator get pods
kubectl -n gpu-operator get daemonset
설치 옵션에 대한 자세한 내용은 NVIDIA GPU Operator 설치 가이드를 참고하시기 바랍니다.
Step 2. GPU NodePool 생성
GPU 전용 NodePool을 생성합니다. GPU가 필요하지 않은 파드가 GPU 노드를 생성하지 않도록 영구 taint를 설정합니다.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: karpenter-gpu
spec:
template:
metadata:
labels:
workload-type: karpenter-gpu
kakaoi.io/kke-nodepool: karpenter-gpu
spec:
requirements:
- key: kubernetes.io/os
operator: In
values: ["linux"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: node.kubernetes.io/instance-type
operator: In
values: ["gn1i.xlarge", "p2i.6xlarge"]
taints:
- key: nvidia.com/gpu
value: "present"
effect: NoSchedule
nodeClassRef:
group: karpenter.kakaocloud.com
kind: KCNodeClass
name: karpenter-default
expireAfter: 720h
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 10m
limits:
cpu: "64"
memory: 256Gi
nvidia.com/gpu: "8"
nvidia.com/gpu taint는 startupTaints가 아닌 taints에 지정합니다. GPU Operator와 device plugin은 이 taint를 제거하지 않습니다.
Cilium을 사용하는 클러스터에서는 Karpenter 설치 및 노드 구성 > Step 4. NodePool 생성을 참고하여 Cilium startup taint도 추가합니다.
NodePool을 생성하고 상태를 확인합니다.
kubectl apply -f gpu-nodepool.yaml
kubectl get nodepool karpenter-gpu
READY가 True인지 확인합니다.
Step 3. GPU 워크로드 실행
GPU 리소스 요청과 taint에 대한 toleration을 지정하고, nodeSelector로 GPU NodePool을 선택하는 테스트 파드를 생성합니다.
apiVersion: v1
kind: Pod
metadata:
name: gpu-smoke
spec:
restartPolicy: Never
nodeSelector:
workload-type: karpenter-gpu
tolerations:
- key: nvidia.com/gpu
operator: Equal
value: "present"
effect: NoSchedule
containers:
- name: cuda
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0-ubuntu22.04
resources:
limits:
nvidia.com/gpu: 1
파드를 생성하면 Karpenter가 GPU 노드를 생성합니다.
kubectl apply -f gpu-smoke.yaml
kubectl get nodeclaims
kubectl get nodes -l karpenter.sh/nodepool=karpenter-gpu
kubectl get pod gpu-smoke -o wide
새 노드가 Ready이고 GPU Operator의 operand 파드가 해당 노드에서 Running 상태인지 확인합니다.
kubectl get nodes -l karpenter.sh/nodepool=karpenter-gpu \
-o custom-columns='NODE:.metadata.name,CAPACITY:.status.capacity.nvidia\.com/gpu,ALLOCATABLE:.status.allocatable.nvidia\.com/gpu'
kubectl logs gpu-smoke
CAPACITY와 ALLOCATABLE이 모두 0보다 크고, 파드 로그에 Test PASSED가 출력되면 GPU를 사용할 수 있습니다. 노드가 Ready여도 GPU 값이 비어 있거나 0이면 GPU 런타임 또는 device plugin 구성을 확인합니다.
확인이 끝나면 테스트 파드를 삭제합니다.
kubectl delete -f gpu-smoke.yaml
consolidateAfter가 지난 뒤 GPU 노드와 인스턴스가 회수되는지 확인합니다. GPU 인스턴스에는 파드 실행 여부와 관계없이 요금이 부과되므로 카카오클라우드 콘솔에서도 인스턴스 삭제 여부를 확인합니다.