로컬 Kubernetes에서 MetalLB로 LoadBalancer IP 할당하기

2026. 5. 20. 11:02·Devops/Kubernetes

로컬 Kubernetes 클러스터에서는 클라우드 환경처럼 LoadBalancer 타입 Service에 외부 IP가 자동으로 할당되지 않습니다.

예를 들어 클라우드 Kubernetes 환경에서는 type: LoadBalancer Service를 생성하면 클라우드 로드밸런서가 생성되고 외부 IP가 할당됩니다.
하지만 로컬 Kubernetes 환경에서는 별도의 로드밸런서 구현체가 없기 때문에 Service의 EXTERNAL-IP가 <pending> 상태로 남는 경우가 많습니다.

이 문제를 해결하기 위해 사용할 수 있는 도구가 MetalLB입니다.

MetalLB는 로컬 또는 온프레미스 Kubernetes 환경에서 LoadBalancer 타입 Service에 외부 IP를 할당해주는 로드밸런서 구현체입니다.

이번 글에서는 MetalLB를 설치하고, Layer 2 모드로 IP 대역을 설정하는 과정을 정리합니다.

참고 자료:

  • https://metallb.io/installation/

1. MetalLB를 사용하는 이유

로컬 Kubernetes 환경에서 다음과 같은 Service를 생성했다고 가정합니다.

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  type: LoadBalancer
  selector:
    app: example
  ports:
    - port: 80
      targetPort: 8080

클라우드 환경이라면 외부 IP가 자동으로 할당되지만, 로컬 환경에서는 일반적으로 다음처럼 EXTERNAL-IP가 할당되지 않습니다.

kubectl get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)
example-service   LoadBalancer   10.96.100.10    <pending>     80:30000/TCP

MetalLB를 설치하면 로컬 네트워크에서 사용할 수 있는 IP 대역을 Kubernetes의 LoadBalancer Service에 할당할 수 있습니다.


2. kube-proxy strictARP 설정

MetalLB를 Layer 2 모드로 사용할 때, kube-proxy가 IPVS 모드로 동작 중이라면 strictARP 설정을 확인해야 합니다.

kube-proxy ConfigMap을 수정합니다.

kubectl edit configmap -n kube-system kube-proxy

설정 예시는 다음과 같습니다.

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

strictARP는 IPVS 모드에서 ARP 응답이 올바르게 처리되도록 하기 위한 설정입니다.

kube-proxy가 IPVS 모드가 아니라면 이 설정이 필요하지 않을 수 있습니다.
현재 클러스터에서 kube-proxy가 어떤 모드로 동작하는지 먼저 확인하는 것이 좋습니다.


3. MetalLB 설치

Helm Repository를 추가하고 업데이트합니다.

helm repo add metallb https://metallb.github.io/metallb
helm repo update

MetalLB를 설치합니다.

helm install metallb metallb/metallb \
  -n metallb \
  --create-namespace

설치 후 MetalLB 관련 Pod가 정상적으로 실행 중인지 확인합니다.

kubectl get pod -n metallb

controller, speaker Pod가 정상적으로 Running 상태인지 확인합니다.


4. Layer 2 모드 IP Pool 설정

로컬 클러스터에서는 간단한 LoadBalancer IP 할당을 위해 MetalLB Layer 2 모드를 사용할 수 있습니다.

Layer 2 모드에서는 MetalLB가 지정한 IP 대역 중 하나를 LoadBalancer Service에 할당하고, 해당 IP에 대한 ARP 응답을 처리합니다.

IPAddressPool 설정

먼저 LoadBalancer Service에 할당할 IP 대역을 설정합니다.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: metallb-ip-pool
  namespace: metallb
spec:
  addresses:
    - 172.25.46.100-172.25.46.200

위 설정은 MetalLB가 172.25.46.100부터 172.25.46.200 사이의 IP를 LoadBalancer Service에 할당할 수 있도록 정의합니다.

이 IP 대역은 현재 로컬 네트워크에서 사용 가능한 대역이어야 합니다.
공유기 DHCP 범위와 겹치거나 이미 다른 장비가 사용 중인 IP를 지정하면 IP 충돌이 발생할 수 있습니다.

L2Advertisement 설정

다음으로 MetalLB가 위 IP Pool을 Layer 2 모드로 광고하도록 설정합니다.

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: metallb-l2-advertisement
  namespace: metallb
spec:
  ipAddressPools:
    - metallb-ip-pool

L2Advertisement는 MetalLB가 어떤 IP Pool을 Layer 2 방식으로 네트워크에 광고할지 정의합니다.

리소스를 적용합니다.

kubectl apply -f k8s/metallb/ip-address-pool.yaml
kubectl apply -f k8s/metallb/l2-advertisement.yaml

5. LoadBalancer IP 할당 확인

MetalLB 설정이 완료되면 LoadBalancer 타입 Service에 외부 IP가 할당되는지 확인합니다.

kubectl get svc -A

또는 특정 네임스페이스의 Service만 확인할 수 있습니다.

kubectl get svc -n <namespace>

EXTERNAL-IP에 172.25.46.100-172.25.46.200 범위 안의 IP가 표시되면 MetalLB가 정상적으로 동작하는 것입니다.

예시:

NAME              TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)
example-service   LoadBalancer   10.96.100.10    172.25.46.100   80:30000/TCP

이후 로컬 네트워크에서 해당 IP로 접근할 수 있습니다.

curl http://172.25.46.100

정상적으로 응답이 반환된다면 다음 흐름이 동작하는 것입니다.

Client
  → MetalLB가 할당한 External IP
  → LoadBalancer Service
  → Kubernetes Service
  → Pod

6. 정리

이번 글에서는 로컬 Kubernetes 클러스터에서 MetalLB를 사용해 LoadBalancer 타입 Service에 외부 IP를 할당하는 방법을 정리했습니다.

구성 과정은 다음과 같습니다.

  1. kube-proxy의 strictARP 설정 확인
  2. Helm으로 MetalLB 설치
  3. IPAddressPool로 할당 가능한 IP 대역 정의
  4. L2Advertisement로 Layer 2 광고 설정
  5. LoadBalancer 타입 Service의 EXTERNAL-IP 확인

MetalLB를 사용하면 로컬 Kubernetes 환경에서도 클라우드 환경과 비슷하게 LoadBalancer 타입 Service를 사용할 수 있습니다.

특히 Envoy Gateway, NGINX Ingress Controller, Traefik처럼 LoadBalancer Service를 생성하는 컴포넌트와 함께 사용하면, 로컬 환경에서도 외부 IP를 통해 서비스를 안정적으로 테스트할 수 있습니다.

References

  • https://metallb.io/installation/

'Devops > Kubernetes' 카테고리의 다른 글

Helm으로 Argo CD 설치 후 Gateway API와 TLS로 접속 구성하기  (0) 2026.05.26
Kubernetes kubelet의 컨테이너 로그 로테이션 설정 정리  (0) 2026.05.25
Kubernetes 로컬 환경에 Private Registry 배포하고 이미지 Push/Pull 설정하기  (0) 2026.05.20
Gateway API와 Envoy Gateway로 로컬 Kubernetes 서비스 노출하기  (0) 2026.05.20
Kubernetes에서 NFS 스토리지 구성하기  (0) 2026.05.20
'Devops/Kubernetes' 카테고리의 다른 글
  • Kubernetes kubelet의 컨테이너 로그 로테이션 설정 정리
  • Kubernetes 로컬 환경에 Private Registry 배포하고 이미지 Push/Pull 설정하기
  • Gateway API와 Envoy Gateway로 로컬 Kubernetes 서비스 노출하기
  • Kubernetes에서 NFS 스토리지 구성하기
hwara_
hwara_
배움의 기쁨
  • hwara_
    기록 저장소
    hwara_
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 일상 (1)
        • 회고 (1)
      • 프로젝트 (0)
      • OS (2)
        • Mac (0)
        • Linux (2)
      • 클라우드 (1)
        • AWS (0)
        • CloudFlare (1)
      • Devops (10)
        • Docker (1)
        • Kubernetes (7)
        • Terraform (0)
        • GitHub Actions (2)
      • 알고리즘 (0)
      • Git (2)
      • Database (1)
      • Language (3)
        • Python (3)
      • 환경구성 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hwara_
로컬 Kubernetes에서 MetalLB로 LoadBalancer IP 할당하기
상단으로

티스토리툴바