인프라/Kubernetes

[쿠버네티스] MetalLB 정리 및 설치 방법

Hun's blog 2026. 8. 31. 21:00

MetalLB 개요

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

 

MetalLB는 두 가지 모드(L2, BGP)를 지원하는데, 두 모드의 핵심 차이는 VIP(Virtual IP)를 외부 네트워크에 알리는 방식에 있다.

L2 모드

L2 모드는 서비스마다 speaker 하나가 리더로 뽑혀서 ARP로 응답, 그 노드로만 트래픽을 집중하는 방식이다.

L2 모드

L2 모드 장점

  • 설정이 간단 (라우터 BGP 지원 불필요)
  • 어떤 네트워크 환경에서도 동작

L2 모드 단점

  • 로드 밸런싱 안 됨
  • 리더 노드 대역폭이 병목
  • failover 느림 (ARP 캐시 갱신 대기)
  • 클라이언트와 같은 L2 네트워크에 있어야 함

BGP 모드

BGP 모드는 서비스를 서빙하는 모든 노드의 speaker가 동시에 라우터와 BGP 세션을 맺고 동일 VIP를 광고하면, 라우터가 ECMP로 트래픽을 여러 노드에 분산하는 방식이다.

BGP 모드

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 에 접근이 가능한지 확인을 하고 이번 실습을 마치고자 한다.