온프레미스

dev 환경, 개발과 공개 데모

← HomeLab

노트북 1대(RAM 32GB)에 Proxmox VM으로 k3s 노드 3대(HA)와 OPNsense 방화벽을 구성. 네트워크와 로드밸런서, 스토리지는 k3s 기본값 대신 직접 선택. 노드는 방화벽 뒤 격리망에 두고, 서비스는 Cloudflare를 거쳐 공개(443), 관리 UI는 WireGuard VPN으로만 접근(51820).

온프레미스 구조

인터넷 집 사용자 Cloudflare 관리자 데스크탑 WireGuard 51820/UDP 공유기 포워딩 443, 51820만 노트북 Proxmox OPNsense k3s 클러스터, VM 3대 HA 443 80 Traefik 대기열 서비스 ArgoCD, Grafana 동기화 stg(EKS)로 동기화 pull과 webhook(WireGuard) 사용자 요청 관리자 VPN GitOps 동기화
사용자와 관리자, GitOps 세 경로 모두 노트북 안 OPNsense VM을 경유.

설계 결정

쿠버네티스 층
항목선택이유
배포판k3s. 3대 모두 컨트롤 플레인과 etcd 겸임단일 바이너리라 8GB 노드에 서비스 메모리를 확보. 대신 k3s가 멈추면 컨트롤 플레인과 kubelet이 함께 멈춤
파드 네트워크Calico기본 Flannel은 NetworkPolicy를 집행하지 않아, 규칙이 있어도 통신이 허용됨
로드밸런서와 인그레스MetalLB와 Traefik 별도 설치기본 ServiceLB는 노드 IP를 써서 그 노드가 멈추면 접속 불가. 번들 Traefik은 재기동하면 설정이 초기화됨
스토리지정적 PV로 용도별 디스크를 따로 마운트기본 local-path는 한 디스크 안 폴더라 디스크 지표로 용도를 구분할 수 없음. 대신 파드가 그 노드에 고정됨
격리와 공개
항목선택이유
격리OPNsense 방화벽 VM과 물리 NIC 없는 브리지노드와 데스크탑이 같은 망이면 한쪽이 침해됐을 때 다른 쪽까지 닿음. 격리망 출입 경로를 방화벽 하나로 제한
관리 접근WireGuard 터널관리 UI(Grafana, ArgoCD)를 인터넷에 공개하지 않고, 키를 등록한 기기만 접근
공개 경로Cloudflare 프록시에 방화벽 출발지를 엣지 대역으로 제한, 인증서는 cert-manager서비스 도메인에서 집 공인 IP를 숨기고 방문자 연결은 엣지에서 종료. 엣지에서 Traefik까지도 TLS
파드 간 통신NetworkPolicy 24개로 네임스페이스별 기본 차단기본값이 파드 간 전체 허용이라, 앱 하나가 침해되면 다른 네임스페이스 DB까지 연결됨

트러블슈팅

증상원인조치
외부 443 요청의 Host 헤더만 바꾸면 ArgoCD 로그인 화면 응답Traefik이 Host 헤더로만 라우팅하는데 예매 서비스와 Grafana, ArgoCD가 같은 80, 443을 공유관리 UI 라우터를 80 전용으로 분리. 80은 인터넷에 열지 않음
kubelet이 보고한 파드 할당 가능 메모리가 실제보다 큼컨트롤 플레인이 파드가 아닌 k3s 프로세스라 집계에서 1,783Mi 누락k3s 2Gi와 OS 512Mi를 예약해 노드당 파드 할당 5,081Mi
데스크탑에서 격리망으로 응답 없음. 방화벽 로그는 통과(pass)WAN 규칙에 자동으로 붙은 reply-to가 데스크탑(같은 대역)으로 갈 응답을 공유기로 보냄그 규칙의 reply-to를 해제해 패킷 손실 0%

결과

  • 노트북 1대에 k3s HA 클러스터를 구축하고 대기열 예매 서비스를 외부에 공개: ticket.subinhong.dev
  • 노드 1대 중단 시험에서 클러스터 유지: etcd 3대 중 남은 2대가 과반
  • 공개 경로 외 외부 접근 차단 확인: 포트 20개 스캔에 응답 0, Cloudflare를 거치지 않은 443 직접 접속은 타임아웃
  • 파드 출구를 목적지 단위로 제한: booking은 MySQL, Redis, Kafka, 수집기 4곳만 허용
  • 클러스터 구성 전부 코드로 관리: k3s config.yaml, 부트스트랩 9단계, Helm 차트

한계

  • 노드 RAM이 부하 상한: 3만 명 부하에서 k3s 재시작, 이후 부하 측정은 stg(EKS)
  • 외부 경로 전부가 OPNsense VM 1대에 집중: VM이 멈추면 서비스 공개와 VPN, 격리망 인터넷이 함께 중단
  • VPN 접속용 도메인은 집 공인 IP 노출: WireGuard는 UDP라 HTTP만 중계하는 Cloudflare 프록시를 쓸 수 없음

기술 스택

Proxmox VE, k3s, Calico, MetalLB, Traefik, Helm, OPNsense, WireGuard, Cloudflare, cert-manager, Let’s Encrypt