쿠버네티스의 Service 타입 중 LoadBalancer는
클러스터 외부에서 접근 가능한 IP(External IP)를 자동으로 할당해주는 방식이다.
일반적으로 AWS, GCP, Azure 같은 클라우드 환경에서는
LoadBalancer 타입을 설정하면 클라우드 로드밸런서가 자동으로 생성되지만,
Mac이나 로컬 환경(Docker Desktop, Minikube) 에서는 이를 직접 구성해야 한다.
이를 대신해주는 솔루션이 바로 MetalLB 이다.
LoadBalancer 서비스는 외부 요청을 받아 내부 Pod로 전달하는 역할을 한다.
즉, NodePort보다 한 단계 발전된 방식으로,
외부에서 접근할 수 있는 고정 IP (External IP) 를 부여받는다.
로컬 환경에서는 클라우드 로드밸런서가 없으므로,
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 하여 방금 만든 파일을 적용시켜준다.

이제 nginx 애플리케이션을 배포하고,
LoadBalancer 타입의 서비스를 연결해본다.
파드 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가 지정한 범위에서 선택된 것이다.
브라우저나 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를 사용하여 테스트할 수 있다.
kubectl port-forward svc/nginx-loadbalancer 8080:80
이후 브라우저에서
http://localhost:8080
으로 접속하면 nginx 기본 페이지가 정상적으로 표시된다.
