피드로 돌아가기
Dev.toDevOps
원문 읽기
I Built a Kubernetes IDE in Rust + Swift Because Lens Was Eating My RAM
Krust가 Rust + Swift 아키텍처로 Kubernetes IDE 메모리 사용량을 1.5GB에서 200MB로 87% 감축
AI 요약
Context
Kubernetes 클러스터 관리 도구들이 Electron 기반이거나 터미널 기반이라는 양극단 문제가 있었다. Lens는 1,700+ Pod를 다룰 때 1.5GB RAM을 소비하고 30초 이상 시작 시간이 걸렸으며, k9s는 빠르지만 GUI 기반 로그 통합 조회와 리소스 검사 기능이 부족했다.
Technical Solution
- 네이티브 UI 계층 분리: Swift/SwiftUI/AppKit로 렌더링만 담당하고 Kubernetes 로직은 모두 Rust(kube-rs)에서 처리하도록 설계
- 컴팩트 데이터 모델 도입: Pod당 700바이트로 제한 (기존 70KB 대비 1/100), 메모리 절감과 함께 정렬·필터링·FFI 바운더리 통과 성능 개선
- 표시 효율성 최적화: SwiftUI List 대신 NSTableView 사용으로 화면에 보이는 ~30개 행만 렌더링
- HTTP/2 멀티플렉싱 활용: 클러스터당 단일 연결로 모든 리소스 워처를 동시 처리하여 파일 디스크립터 오버헤드 감소
- UniFFI 바인딩 활용: Mozilla 제공 FFI 생성기로 Rust-Swift 간 제로카피 통신 구현
Impact
- 메모리 사용량: 1,500MB(Lens) → 200MB(Krust), 약 87% 감축
- 시작 시간: 5~30초(Lens) → <1초(Krust)
- 메모리 비교(k9s): 600MB → 200MB, 67% 감축
- 스레드 수: 55개(k9s) → 15개(Krust)
- 애플리케이션 크기: 26MB
- 로그 검색: 100K 라인 링버퍼에서 <15ms 풀텍스트 검색
Key Takeaway
가비지 컬렉터 없는 Rust의 소유권 모델이 예측 가능한 메모리 사용을 보장하고, 계층별 책임 분리와 컴팩트 데이터 표현이 복합적으로 작용하면 GUI의 편의성을 유지하면서도 터미널 도구 수준의 성능을 달성할 수 있다.
실천 포인트
Electron 기반 도구를 Rust 백엔드 + 네이티브 UI로 재설계하는 고계획(마이그레이션) 프로젝트를 추진할 때, Pod당 700바이트 수준의 컴팩트 데이터 모델과 화면 가시 범위 기반 렌더링(가상화)을 조합하면 메모리 사용량을 10배 이상 감축할 수 있으며, HTTP/2 멀티플렉싱으로 네트워크 연결 수를 대폭 줄일 수 있다.