로컬 Kubernetes 클러스터에서는 클라우드 환경처럼 LoadBalancer 타입 Service에 외부 IP가 자동으로 할당되지 않습니다.
예를 들어 클라우드 Kubernetes 환경에서는 type: LoadBalancer Service를 생성하면 클라우드 로드밸런서가 생성되고 외부 IP가 할당됩니다.
하지만 로컬 Kubernetes 환경에서는 별도의 로드밸런서 구현체가 없기 때문에 Service의 EXTERNAL-IP가 <pending> 상태로 남는 경우가 많습니다.
이 문제를 해결하기 위해 사용할 수 있는 도구가 MetalLB입니다.
MetalLB는 로컬 또는 온프레미스 Kubernetes 환경에서 LoadBalancer 타입 Service에 외부 IP를 할당해주는 로드밸런서 구현체입니다.
이번 글에서는 MetalLB를 설치하고, Layer 2 모드로 IP 대역을 설정하는 과정을 정리합니다.
참고 자료:
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를 할당하는 방법을 정리했습니다.
구성 과정은 다음과 같습니다.
- kube-proxy의 strictARP 설정 확인
- Helm으로 MetalLB 설치
- IPAddressPool로 할당 가능한 IP 대역 정의
- L2Advertisement로 Layer 2 광고 설정
- LoadBalancer 타입 Service의 EXTERNAL-IP 확인
MetalLB를 사용하면 로컬 Kubernetes 환경에서도 클라우드 환경과 비슷하게 LoadBalancer 타입 Service를 사용할 수 있습니다.
특히 Envoy Gateway, NGINX Ingress Controller, Traefik처럼 LoadBalancer Service를 생성하는 컴포넌트와 함께 사용하면, 로컬 환경에서도 외부 IP를 통해 서비스를 안정적으로 테스트할 수 있습니다.
References
'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 |