물뮤 백엔드 네트워크 구성 완전 정복! 
안녕하세요, 개발자 여러분! 오늘은 제가 물뮤(MoolMeow) 프로젝트에서 온프레미스 쿠버네티스 클러스터를 외부에 어떻게 연결했는지 네트워크 구성에 대해 알려드릴게요. 집에서 서버 굴리는 분들에게 꿀팁이 될 거예요!
전체 네트워크 흐름도
먼저 큰 그림부터 봐볼까요? 물뮤의 네트워크는 여러 계층으로 구성되어 있답니다.
클라이언트
↓
Cloudflare
(DNS + HTTPS/TLS termination)
↓
MikroTik Router
(포트포워딩 + NAT + 방화벽)
↓
MetalLB
(Kubernetes LoadBalancer)
↓
Ingress Controller
(nginx ingress)
↓
Kubernetes Services
(ClusterIP)
↓
Pods
(Application backend)
이제 각 계층을 자세히 살펴볼게요!
1단계: Cloudflare
역할: 글로벌 DNS와 HTTPS 보안의 첫 관문
DNS 설정
*.moolmeow.local
→ 우리 집 IP 주소로 연결- 집 IP가 바뀌어도 DNS가 자동으로 업데이트되는 장점이 있어요
보안 이점
- 무료 SSL/TLS 인증서 제공 (Let’s Encrypt)
- DDoS 보호 기능
- “Full (strict)” 모드로 엔드-투-엔드 암호화
2단계: MikroTik 라우터
역할: 외부에서 들어오는 트래픽을 쿠버네티스로 안전하게 전달
포트포워딩 설정
- 외부에서 들어오는 80/443 포트를 쿠버네티스 LoadBalancer IP로 전달
- 예:
외부 포트 80 → 10.98.63.xx:80
방화벽 설정
- 필요한 포트만 허용하는 엄격한 규칙 적용
- 국가별 IP 차단 기능도 활용 가능 (특정 국가에서의 접근 차단)
NAT 설정
- 내부 Kubernetes 노드가 외부로 통신할 수 있도록 src-nat 설정
- 내부 IP 주소 체계 보호 (사설 IP 사용)
3단계: MetalLB
역할: 베어메탈 환경에서 LoadBalancer 구현 (클라우드 없이!)
설정 방법
- IP 주소 풀 설정:
10.98.63.xx/xx
범위 지정 - L2 광고 모드 활성화
- IP 주소 풀 설정:
작동 원리
- 쿠버네티스 서비스가 LoadBalancer 타입으로 요청하면 IP 할당
- ARP 요청에 응답하여, 로컬 네트워크에 해당 IP로 트래픽을 라우팅하도록 알림
실제 설정 예시
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 10.98.63.50-10.98.63.70 # 사용할 IP 범위
4단계: NGINX Ingress Controller
역할: 트래픽을 여러 서비스로 라우팅 (도메인별, 경로별 분배)
설치 방법
- Helm 차트로 간편하게 설치
helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace
주요 기능
- 호스트 기반 라우팅 (각 서비스마다 다른 서브도메인)
- 경로 기반 라우팅 (같은 도메인 내에서 URL 경로에 따라 분배)
- TLS 인증서 관리 (필요시)
- 속도 제한, 리다이렉션 등 다양한 고급 기능
실제 Ingress 예시
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minio-console namespace: minio spec: ingressClassName: nginx rules: - host: minio.moolmeow.local http: paths: - path: / pathType: Prefix backend: service: name: minio-console port: number: 9001
5단계: Kubernetes Services
역할: 파드 집합에 대한 안정적인 엔드포인트 제공
주요 서비스
- ArgoCD 서버
- Jenkins
- MinIO 콘솔
- 기타 백엔드 서비스들
설정 방식
- 대부분 ClusterIP 타입 사용 (내부 통신용)
- Selector로 적절한 파드 타겟팅
- 필요한 포트 노출
6단계: 애플리케이션 Pods
역할: 실제 애플리케이션 실행
구성 요소
- 물뮤 백엔드 API 서버
- 인증 서비스
- 데이터베이스
- 캐시 서버
- 미디어 저장소
스토리지 연결
- NFS 기반 PV/PVC로 데이터 영속성 확보
- MinIO 객체 스토리지 사용
유용한 팁
로컬 개발 환경에서 테스트하기
/etc/hosts
파일에 다음 내용 추가10.98.63.xx jenkins.moolmeow.local10.98.63.xx argocd.moolmeow.local10.98.63.xx minio.moolmeow.local
보안 강화 방법
- Cloudflare의 무료 WAF(웹 애플리케이션 방화벽) 활용
- MikroTik에서 불필요한 포트 차단
- 쿠버네티스 네트워크 정책 적용
모니터링 설정
- 프로메테우스 + 그라파나로 네트워크 트래픽 모니터링
- 알림 설정하여 비정상 트래픽 감지
물뮤 네트워크 구성의 장점
- 비용 효율성 – 클라우드 서비스 없이도 LoadBalancer 활용 가능
- 보안성 – 여러 계층의 보안 장치
- 확장성 – 트래픽 증가에 따라 쉽게 확장 가능
- 유연성 – 다양한 서비스를 하나의 IP로 호스팅
마무리
집에서 쿠버네티스 클러스터를 운영하면서 외부에 서비스를 제공하는 것은 쉽지 않은 일이지만, 이런 계층화된 네트워크 구성을 통해 안정적이고 안전하게 서비스를 운영할 수 있습니다. 물뮤 프로젝트를 통해 배운 이 구성이 여러분의 홈 서버 운영에도 도움이 되길 바랍니다!
궁금한 점이나 더 자세히 알고 싶은 부분이 있으시면 댓글로 남겨주세요! 기술적인 세부사항도 공유해 드릴 수 있어요.
MoolMeow Backend Network Architecture: A Comprehensive Guide! 
Hello fellow developers! Today I’m excited to share how I connected my on-premises Kubernetes cluster to the internet for the MoolMeow project. If you’re running servers from home, this will be super helpful!
Overall Network Flow
Let’s start with the big picture! The MoolMeow network is structured in multiple layers:
Client
↓
Cloudflare
(DNS + HTTPS/TLS termination)
↓
MikroTik Router
(Port forwarding + NAT + Firewall)
↓
MetalLB
(Kubernetes LoadBalancer)
↓
Ingress Controller
(nginx ingress)
↓
Kubernetes Services
(ClusterIP)
↓
Pods
(Application backend)
Now, let’s explore each layer in detail!
Layer 1: Cloudflare
Role: Global DNS and first line of HTTPS security
DNS Configuration
*.moolmeow.local
→ Your home IP address- Benefit: DNS updates automatically if your home IP changes
Security Benefits
- Free SSL/TLS certificates (Let’s Encrypt)
- DDoS protection
- “Full (strict)” mode for end-to-end encryption
Layer 2: MikroTik Router
Role: Securely forwarding external traffic to Kubernetes
Port Forwarding Configuration
- Forward external ports 80/443 to Kubernetes LoadBalancer IP
- Example:
External Port 80 → 10.98.63.xx:80
Firewall Settings
- Strict rules allowing only necessary ports
- Optional country-based IP blocking (block access from specific countries)
NAT Configuration
- src-nat setup to allow internal Kubernetes nodes to communicate externally
- Protects internal IP address scheme (using private IPs)
Layer 3: MetalLB
Role: Implementing LoadBalancer in bare-metal environments (without cloud!)
Setup Method
- IP address pool configuration: Specify
10.98.63.xx/xx
range - Enable L2 advertisement mode
- IP address pool configuration: Specify
How It Works
- Assigns IPs when Kubernetes services request LoadBalancer type
- Responds to ARP requests, instructing local network to route traffic to that IP
Real Configuration Example
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 10.98.63.50-10.98.63.70 # IP range to use
Layer 4: NGINX Ingress Controller
Role: Routing traffic to various services (by domain, by path)
Installation Method
- Easy installation with Helm chart
helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace
Key Features
- Host-based routing (different subdomain for each service)
- Path-based routing (distribution within same domain based on URL path)
- TLS certificate management (if needed)
- Advanced features like rate limiting, redirections, etc.
Real Ingress Example
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minio-console namespace: minio spec: ingressClassName: nginx rules: - host: minio.moolmeow.local http: paths: - path: / pathType: Prefix backend: service: name: minio-console port: number: 9001
Layer 5: Kubernetes Services
Role: Providing stable endpoints for pod sets
Main Services
- ArgoCD server
- Jenkins
- MinIO console
- Other backend services
Configuration Approach
- Mostly using ClusterIP type (for internal communication)
- Targeting appropriate pods with Selector
- Exposing necessary ports
Layer 6: Application Pods
Role: Running actual applications
Components
- MoolMeow Backend API server
- Authentication service
- Database
- Cache server
- Media storage
Storage Connection
- Data persistence with NFS-based PV/PVC
- Using MinIO object storage
Useful Tips
Testing in Local Development Environment
- Add the following to your
/etc/hosts
file10.98.63.xx jenkins.moolmeow.local10.98.63.xx argocd.moolmeow.local10.98.63.xx minio.moolmeow.local
Enhancing Security
- Utilize Cloudflare’s free WAF (Web Application Firewall)
- Block unnecessary ports on MikroTik
- Apply Kubernetes network policies
Setting Up Monitoring
- Monitor network traffic with Prometheus + Grafana
- Configure alerts to detect abnormal traffic
Benefits of MoolMeow Network Architecture
- Cost Efficiency – Using LoadBalancer without cloud services
- Security – Multiple layers of security measures
- Scalability – Easy expansion as traffic increases
- Flexibility – Hosting multiple services with a single IP
Conclusion
Running a Kubernetes cluster at home and exposing services externally isn’t easy, but with this layered network configuration, you can operate services reliably and securely. I hope that the configuration we learned through the MoolMeow project helps with your home server operations too!
If you have any questions or want to know more details, please leave a comment! I’d be happy to share more technical specifics.