🔌 MetalLB 쉽게 이해하기

📑 목차


🤔 문제 상황: LoadBalancer 타입이 pending으로 계속 남는다!

💻 집에서 실습할 때 겪는 문제

# 쿠버네티스 클러스터에서 nginx 배포
kubectl create deployment nginx --image=nginx
 
# LoadBalancer 타입으로 서비스 노출
kubectl expose deployment nginx --type=LoadBalancer --port=80
 
# 서비스 상태 확인
kubectl get svc

결과:

NAME    TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx   LoadBalancer   10.96.85.123   <pending>     80:31234/TCP   5m

문제 발생!

EXTERNAL-IP가 <pending> 상태로 계속 남아있습니다!

🚫 왜 이런 일이 생길까?

LoadBalancer 타입 서비스는 쿠버네티스에게 이렇게 말하는 겁니다:

“외부에서 접근 가능한 IP 주소 하나 달라!”

하지만 온프레미스/개인 환경에서는:

  • AWS처럼 자동으로 ELB를 만들어주는 서비스가 없음
  • 누가 IP 주소를 할당해줄지 모름
  • 결국 <pending> 상태로 계속 대기

☁️ 클라우드 vs 🏠 온프레미스 차이

☁️ AWS/GCP/Azure에서는…

kubectl expose deployment nginx --type=LoadBalancer --port=80
 
# 🎉 자동으로 클라우드 LoadBalancer 생성!
kubectl get svc

결과:

NAME    TYPE           EXTERNAL-IP                           PORT(S)
nginx   LoadBalancer   a1b2c3-1234567890.us-west-2.elb...   80:31234/TCP

성공!

AWS ELB(Elastic Load Balancer)가 자동 생성되어 진짜 인터넷 IP를 할당!

🏠 집/회사 서버에서는…

kubectl expose deployment nginx --type=LoadBalancer --port=80
 
# ❌ 아무도 IP를 할당해주지 않음
kubectl get svc

결과:

NAME    TYPE           EXTERNAL-IP   PORT(S)        AGE
nginx   LoadBalancer   <pending>     80:31234/TCP   ∞

문제!

누가 IP 주소를 할당해줄까요? → 아무도 없습니다!


🔧 MetalLB가 해결하는 방법

🎯 MetalLB의 역할

핵심 개념

MetalLB는 온프레미스 환경에서 **“IP 할당해주는 역할”**을 대신 수행합니다.

📋 MetalLB 설치 및 설정 과정

1단계: MetalLB 설치

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml

2단계: IP 주소 풀 설정

# ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: example-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250  # 이 범위에서 IP 할당

3단계: L2Advertisement 설정

# l2-config.yaml  
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - example-pool

4단계: 설정 적용

kubectl apply -f ip-pool.yaml
kubectl apply -f l2-config.yaml

🎉 결과 확인

# 이제 LoadBalancer 서비스 생성
kubectl expose deployment nginx --type=LoadBalancer --port=80
 
# 서비스 상태 확인
kubectl get svc

성공 결과:

NAME    TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)
nginx   LoadBalancer   10.96.85.123   192.168.1.240   80:31234/TCP

해결!

192.168.1.240으로 실제 접속 가능!

# 브라우저나 curl로 접속 가능
curl http://192.168.1.240
# → nginx 웹페이지 출력!

🌐 Layer 2 vs BGP 모드 실생활 비유

🏠 Layer 2 모드: “동네 슈퍼마켓”

🛒 동작 방식

  • 상황: 동네에 슈퍼 하나만 있음
  • 고객: “콜라 어디서 사지?”
  • 답변: “저기 슈퍼 가세요!”
  • 결과: 모든 고객이 같은 슈퍼로 몰림

📡 기술적 동작

# 클라이언트가 192.168.1.240을 찾을 때
클라이언트: "192.168.1.240 어디 있어?" (ARP 요청)
MetalLB Node: "여기요! 저예요!" (ARP 응답)
→ 해당 노드로만 모든 트래픽 집중

✅ 장점

  • 설정 간단: 공유기 하나면 충분
  • 학습 쉬움: ARP만 이해하면 됨
  • 빠른 구축: 바로 적용 가능

❌ 단점

  • 단일 장애점: 해당 노드 죽으면 서비스 중단
  • 부하 집중: 하나 노드에만 트래픽 몰림

🏢 BGP 모드: “대형 체인점”

🛒 동작 방식

  • 상황: 여러 지점에 같은 브랜드 매장
  • 고객: “콜라 어디서 사지?”
  • 답변: “가까운 매장 아무데나 가세요!”
  • 결과: 고객들이 여러 매장에 분산

📡 기술적 동작

# BGP 라우터들과 협상
MetalLB: "라우터야, 192.168.1.240은 Node1, Node2, Node3이 처리할게"
라우터: "알겠어, 트래픽 여러 노드에 분산해서 보낼게"
→ 트래픽이 여러 노드로 분산 처리

✅ 장점

  • 고가용성: 한 노드 죽어도 다른 노드가 처리
  • 부하분산: 여러 노드에 트래픽 분산
  • 확장성: 노드 추가 시 자동으로 부하분산

❌ 단점

  • 설정 복잡: BGP 라우터 설정 필요
  • 학습 곡선: BGP 프로토콜 이해 필요
  • 네트워크 요구사항: BGP 지원 라우터 필수

📊 언제 어떤 모드를 선택할까?

환경추천 모드이유설정 난이도
개인 실습Layer 2공유기 하나, 빠른 구축⭐ (쉬움)
소규모 개발팀Layer 2간단한 네트워크, 적은 트래픽⭐ (쉬움)
회사 개발서버Layer 2빠른 프로토타이핑⭐⭐ (보통)
회사 스테이징BGP운영 환경과 유사한 구성⭐⭐⭐ (어려움)
회사 운영서버BGP고가용성, 부하분산 필수⭐⭐⭐⭐ (매우 어려움)

💡 실전 예시로 이해하기

🏠 집에서 실습 시나리오

환경

  • 네트워크: 192.168.1.0/24 (일반적인 가정용 공유기)
  • 클러스터: minikube 또는 3대 노드 클러스터
  • 목표: nginx 웹서버를 외부에서 접근 가능하게 만들기

설정 과정

  1. IP 범위 확인
# 현재 네트워크에서 사용 안 하는 IP 범위 찾기
ping 192.168.1.240  # 응답 없으면 사용 가능
ping 192.168.1.241  # 응답 없으면 사용 가능
...
ping 192.168.1.250  # 응답 없으면 사용 가능
  1. MetalLB 설정
# home-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: home-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.245  # 6개 IP만 사용
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: home-l2
  namespace: metallb-system
spec:
  ipAddressPools:
  - home-pool
  1. 테스트 앱 배포
# nginx 배포
kubectl create deployment home-nginx --image=nginx
 
# LoadBalancer 서비스 생성
kubectl expose deployment home-nginx --type=LoadBalancer --port=80
 
# IP 할당 확인
kubectl get svc
  1. 결과
NAME         TYPE           EXTERNAL-IP     PORT(S)
home-nginx   LoadBalancer   192.168.1.240   80:32123/TCP
  1. 접속 테스트
# 같은 네트워크 내 어디서든 접속 가능
curl http://192.168.1.240
# → "Welcome to nginx!" 페이지 출력
 
# 스마트폰이나 다른 PC에서도 접속 가능
# 브라우저에서 http://192.168.1.240 입력

🏢 회사 BGP 시나리오

환경

  • 네트워크: 복잡한 기업 네트워크, BGP 라우터 존재
  • 클러스터: 10대 노드 클러스터
  • 목표: 고가용성 웹서비스 구축

설정 과정

  1. 네트워크팀과 협의
# 할당 받을 IP 범위 협의
# 예: 10.100.50.0/28 (16개 IP 중 14개 사용 가능)
  1. BGP 라우터 설정 (네트워크팀 작업)
# 라우터에서 BGP 피어 설정
# MetalLB와 BGP 세션 설정
  1. MetalLB BGP 설정
# company-bgp-pool.yaml
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: company-router
  namespace: metallb-system
spec:
  myASN: 65001
  peerASN: 65000
  peerAddress: 10.100.1.1
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: company-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.100.50.1-10.100.50.14
---
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: company-bgp
  namespace: metallb-system
spec:
  ipAddressPools:
  - company-pool
  1. 결과: 트래픽이 여러 노드에 자동 분산

🎯 핵심 정리

🔑 MetalLB의 본질

한 줄 요약

MetalLB = 온프레미스 환경에서 LoadBalancer 타입을 실제로 사용 가능하게 만드는 도구

📋 비교 정리

구분MetalLB 없을 때MetalLB 설치 후
LoadBalancer 서비스<pending> 계속실제 IP 할당
외부 접근NodePort로만 가능깔끔한 IP로 접근
포트랜덤 포트 (30000+)표준 포트 (80, 443)
사용성복잡함클라우드처럼 간단

🚀 다음 단계

  1. Layer 2 모드로 시작하여 기본 개념 익히기
  2. 간단한 웹앱으로 LoadBalancer 타입 테스트
  3. 고가용성이 필요하면 BGP 모드 고려
  4. 모니터링 및 로그 분석으로 문제 해결 능력 향상

이제 MetalLB를 이해했다면

온프레미스 환경에서도 클라우드처럼 편리하게 LoadBalancer 서비스를 사용할 수 있습니다!