Info

home server 구축 과정을 정리한 페이지 입니다.

계획

미니pc 를 통해서 ProxmoxVE 를 OS 로 설치한 뒤 Opnsense kubernetes 등 여러가지 도구들을 사용하여 실제 여러 홈페이지 및 application 을 운영해 볼 생각이다.

미니pc 스펙

모델명 : FIREBAT T8 플러스 N100 CPU : N100 (4core) Memory : 16GB storage : 512GB local : 100GB local-lvm : 375GB

균형잡힌 K8s 리소스 계획

물리 vs 할당 리소스 (균형잡힌 오버커밋)

⚖️ BALANCED OVERCOMMIT 현황

구분물리할당배수안전성
CPU4 Core20 vCPU5배✅ 안전
Memory15.41GB24GB1.56배✅ 균형
Disk512GB250GB0.49배✅ 넉넉

주요 변경사항:

  • 메모리 오버커밋: 1.7배 → 1.56배 (안전성 향상)
  • 디스크 할당: 130GB → 250GB (실용성 향상)
  • 워커 노드 완전 동일 스펙 (K8s 최적화)

VM 리소스 할당 (수정됨)

VMvCPUMemoryDisk역할
OpnSense22GB20GB방화벽/라우터
K3s Master64GB30GB클러스터 컨트롤 플레인
K3s Worker-169GB100GB워커 노드
K3s Worker-269GB100GB워커 노드

균등 할당의 장점:

  • ✅ K8s 동적 스케줄링에 최적화
  • ✅ 노드 장애 시 완전한 페일오버 가능
  • ✅ 관리 복잡성 제거
  • ✅ 리소스 예측 가능성 향상

오버커밋이 안전한 이유 (간단 정리)

1. 📊 실제 사용률 차이

예시 - PostgreSQL:
- 할당: 2GB
- 평상시: 800MB (40% 사용)
- 피크시: 1.5GB (75% 사용)

예시 - Jenkins:
- 할당: 2.5GB  
- 대기중: 300MB (12% 사용)
- 빌드중: 2.2GB (88% 사용)

2. ⏰ 시간대별 분산

실제 사용 패턴:
- 09:00-12:00: Jenkins 빌드 (높은 사용률)
- 14:00-17:00: 개발/테스트 (중간 사용률)  
- 02:00-04:00: Elasticsearch 인덱싱 (높은 사용률)
- 23:00-07:00: 대부분 서비스 대기 (낮은 사용률)

→ 전체 서비스가 동시 피크 사용할 확률 매우 낮음

3. 🔄 메모리 공유 기술

KSM (Kernel Same-page Merging):
- Ubuntu 베이스 이미지: 4개 VM 공유
- Docker 베이스 레이어: 자동 중복 제거
- 시스템 라이브러리: 공통 부분 공유
→ 실제 메모리 사용량 30-40% 절약

서비스별 메모리 사용 패턴 (현실적)

🔴 무거운 서비스들 (2GB 이상)

서비스할당평상시피크시사용 시간대
Jenkins2.5GB0.3GB2.2GB업무시간 빌드
Elasticsearch2.5GB1.2GB2.3GB새벽 인덱싱
Django API (2개)4GB2.5GB3.5GB사용자 트래픽
Harbor2GB0.8GB1.8GB이미지 푸시시
Prometheus2GB1.3GB1.8GB지속적 수집

🟡 중간 서비스들 (1-2GB)

서비스할당평상시피크시특징
PostgreSQL2GB0.8GB1.5GB연결수에 따라 변동
ArgoCD1.5GB0.9GB1.3GB배포시에만 증가
MongoDB1.5GB0.7GB1.2GB로그 수집량에 따라
Airflow1.5GB0.5GB1.3GB워크플로우 실행시
Flutter Web (2개)3GB1.8GB2.5GB사용자 접속에 따라

🟢 가벼운 서비스들 (1GB 이하)

서비스할당평상시피크시특징
Grafana1GB0.5GB0.8GB대시보드 조회시 증가
Kibana1GB0.4GB0.7GB로그 검색시 증가
Redis1GB0.3GB0.6GB캐시 데이터량에 따라
Nginx0.5GB0.2GB0.4GB트래픽에 따라 선형 증가

워커 노드별 실제 사용 시나리오

시나리오 1: 정상 분산 (70% 확률)

Worker-1 (7.5GB 사용 / 9GB 할당):
  Jenkins: 0.3GB (대기)
  PostgreSQL: 0.8GB
  Elasticsearch: 1.2GB  
  Django API replica-1: 1.2GB
  Harbor: 0.8GB
  Prometheus: 1.3GB
  기타: 1.9GB
 
Worker-2 (7.2GB 사용 / 9GB 할당):
  ArgoCD: 0.9GB
  MongoDB: 0.7GB
  Django API replica-2: 1.3GB  
  Flutter Web: 1.8GB
  Grafana: 0.5GB
  Airflow: 0.5GB
  기타: 1.5GB

시나리오 2: 빌드 + 인덱싱 동시 (20% 확률)

Worker-1 (8.7GB 사용 / 9GB 할당 - 안전):
  Jenkins: 2.2GB (빌드 중)
  Elasticsearch: 2.3GB (인덱싱)
  PostgreSQL: 1.5GB
  Django API: 1.2GB
  기타: 1.5GB
 
Worker-2 (7.8GB 사용 / 9GB 할당):
  Prometheus: 1.8GB (메트릭 증가)
  ArgoCD: 1.3GB (배포 중)
  Flutter Web: 2.5GB (트래픽 증가)
  MongoDB: 1.2GB
  기타: 1GB

시나리오 3: 노드 장애 (5% 확률)

Worker-1 다운 시:
→ 모든 Pod가 Worker-2로 이동
→ Worker-2 필요 메모리: 약 15GB
→ 할당 메모리: 9GB
 
Priority Class 적용:
1. PostgreSQL, Redis (시스템 중요): 유지
2. Django API (비즈니스): 유지  
3. Prometheus, Grafana (모니터링): 유지
4. Jenkins, Harbor (개발): Pending 상태
5. Jupyter, 기타 (옵션): Pending 상태
 
결과: 핵심 서비스는 유지, 개발 도구는 일시 중단

디스크 사용량 예상

Worker-1 (100GB 할당)

OS + 시스템: 15GB
Docker 이미지들: 25GB
Jenkins 빌드 캐시: 20GB  
Elasticsearch 인덱스: 20GB
PostgreSQL 데이터: 8GB
로그 파일들: 7GB
여유 공간: 5GB

Worker-2 (100GB 할당)

OS + 시스템: 15GB
Docker 이미지들: 20GB
Prometheus 메트릭: 25GB (15일 보관)
MongoDB 데이터: 15GB
애플리케이션 데이터: 10GB
백업 파일들: 10GB
여유 공간: 5GB

안전 운영 가이드

1. 🎯 리소스 모니터링 임계값

메모리 사용률 알림:
- 75% 이상: 주의 (6.7GB)
- 85% 이상: 경고 (7.6GB)  
- 95% 이상: 긴급 (8.5GB)
 
디스크 사용률 알림:
- 80% 이상: 주의 (80GB)
- 90% 이상: 경고 (90GB)
- 95% 이상: 긴급 (95GB)

2. 🔄 자동 대응 전략

HPA (Horizontal Pod Autoscaler):
- Django API: CPU 70% → replica 증가
- Flutter Web: 메모리 80% → replica 증가
 
Priority Classes:
- system-critical: DB, Redis
- business-critical: Django, Nginx
- development: Jenkins, Harbor
- monitoring: Prometheus, Grafana
- optional: Jupyter, 기타

3. 📊 성능 최적화

Resource Limits 설정:
- requests: 최소 보장 리소스
- limits: 최대 사용 제한
- 메모리 leak 방지
- OOM 위험 최소화
 
Node Affinity:
- DB 서비스: SSD 우선 배치
- 계산 집약적: CPU 성능 우선
- I/O 집약적: 네트워크 성능 우선

🎯 최종 평가

이 구성의 장점:

  • ✅ 안전한 1.56배 메모리 오버커밋
  • ✅ 충분한 디스크 공간 (250GB)
  • ✅ 워커 노드 완전 동일 스펙
  • ✅ 현실적인 서비스 배치 계획
  • ✅ 장애 상황 대응 가능

예상 실제 사용률:

  • CPU: 평상시 25%, 피크시 70%
  • Memory: 평상시 18GB, 피크시 22GB
  • Disk: 180-200GB (여유 50-70GB)

결론: N100 미니PC로 엔터프라이즈급 개발환경 구축 가능! 🚀

다이어그램

Info

K8s 클러스터에서는 실제로 서비스들이 특정 노드에 고정되지 않고, 클러스터 전체에 분산 배치 됩니다. 아래 다이어 그램은 “예상 배치 및 리소스 계획” 입니다.

image

더 간단하게 표현한 다이어그램. image