제한된 하드웨어(MacBook Air VMware VM 3대, Master 2GB / Worker 1GB×2 + Swap 2GB)에서 K3s 클러스터를 운영하며 격은 리소스 배치 문제와 설계 판단 근거 기록.

1. 문제 상황

VM 리소스가 클라우드 대비 매우 제한적인 환경(Master 2GB, Worker 각 1GB + Swap 2GB)에서 아래 워크로드를 어떻게 배치할지 결정해야 했다: defense-api-gateway, target-tracking-service, Kafka, Redis, PostgreSQL + pgvector.

2. 초기 배치안

<table header-row="true"><tr><td>노드</td><td>역할</td><td>배치 컴포넌트</td><td>메모리 합계</td></tr><tr><td>server1 (Master, 2GB)</td><td>Control Plane 전용</td><td>K3s server/etcd/apiserver/scheduler (~900MB)</td><td>—</td></tr><tr><td>server2 (Worker, 1GB+Swap 2GB)</td><td>앱 워크로드</td><td>gateway×1(192Mi), target-tracking×1(256Mi), Redis(~80Mi)</td><td>~528Mi (여유)</td></tr><tr><td>server3 (Worker, 1GB+Swap 2GB)</td><td>앱 워크로드</td><td>gateway×1(192Mi), target-tracking×1(256Mi), Kafka(~400Mi)</td><td>~848Mi (빠듯)</td></tr></table>

3. 핵심 판단 1 — Master는 Control Plane 전용으로 격리

etcd(클러스터의 모든 상태를 저장하는 저장소)가 마스터 노드에서 돌는데, 여기서 앱 파드까지 스케쥴링되다가 OOM이 발생하면 이 때 자체가 죽어서 클러스터 전체가 마비될 수 있다. 이 리스크를 원천 차단하기 위해 앱 파드의 마스터 스케쥴링을 막기로 결정.

kubectl taint nodes server1 node-role.kubernetes.io/master=:NoSchedule

4. 핵심 판단 2 — Kafka는 Swap이 있는 워커에 격리, 단 리스크 존재

메모리를 가장 많이 쓰는 Kafka(~400Mi)를 Swap 여유가 있는 server3에 배치.

발견한 리스크 — Swap 위에서 Kafka + JVM 성능 저하 가능성

5. 미확정 이슈 — PostgreSQL + pgvector 배치 계획 누락

Stateful한 컴포넌트라 노드, PV 요구사항, 메모리 할당량을 먼저 결정해야 함 — 별도로 배치 계획 확정 후 진행하기로 함.

6. 배운 점