Playball Logo

Command Palette

Search for a command to run...

목차 열기

아우터 아키텍처 - Dev

역할: Dev(On-Prem) 환경의 네트워크·외부 진입·AWS 연동 구조 (IP·리소스 세부 포함)

Dev는 On-Premise MiniPC 2대에 kubeadm으로 구성한 클러스터입니다. AWS VPC가 없는 대신 가정용 공유기 LAN 위에서 동작하고, 필요한 AWS 서비스(ECR·Secrets Manager)는 bot-kubeadm IAM User로 pulling/syncing합니다.


네트워크 토폴로지 (상세)

네트워크 토폴로지

문서 이미지를 큰 화면으로 확인합니다.


네트워크 주소 체계

구분범위설명
공유기 LAN192.168.0.0/24가정용 공유기 기본 대역 (게이트웨이 192.168.0.1)
MiniPC #1 (Control Plane + Worker)192.168.0.101kube-apiserver, etcd, scheduler, Istio IngressGateway
MiniPC #2 (Worker)192.168.0.102앱 Pod 분산 배치
Pod CIDR (kubeadm 기본 Flannel)10.244.0.0/16Pod 네트워크 (노드당 /24 할당)
Service CIDR (kubeadm 기본)10.96.0.0/12ClusterIP 범위
공유기 Public IPISP 동적 할당DDNS(duckdns.org 등)로 도메인 매핑

외부 진입 경로 (Edge → Pod)

사용자
  ↓  HTTPS (TCP 443)
Cloudflare Edge (서울 PoP · Proxied · whitelist IP 필터)
  ↓  HTTPS (Origin: DDNS 도메인)
DDNS (playball-dev.duckdns.org → 공유기 Public IP)
  ↓
가정 공유기 (포트포워딩 443 → 192.168.0.101:30443)
  ↓
MiniPC #1 NodePort (30443)
  ↓
Istio IngressGateway Pod
  ↓  mTLS + OAuth
앱 Pod
단계리소스세부
EdgeCloudflare Proxydev.playball.example.com 오렌지 구름(Proxied) · Chrome QUIC 대응
접근 제어Cloudflare Access / WAF 룰팀 whitelist IP만 통과
DNSDDNSplayball-dev.duckdns.org → 공유기 Public IP (5분 주기 갱신)
NAT가정 공유기443/tcp, 80/tcp 포트포워딩 → 192.168.0.101
NodePortIstio IngressGateway Service30080 (HTTP) / 30443 (HTTPS)
IngressIstio IngressGateway PodmTLS 강제 + Google OAuth (whitelist IP 2차 필터)

kubeadm 클러스터 구성

항목
노드 수2대 (MiniPC)
역할MiniPC #1: Control Plane + Worker (tainted removed) / MiniPC #2: Worker
Kubernetes 버전1.30
CRIcontainerd
CNIFlannel (Pod CIDR 10.244.0.0/16)
kube-proxy 모드iptables
etcdstacked (Control Plane과 동일 노드)
스토리지local-path-provisioner (PVC는 노드 로컬 디스크에 바인딩)

단일 Control Plane 구성이라 Control Plane 다운 시 클러스터 관리 불가 — Dev 환경 전용 수준의 HA.


클러스터 내부 주요 워크로드

네임스페이스워크로드비고
istio-systemIstio IngressGateway, istiodNodePort 30080/30443 노출
backend백엔드 앱 PodDeployment · HPA 미적용 (Dev 고정 replica)
frontend프론트 앱 Pod정적 Next.js
dataPostgreSQL Pod (PVC 20GB) · Redis Pod (PVC 5GB)local-path PVC
external-secretsESO (External Secrets Operator)Secrets Manager 동기화
monitoringPrometheus · Grafana · Loki · Tempo경량 구성 · 로컬 디스크 저장
argocdArgo CDGitOps 동기화

AWS 연동 (부분)

On-Prem은 IRSA 불가 — IAM User bot-kubeadm 의 장기 자격증명으로 접근:

리소스접근 방식용도
ECRaws ecr get-login-password → kubelet imagePullSecrets컨테이너 이미지 Pull (Staging/Prod와 동일 레지스트리)
Secrets ManagerESO ClusterSecretStoreDB 자격증명 · API 키 K8s Secret으로 동기화
IAM User권한
bot-kubeadmAmazonEC2ContainerRegistryReadOnly + Secrets Manager GetSecretValue (리소스 goormgb/dev/* 한정)

bot-kubeadm Access Key는 초기 kubeadm 부트스트랩 시 노드에 주입 · Secrets Manager에 재저장 없음 (On-Prem 단일 의존점).


구성 요소 정리

구성역할
Cloudflare ProxyChrome QUIC/UDP를 HTTP/2(TCP)로 변환해 공유기 NAT 안정성 확보 (트러블슈팅) + 팀 전용 whitelist IP 필터
DDNS (duckdns.org)공유기 Public IP가 ISP 정책상 변동 → 도메인 매핑 유지
가정 공유기포트포워딩으로 외부 진입점 제공 · 443/80만 개방
kubeadm 클러스터MiniPC 2대 · CP+Worker / Worker
PostgreSQL Pod · Redis Pod클러스터 내부 데이터 저장 (local-path PVC)
Istio IngressGateway내부 라우팅 + whitelist + OAuth
bot-kubeadm IAM UserIRSA 불가한 On-Prem에서 ECR Pull + AWS 리소스 접근용 단일 User
ESO (ClusterSecretStore)AWS Secrets Manager → K8s Secret 자동 동기화

왜 On-Prem인가

  • 비용 제약: AWS EKS 상시 운영 비용 부담 회피
  • 개발 감각: 로컬 클러스터를 만지며 K8s 운영 경험 축적
  • Staging/Prod 재현성: ECR·Secrets 경로는 AWS와 동일하게 유지

← 인프라 아키텍처 개요 · EKS 아우터 아키텍처 →