[MacOS 환경 #9] LoadBalancer 서비스 실습 (MetalLB를 이용한 외부 IP 할당)

도람·2025년 11월 13일

쿠버네티스의 Service 타입 중 LoadBalancer는
클러스터 외부에서 접근 가능한 IP(External IP)를 자동으로 할당해주는 방식이다.

일반적으로 AWS, GCP, Azure 같은 클라우드 환경에서는
LoadBalancer 타입을 설정하면 클라우드 로드밸런서가 자동으로 생성되지만,
Mac이나 로컬 환경(Docker Desktop, Minikube) 에서는 이를 직접 구성해야 한다.

이를 대신해주는 솔루션이 바로 MetalLB 이다.

LoadBalancer란?

LoadBalancer 서비스는 외부 요청을 받아 내부 Pod로 전달하는 역할을 한다.
즉, NodePort보다 한 단계 발전된 방식으로,
외부에서 접근할 수 있는 고정 IP (External IP) 를 부여받는다.


MetalLB 설치

로컬 환경에서는 클라우드 로드밸런서가 없으므로,
MetalLB를 이용해 LoadBalancer IP를 직접 할당해줘야 한다.

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

그럼 이렇게 설치가 된다.


설치 후, MetalLB가 사용할 IP 대역을 지정한다.
아래 예시는 192.168.1.240 ~ 192.168.1.250 범위를 LoadBalancer용으로 지정한 예시이다.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: my-ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: my-l2-advertisement
  namespace: metallb-system

vim metallb-config.yaml 명령어 입력 후 해당 yaml 파일 설정을 복사붙여넣기 한다.


kubectl apply -f metallb-config.yaml

apply 하여 방금 만든 파일을 적용시켜준다.


LoadBalancer 서비스 배포

이제 nginx 애플리케이션을 배포하고,
LoadBalancer 타입의 서비스를 연결해본다.

Deployment (파드 3개 복제)

파드 3개를 순서대로 생성하도록 하는 디플로이먼트를 생성한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

vim nginx-deploy.yaml로 해당 설정을 저장한 후, 적용시킨다.


로드밸런서 서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
  type: LoadBalancer

vim nginx-loadbalancer.yaml로 해당 설정을 저장한 후 , apply 시켜준다.

결과 확인


EXTERNAL-IP에 192.168.1.240이 자동으로 할당된 것을 볼 수 있다.
이 IP는 MetalLB가 지정한 범위에서 선택된 것이다.


외부 접속 테스트 (Mac 환경의 한계)

브라우저나 curl 명령어로 테스트 가능하다.

curl http://192.168.1.240

또는 http://192.168.1.240 으로 접속하면 기본 페이지가 정상적으로 표시된다.
인데,

나는 이 과정에서 외부 접속이 되지 않는 문제를 겪었다.
MetalLB 설정 자체는 올바르게 적용되었지만,
Mac 환경에서는 내부적으로 Docker Desktop의 가상 네트워크 구조 때문에
외부 IP로 트래픽이 직접 전달되지 않는 경우가 많다.

예를 들어,
192.168.1.240 과 같은 IP를 MetalLB에서 할당하더라도
실제 호스트 네트워크(맥OS) 나 라우터 설정에서
그 IP로 트래픽을 전달하지 못하면 접속이 불가능하다.

이 문제는 다른 사용자 사례에서도 자주 등장하며,
“IP는 할당되었지만, 라우팅이 되지 않아 접근할 수 없다”는 형태의 글을 찾아볼 수 있었다. 그래서 해결하기 위해 포트포워딩을 사용했다.

Port Forward 사용

서비스와 파드가 정상적으로 동작하는지 확인하기 위해
Port Forward를 사용하여 테스트할 수 있다.

kubectl port-forward svc/nginx-loadbalancer 8080:80

이후 브라우저에서
http://localhost:8080

으로 접속하면 nginx 기본 페이지가 정상적으로 표시된다.

profile
정도를 걷는 엔지니어

0개의 댓글