[쿠버네티스] MetalLB 정리 및 설치 방법
MetalLB 개요
MetalLB는 베어메탈 환경(클라우드 환경은 거의 지원하지 않음)에서 클러스터 내부에 진입점을 마련하기 위한 LoadBalancer이다. 주로 Ingress Controller 혹은 API Gateway 와 같이 배치되며, LoadBalancer가 외부 트래픽을 진입시키면, Ingress Controller가 분배하는 개념이다.

MetalLB는 두 가지 모드(L2, BGP)를 지원하는데, 두 모드의 핵심 차이는 VIP(Virtual IP)를 외부 네트워크에 알리는 방식에 있다.
L2 모드
L2 모드는 서비스마다 speaker 하나가 리더로 뽑혀서 ARP로 응답, 그 노드로만 트래픽을 집중하는 방식이다.

L2 모드 장점
- 설정이 간단 (라우터 BGP 지원 불필요)
- 어떤 네트워크 환경에서도 동작
L2 모드 단점
- 로드 밸런싱 안 됨
- 리더 노드 대역폭이 병목
- failover 느림 (ARP 캐시 갱신 대기)
- 클라이언트와 같은 L2 네트워크에 있어야 함
BGP 모드
BGP 모드는 서비스를 서빙하는 모든 노드의 speaker가 동시에 라우터와 BGP 세션을 맺고 동일 VIP를 광고하면, 라우터가 ECMP로 트래픽을 여러 노드에 분산하는 방식이다.

BGP 모드 장점
- 로드밸런싱을 지원 (여러 노드로 트래픽 분산)
- failover 빠름
- L2 제약 없음 (다른 서브넷/라우팅 환경에서도 동작)
BGP 모드 단점
- 라우터가 BGP/ECMP를 지원해야 함
- 설정 복잡
- 네트워크 팀/장비 협조 필요
MetalLB 설치 실습
실습에서는 L2 방식만 설치할 예정이며, Nginx 를 띄워 접근이 되는지 까지 테스트 해볼 예정이다.
설치 방법
Kubernetes v1.14.2 이후에 kube-proxy 를 IPVS 모드로 사용중이라면 strict ARP mode를 켜준다.
kubectl edit configmap -n kube-system kube-proxy
# 해당 부분을 추가 혹은 설정 해준다.
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
metalLB 시스템을 위한 기본 컴포넌트들을 세팅 해준다.
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.16.1/config/manifests/metallb-frr-k8s.yaml
이외에 추가적으로 VIP(Virtual IP Address)로 사용 될 IP 풀과 광고 방식을 설정하는 리소스를 만든다.
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: sandbox
namespace: metallb-system
spec:
addresses:
- 192.168.56.20-192.168.56.30
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: local
namespace: metallb-system
spec:
ipAddressPools:
- sandbox
설치 결과
정상 설치가 완료되면 다음과 같이 확인할 수 있다.

각 파트를 정리하면 다음과 같다.
| 구성 요소 | 개수 | 리소스 타입 | 주 역할 |
| controller | 1 | Deployment | LoadBalancer Service에 외부 IP를 할당하고 MetalLB CR을 조정 |
| speaker | 노드 당 1 | DaemonSet | 각 노드에서 광고 대상과 상태를 관리하고 FRR 설정을 연동 |
| frr-k8s-daemon | 노드 당 1 | DaemonSet | 실제 FRR/BGP 라우팅 데몬 실행 |
| frr-k8s-statuscleaner | 1 | Deployment | FRR 관련 상태 리소스 정리 |
| webhookservices | 2 | ClusterIpService | MetalLB/FRR 설정 CR 생성·수정 시 검증 |
로드 밸런서 서비스 연결
이제 nginx 하나 띄우고 LoadBalancer 타입으로 서비스를 만들어서 외부와 연결해보자
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-loadbalancer
spec:
replicas: 1
selector:
matchLabels:
app: nginx-loadbalancer
template:
metadata:
labels:
app: nginx-loadbalancer
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-loadbalancer
spec:
type: LoadBalancer
selector:
app: nginx-loadbalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
적용 후에, nginx-loadbalancer 서비스를 보면 EXTERNAL-IP가 잡혀있는 모습을 볼 수 있다.

curl 을 통해서 nginx 에 접근이 가능한지 확인을 하고 이번 실습을 마치고자 한다.
