Kubernetes DRA — 동적 리소스 할당 프레임워크
DRA(Dynamic Resource Allocation)는 GPU 전용 기능이 아니라, Kubernetes가 특수 하드웨어 전반을 요청·구성·공유하기 위해 설계한 범용 디바이스 할당 프레임워크입니다. 벤더가 DRA 드라이버를 제공하면 GPU뿐 아니라 고성능 NIC, RDMA 어댑터, NVLink 인터커넥트, FPGA 등 어떤 디바이스든 동일한 API로 동적 할당할 수 있습니다.
이 문서는 DRA를 프레임워크 관점에서 다룹니다 — 핵심 API 모델, DRA가 다루는 리소스 유형, 도입 판단 기준과 전제 조건. EKS GPU 환경에서 DRA를 실제로 활성화하는 파라미터(Karpenter ignoreDRARequests, NVIDIA DRA 드라이버 3계층 설정)는 GPU 리소스 관리에서 다룹니다.
배경 — Device Plugin 모델의 한계
Kubernetes의 기존 확장 리소스 모델(Device Plugin)은 디바이스를 nvidia.com/gpu: 1처럼 불투명한 정수 카운터로만 표현합니다. 이 모델은 단순하고 안정적이지만, 다음 요구를 표현할 수 없습니다.
| 한계 | 설명 |
|---|---|
| 정적 등록 | 노드 시작 시 디바이스 수가 고정. 런타임 재구성(파티셔닝 변경 등) 불가 |
| 전체 단위 할당 | 디바이스를 통째로만 할당. 부분 할당·공유 표현 불가 |
| 속성 선택 불가 | "80GB 이상 메모리 GPU", "RDMA 지원 NIC"처럼 속성 기반 요청 불가 |
| 멀티 리소스 조율 불가 | "GPU 1개 + 같은 NUMA 노드의 NIC 1개"처럼 디바이스 간 관계 표현 불가 |
| 디바이스 유형별 개별 구현 | GPU·NIC·FPGA마다 별도 Device Plugin과 카운터 체계 필요 |
DRA는 이 한계를 해결하기 위해 디바이스의 속성과 용량을 구조화된 데이터로 선언하고, 워크로드가 이를 CEL(Common Expression Language) 표현식으로 선택하는 모델을 도입했습니다. 이 접근을 structured parameters(KEP-4381)라고 하며, 스케줄러가 벤더 드라이버에 의존하지 않고 할당을 시뮬레이션할 수 있게 합니다.
DRA 핵심 모델
API 오브젝트 4종
DRA는 resource.k8s.io/v1 API 그룹의 네 가지 오브젝트로 구성됩니다.
| 오브젝트 | 생성 주체 | 역할 |
|---|---|---|
| DeviceClass | 클러스터 관리자 / 드라이버 | 디바이스 카테고리 정의 (예: gpu.nvidia.com, mrdma.google.com). 공통 선택 조건·설정 포함 |
| ResourceSlice | DRA 드라이버 | 노드(또는 클러스터)의 실제 디바이스 인벤토리 발행 — 속성·용량·토폴로지 메타데이터 |
| ResourceClaim | 워크로드 운영자 | 특정 디바이스에 대한 요청. CEL selector로 속성 매칭, Pod와 수명주기 독립 |
| ResourceClaimTemplate | 워크로드 운영자 | Pod마다 ResourceClaim을 자동 생성하는 템플릿 (Deployment 등 다중 복제본에 사용) |
할당 흐름
- DRA 드라이버가 관리하는 디바이스의 속성·용량을 ResourceSlice로 발행합니다.
- 워크로드는 ResourceClaim(Template)에 CEL selector로 원하는 디바이스 조건을 선언합니다.
- kube-scheduler가 ResourceSlice 데이터만으로 할당을 계산하고 노드를 선택합니다 — 이 시점에 드라이버 호출이 없다는 점이 structured parameters의 핵심입니다.
- kubelet이 노드의 드라이버 플러그인에 준비를 위임하고, 드라이버는 CDI(Container Device Interface) 스팩으로 컨테이너에 디바이스를 주입합니다.
ResourceClaim 예시 — "80GB 이상 메모리를 가진 GPU 1개"를 속성 기반으로 요청합니다.
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: large-gpu-template
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: gpu.nvidia.com
selectors:
- cel:
expression: device.capacity['nvidia.com'].memory.compareTo(quantity('80Gi')) >= 0
버전 히스토리
| K8s 버전 | 상태 | 비고 |
|---|---|---|
| 1.26 | Alpha | classic DRA (KEP-3063, 이후 폐기) |
| 1.30 | Alpha | structured parameters 도입 (KEP-4381) |
| 1.32 | Beta | v1beta1, 새 구현 기준 확립 (기본 비활성화) |
| 1.34 | GA | resource.k8s.io/v1, 기본 활성화 |
| 1.35 | Stable (locked) | feature gate locked-to-default |
코어 프레임워크는 1.34에서 GA되었고, 개별 고급 기능은 아래 고급 기능처럼 성숙도가 각기 다릅니다.