들어가며: GPU 노드 운영, 왜 이렇게 어려울까?
쿠버네티스는 노드 위에서 무엇이 실행될지 관리하지만, 노드 자체를 관리하는 일은 여전히 큰 숙제입니다. 커널 설정, 시스템 패키지, 스토리지 레이아웃, 보안 에이전트, GPU 워크로드가 의존하는 호스트 레벨 튜닝까지… 대부분의 팀은 Ansible 플레이북과 수동 런북으로 이 문제를 해결해 왔죠.
문제는 GPU 인프라에서 더 심각해집니다. GPU 노드는 마음대로 버리고 새로 띄울 수 없어요. 하드웨어가 귀하고, 교체에는 몇 시간이 걸리며, 장기 학습 작업은 쉽게 재스케줄할 수 없습니다. 결국 진짜 질문은 "노드 하나를 어떻게 바꿀까"가 아니라 **"학습 작업을 죽이지 않고 어떻게 모든 노드를 바꿀까"**가 됩니다.
NVIDIA가 이 문제를 정면으로 다루는 오픈소스 프로젝트 NodeWright를 공개했습니다. (근거자료: NVIDIA Technical Blog)
NodeWright란? 쿠버네티스를 위한 'apt/yum'
NodeWright는 쿠버네티스 네이티브 패키지 매니저입니다. 클러스터 전체를 대상으로 호스트 인프라를 선언적으로 수정하고 유지보수하죠. 한마디로 **"클러스터 전체를 위한 apt 또는 yum"**이라고 보시면 됩니다.
기존 Ansible/Puppet과의 결정적 차이는 쿠버네티스를 인지한다는 점입니다.
- 변경 전 노드를 cordon하고
- 중요 파드가 끝날 때까지 대기하며
- PodDisruptionBudget을 존중하며 drain하고
- 변경 후 uncordon합니다
패키지는 Custom Resource로 정의되므로 kubectl, Helm, Argo CD, Flux 등 이미 쓰고 있는 GitOps 도구로 그대로 배포할 수 있습니다.
핵심: NodeWright CR 예시
다음은 GPU 노드풀에 튜닝 패키지를 적용하는 최소 예시입니다.
apiVersion: nodewright.nvidia.com/v1alpha1
kind: NodeWright
metadata:
name: gpu-node-tuning
spec:
nodeSelectors:
matchLabels:
nodepool: gpu
interruptionBudget:
percent: 33
podNonInterruptLabels:
matchLabels:
workload: long-running-training
packages:
nvidia-tuned:
version: 0.9.0
image: ghcr.io/nvidia/nodewright-packages/nvidia-tuned
이 리소스를 apply하면 오퍼레이터가 각 대상 노드에서 다음 시퀀스를 조율합니다.
- Cordon – 신규 스케줄 차단
- Wait – 보호된 워크로드가 끝날 때까지 대기
- Drain – PDB를 존중하며 파드 축출
- Apply & Configure – 커널 파라미터, 에이전트, 서비스 설정
- Interrupt – 필요 시 서비스 재시작 또는 노드 재부팅
- Uncordon – 클러스터로 복귀
이 시퀀스가 바로 커널 업데이트로 학습 절반을 날리는 것과 무중단으로 전체 플릿에 적용하는 것의 차이입니다.
대규모 안전 롤아웃: DeploymentPolicy
노드 한 대에 적용하는 건 쉽습니다. 문제는 프로덕션 학습이 도는 GPU 노드 1,000대에 적용하는 것이죠. NodeWright는 DeploymentPolicy 리소스로 점진적 롤아웃 전략을 제공합니다.
| 전략 | 동작 방식 | 사용 시나리오 |
|---|---|---|
| Fixed | 매번 고정 배치 크기 (예: 5대씩) | 예측 가능한 안정 운영 |
| Linear | 배치를 일정량씩 증가 (1→2→3…) | 신뢰를 쌓으며 확장 |
| Exponential | 배치를 배수로 증가 (1→2→4→8…) | 검증 후 빠른 확산 |
각 전략에는 batch threshold(다음 배치로 넘어가기 위한 최소 성공률)와 선택적 failure threshold(연속 실패 시 중단)가 붙습니다. 카나리 노드 하나로 시작해서, 건강 상태를 확인하고, 자동으로 롤아웃을 가속할 수 있습니다. 문제가 생기면 연쇄 장애 없이 멈춥니다.
검증과 노드 준비 상태(Readiness)
패키지 라이프사이클에는 **검증(validation)**이 내장되어 있습니다. apply, configure, upgrade, uninstall, post-interrupt 각 단계에 체크를 붙일 수 있고, 실패 시 Kubernetes 이벤트로 즉시 노출됩니다. 예를 들어 CVE 패키지가 취약한 커널 모듈이 여전히 로드되어 있는지 감지해 패키지를 실패 처리할 수 있죠.
또한 신규 프로비저닝된 노드가 설정·검증을 통과하기 전까지 스케줄되지 않도록 taint를 유지하는 패턴도 지원합니다. "프로비저닝 → 설정 → 검증 → 스케줄 가능"의 통제된 경로를 만드는 것이죠.
한국 개발 생태계에서의 적용 맥락
국내 SI/엔터프라이즈 환경에서는 폐쇄망(air-gapped) 클러스터가 많아 OCI 아티팩트 기반 배포가 그대로 안 되는 경우가 있습니다. 이럴 때는 사내 레지스트리에 차트와 패키지 이미지를 미러링해두고 image 필드를 사내 경로로 바꾸는 식으로 접근하시면 됩니다. 또한 PDB를 적극적으로 선언해두지 않은 워크로드가 많다 보니, podNonInterruptLabels를 활용해 명시적으로 보호 대상을 지정하는 습관이 특히 중요합니다.
주의사항과 한계
- NodeWright는 호스트 OS 레이어만 다룹니다. GPU Operator나 Network Operator를 대체하지 않습니다.
- 패키지는 root 권한으로 실행되므로 RBAC와 admission controller 설정이 필수입니다.
- 재부팅이 필요한 변경은 여전히 워크로드 중단을 유발할 수 있습니다. PDB와
interruptionBudget을 신중히 설계하세요. - 아직 초기 단계(v1alpha1)이므로 API 변경 가능성을 염두에 두어야 합니다.
다음 단계 학습 방향
NodeWright를 실무에 도입하려면 먼저 **NVIDIA AI Cluster Runtime(AICR)**의 레시피 구조를 이해하는 것이 좋습니다. AICR은 드라이버·오퍼레이터·커널·시스템 설정의 검증된 조합을 버전 고정 레시피로 제공하고, NodeWright가 그중 호스트 레벨 부분을 실행합니다. 함께 보면 좋은 글: 클라우드플레어 턴스타일 리디자인 인사이트, Colab MCP 서버로 AI 에이전트가 Colab을 제어하는 시대
마무리
쿠버네티스는 워크로드 관리 방식을 바꿨지만, 그 아래 노드—특히 무거운 AI 워크로드를 돌리는 GPU 노드—는 여전히 스크립트와 수동 런북에 의존하고 있습니다. NodeWright는 그 선언적·자동화·안전한 접근을 호스트 레이어까지 끌어내립니다. 필요한 것만 도입하고, 다음 생태계를 함께 만들어가면 됩니다.

설치와 첫 배포
NodeWright는 Helm 차트로 배포되며 OCI 아티팩트로 제공되므로 별도 저장소 추가가 필요 없습니다.
helm install nodewright oci://ghcr.io/nvidia/nodewright/charts/nodewright \
--namespace nodewright \
--create-namespace
설치 후에는 앞서 본 것처럼 NodeWright CR을 정의하고, 라벨로 대상 노드를 지정하면 오퍼레이터가 나머지를 처리합니다. 패키지는 컨테이너 이미지 형태로 배포되며, 각 패키지에는 검증 스크립트가 포함되어 실패 시 롤아웃을 즉시 중단시킵니다.

NodeWright vs 기존 방식 비교
| 항목 | Ansible/Puppet | NodeWright |
|---|---|---|
| 쿠버네티스 인지 | ❌ | ✅ (cordon/drain/PDB) |
| 배포 방식 | 스크립트 실행 | CR + GitOps |
| 점진적 롤아웃 | 수동 설계 | DeploymentPolicy 내장 |
| 검증 | 별도 구현 | 패키지 라이프사이클 내장 |
| 관측성 | 로그 파일 | Kubernetes 이벤트/상태 |
| 대상 범위 | 개별 머신 | 플릿 단위 |
핵심은 변경의 단위가 노드가 아니라 플릿이라는 점입니다. 이 관점 전환이 대규모 GPU 클러스터 운영의 핵심입니다.

실무 적용 조언
- 카나리 노드풀부터 시작하세요.
DeploymentPolicy의Fixed전략으로 1~2대에 먼저 적용해 검증합니다. - PDB를 먼저 정비하세요. NodeWright는 PDB를 존중하지만, PDB가 없으면 보호할 대상도 없습니다.
- 패키지 버전을 명시하세요.
version필드를 생략하면 예기치 않은 업그레이드가 발생할 수 있습니다. - AICR 레시피와 함께 사용해 드라이버·커널·시스템 설정의 검증된 조합을 유지하세요.
NodeWright는 Apache 2.0 라이선스로 공개되어 있으며, DSX OS 포트폴리오의 일부입니다. 필요한 프로젝트만 도입하거나 여러 개를 조합해 플랫폼을 구성할 수 있습니다.