맥북 한 대로 만든 사무실 Kubernetes

kind 클러스터, Envoy Gateway, dev/prd Namespace. 사무실 서버 전체 구조를 한 장으로 정리했습니다.

클라우드 하모니 홈페이지는 사무실 맥북 한 대에서 돌아갑니다. 작은 규모지만 구조는 클라우드와 똑같이 잡았습니다. 나중에 EKS나 GKE로 옮길 때 거의 그대로 가져갈 수 있게 하기 위해서입니다.

요청 흐름

사용자 브라우저 Cloudflare Quick Tunnel 이 Mac / 사무실 LAN localhost:80 사무실 Mac · Docker Desktop kind 클러스터 claudharmony · Kubernetes v1.37 노드 2대 = Docker 컨테이너 (control-plane, worker) tunnel cloudflared · ns마다 1개 ns envoy-gateway-system Envoy Gateway Gateway :80 NodePort 30080 /actuator/** → 차단 ns dev Host: dev.localhost HTTPRoute / → web web SvelteKit :3000 api Spring :8080 내부 전용 · http://api ns prd Host: 그 외 전부 (기본 라우트) HTTPRoute / → web web SvelteKit :3000 api Spring :8080 내부 전용 · http://api https://*.trycloudflare.com 터널 :80 → NodePort 30080 사용자 → Cloudflare Tunnel → Envoy Gateway → HTTPRoute → web → api. Host 헤더로 dev / prd 를 나눕니다

구성 요소

역할 사용 기술 AWS로 치면
클러스터 kind (K8s v1.37), 노드 2대 EKS
로드밸런서 Envoy Gateway (Gateway API) ALB
라우팅 규칙 HTTPRoute 리스너 규칙
환경 분리 Namespace dev, prd 계정 / VPC
앱 Deployment + Service ECS Service + Target Group
외부 공개 Cloudflare Tunnel Internet Gateway
코드 관리 Terraform Terraform

포인트

  • 호스트에 열린 포트는 80 하나뿐입니다. 어느 환경으로 보낼지는 Host 헤더가 정합니다.
  • prd 라우트는 hostnames를 비워서 기본값(catch-all)이 되게 하고, dev 라우트는 dev.localhost일 때만 매칭합니다.
  • /actuator/**는 Gateway에서 /로 리다이렉트해 외부에 노출하지 않습니다. Probe는 kubelet이 Pod를 직접 호출하므로 영향이 없습니다.
  • 기존 ~/.kube/config를 건드리지 않으려고 kubeconfig를 따로 씁니다.

kind는 Docker 컨테이너 하나가 노드 하나입니다. 이미 Docker Desktop이 있는 환경이라 가장 가볍게 시작할 수 있었습니다.

← 기술블로그 목록