나의 주권 클라우드 플랫폼: Intel i5 Mini PC 하나로 Proxmox VE 8, K3s, Flux CD v2, Cloudflare
요약
본 글은 Intel i5 Mini PC를 활용하여 Proxmox VE, k3s, Flux CD v2 등을 이용한 자가 복구(self-healing) 주권 클라우드 플랫폼을 구축하는 과정을 다룹니다. 하드웨어 리소스 격리, Cloudflare Zero Trust Anycast Tunnels를 통한 네트워킹 우회, GitOps 기반의 선언적 배포 전략 등 실질적인 엔지니어링 노하우가 담겨 있습니다.
핵심 포인트
- Proxmox VE와 KVM을 이용해 하드웨어 리소스를 엄격하게 격리하여 안정성을 확보했습니다.
- CGNAT 환경에서 Cloudflare Zero Trust Anycast Tunnels를 활용, 공용 IP 노출 없이 외부 접근을 구현했습니다.
- Flux CD v2와 GitOps 원칙으로 모든 배포를 선언적으로 관리하며 시스템의 재구축 가능성을 높였습니다.
- NVMe/SATA 이중 계층 스토리지 파티셔닝으로 I/O 병목 현상을 최소화하고 성능을 최적화했습니다.
안녕하세요 여러분,
지난 몇 달 동안 저는 제 홈랩을 처음부터 다시 구축하는 작업을 진행했습니다. 느슨하게 관리되는 Docker 컨테이너나 정적 VM을 실행하는 대신, 엄격한 베어메탈 하드웨어 및 네트워킹 제약 조건 하에서 엔터프라이즈 규모의 자가 복구(self-healing) 주권 클라우드 플랫폼(Sovereign Cloud Platform)을 시뮬레이션하는 것이 목표였습니다.
여기 아키텍처, 네트워킹, 스토리지 경제성 및 배운 교훈에 대한 전체 분석이 있습니다.
- 하드웨어 및 리소스 격리 (Resource Fencing)
호스트 머신: Intel Core i5 Mini PC (4 코어 / 8 스레드)
호스트 메모리: 16GB DDR4 RAM
스토리지: 256GB NVMe SSD (높은 IOPS) + 1TB SATA HDD (대용량 아카이브)
하이퍼바이저: Proxmox VE 8 (Debian Linux 커널)
리소스 제약 조건: 호스트 RAM 16GB에서 무거운 백그라운드 워크로드와 함께 Kubernetes를 실행하는 것은 커널이 메모리 부족(OOM) 상태가 될 경우 위험합니다. 하이퍼바이저 충돌을 방지하기 위해, 저는 호스트 리소스를 엄격하게 분할했습니다:
- 단일 프로덕션 VM (k3s-prod)에 전용 12GB RAM 및 4 vCPU 할당.
- Proxmox VE Debian 호스트, KVM 하이퍼바이저 데몬, 그리고 vzdump 백업 스냅샷 압축을 위해 3.5GB RAM 예약.
- 0.5GB 비상 호스트 안전 버퍼.
이 격리(fencing) 덕분에 대용량 OCR 인덱싱 중 호스트가 멈추는 현상을 완전히 제거할 수 있었습니다.
- 네트워킹: 제로 오픈 포트로 CGNAT 극복하기
많은 주거 연결과 마찬가지로, 제 ISP는 Carrier-Grade NAT (CGNAT) 뒤에 있습니다. 저는 공용 정적 IPv4를 가지고 있지 않으며, 전통적인 포트 포워딩은 불가능하거나 집의 IP를 노출시킵니다.
해결책: 클러스터 내부에 Cloudflare Zero Trust Anycast Tunnels (cloudflared)를 배포했습니다:
- cloudflared는 아웃바운드 전용 QUIC 연결을 Cloudflare의 가장 가까운 엣지 PoP로 시작합니다.
- 공용 트래픽은 WAF 및 DDoS 완화 기능이 있는 Cloudflare의 Anycast 엣지에서 종료됩니다.
- 로컬 지연 시간은 15ms 미만입니다.
- 결과: 주거 라우터에 들어오는 포트(inbound ports)는 '0'개, 공용 IP 노출도 '0'개입니다.
관리자 접근(Proxmox 웹 GUI, Kubernetes API)을 위한 공개 엔드포인트는 존재하지 않습니다.
모든 접근은 암호화된 Tailscale (WireGuard) 메시를 통해 이루어집니다.
- GitOps 지속적 배포 및 In-Git 시크릿 관리
수동kubectl apply명령어는 없습니다. 모든 것이 선언적으로 관리됩니다:
- Flux CD v2가 Git으로부터 원하는 클러스터 상태를 지속적으로 동기화합니다.
- 워크로드 조정은 결정론적으로 순서가 정해져 있습니다: 플랫폼 운영자(스토리지, CloudNativePG, 인그레스)는 애플리케이션이 스케줄링되기 전에 100% 정상이어야 합니다 (앱은 플랫폼에 의존).
- 시크릿 관리: 시크릿은 Mozilla SOPS와 Age로 암호화되어 Git에 직접 저장됩니다. Flux Kustomize 컨트롤러가 클러스터 내에서 private Age 키를 보유하고 메모리에 직접 시크릿을 로드(hydrate)합니다. 서버가 다운되더라도, 새 노드가 10분 이내에 Git으로부터 전체 시스템을 재구축할 수 있습니다.
- 스토리지 경제성: 이중 계층 파티셔닝
단일 노드 가상화는 디스크 I/O 병목 현상을 일으켜 데이터베이스 성능을 저하시킬 수 있습니다:
- NVMe 계층 (빠름): OS, K3s 상태, PostgreSQL 데이터 파일.
- SATA 계층 (1TB 대용량): Paperless-ngx OCR 문서 아카이브, Audiobookshelf 스트리밍 미디어, 야간 덤프 백업.
- 멀티 클라우드 아웃 오브 밴드 복원력
클러스터 내부에서 실행되는 모니터링 시스템은 전원이나 광대역 인터넷이 끊어지면 경고를 보내지 못합니다.
- 저는 Oracle Cloud (OCI Free Tier)에 독립적인 VM을 운영하여 Uptime Kuma를 실행하고, 인터넷을 통해 공용 엔드포인트를 지속적으로 폴링(polling)합니다.
- 광대역 인터넷이나 전원이 끊어지면, Discord/Slack 웹훅을 통해 휴대폰으로 자동 알림을 보냅니다.
- 야간 암호화된 Restic 백업은 오프사이트 S3 호환 클라우드 스토리지로 푸시되어 3-2-1 백업 규칙을 충족합니다.
애플리케이션 플릿(Application Fleet)
플랫폼: Cloudflare Tunnel, CloudNativePG, Homepage 대시보드, Prometheus/Grafana, Kwatch
자동화 및 문서: n8n 워크플로우 엔진, Python PDF 컴파일러, MkDocs 엔지니어링 핸드북
미디어 및 문서: Paperless-ngx, Audiobookshelf, Miniflux, Linkding
오픈 소스 문서 및 코드
마이클 니가드(Michael Nygard) 표준을 따라 16개의 아키텍처 결정 기록(ADR)을 문서화하고 전체 재해 복구 실행 매뉴얼을 컴파일했습니다.
GitHub 저장소: https://github.com/vsingh55/homelab-ops
전체 아키텍처 핸드북: https://docs.vijaysingh.cloud
실시간 명령어 허브: https://hub.vijaysingh.cloud
원격 측정 및 상태: https://status.vijaysingh.cloud
상세 사례 연구: https://vijaysingh.cloud/projects/202609-homelab-ops-sovereign-cloud/
Proxmox 펜싱(fencing), SOPS 비밀 설정, 또는 Cloudflare 터널 구성에 대한 질문은 댓글로 환영합니다!
제출자: /u/krvsc
[링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/SelfHosted (AI filter)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기