DevOps/K8S

[K8S] MetalLB

kyoulho 2024. 10. 10. 20:56

MetalLB는 Kubernetes 클러스터에서 외부 트래픽을 서비스로 라우팅 하기 위한 로드 밸런서를 제공한다. 클라우드 환경에서는 클라우드 제공업체의 로드 밸런서 서비스를 활용할 수 있지만, 온프레미스나 베어메탈 환경에서는 이러한 서비스가 제공되지 않는다. 이때 MetalLB가 중요한 역할을 한다.

MetalLB가 하는 일

  • 외부 IP 할당:MetalLB는 Kubernetes 서비스에 LoadBalancer 타입의 외부 IP를 할당한다. 이를 통해 외부 사용자가 클러스터 내의 서비스를 접근할 수 있도록 한다.
  • 트래픽 라우팅: 할당된 외부 IP로 들어오는 트래픽을 적절한 Kubernetes 노드 및 파드로 라우팅 한다. 이는 ARP(Address Resolution Protocol) 또는 NDP(Neighbor Discovery Protocol)를 사용하여 이루어진다.
  • 로드 밸런싱: MetalLB는 들어오는 트래픽을 여러 파드에 분산시켜 부하를 고르게 분산시킨다. 이를 통해 서비스의 안정성과 성능을 향상시킨다.
  • 광고(Advertisement): MetalLB는 할당한 외부 IP를 네트워크에 광고하여, 외부 트래픽이 해당 IP로 라우팅 되도록 한다. 이는 Layer 2 모드에서는 ARP/NDP, BGP(Border Gateway Protocol) 모드에서는 BGP를 통해 이루어진다.
광고(Advertisement)란?
여기서 광고(advertisement)는 MetalLB가 IPAddressPool에서 할당한 IP 주소를 클러스터 외부 네트워크에 알려주는 과정을 의미한다. Layer 2 모드에서는 주로 ARP(Address Resolution Protocol)나 NDP(Neighbor Discovery Protocol)를 사용하여 IP 주소를 네트워크에 “광고”함으로써 해당 IP로의 트래픽이 MetalLB의 스피커(Pod)에 전달되도록 한다.
이는 다른 네트워크 장치들이 해당 IP 주소로의 트래픽을 MetalLB가 관리하는 노드로 라우팅 하게 만드는 중요한 과정이다.

MetalLB의 동작 방식

  • Layer 2 모드: MetalLB는 ARP(Address Resolution Protocol) 또는 NDP(Neighbor Discovery Protocol)를 사용하여 IP 주소를 네트워크에 광고한다. 이는 네트워크 내의 다른 장치들이 해당 IP로의 트래픽을 MetalLB가 관리하는 노드로 라우팅하게 만든다.
  • BGP 모드: MetalLB는 BGP(Border Gateway Protocol)를 사용하여 외부 라우터와 통신하고, IP 주소를 광고한다. 이는 대규모 네트워크 환경에서 더욱 효율적인 트래픽 라우팅을 가능하게 한다. BGP 모드는 네트워크 관리자와의 협력이 필요하며, 보다 복잡한 설정을 요구한다.


MetalLB 설치 방법


사전 준비 사항

MetalLB가 사용할 IP 주소 범위를 미리 정해야 한다. 이 IP는 클러스터 외부에서 접근 가능한 IP여야 하며, 네트워크 관리자와 협의하여 충돌이 없도록 해야 한다.

1. MetalLB 매니페스트 적용

먼저 MetalLB의 매니페스트 파일을 클러스터에 적용한다. 이를 통해 MetalLB의 기본 구성 요소들이 설치된다.

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

참고: 최신 버전의 매니페스트는 MetalLB GitHub 릴리스 페이지에서 확인할 수 있다.

2. MetalLB 설정 구성

MetalLB는 두 가지 모드, 즉 Layer 2 모드와 BGP 모드를 지원한다. 여기서는 설정이 간단한 Layer 2 모드를 기준으로 설명한다.

2.1. IPAddressPool 리소스 정의

IPAddressPool 리소스는 MetalLB가 할당할 수 있는 IP 주소 범위를 정의한다. 클러스터 내에서 외부 서비스에 할당될 IP 범위를 지정해야 한다.

# metallb-config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: my-ip-pool
spec:
  addresses:
    - 192.168.1.240-192.168.1.250  # 사용할 IP 범위
  • 지정한 IP 범위는 네트워크 내에서 유일해야 한다. 이미 다른 장치나 서비스에서 사용 중인 IP를 지정하면 IP 충돌이 발생할 수 있다. 

2.2. L2Advertisement 리소스 정의

L2Advertisement 리소스는 MetalLB가 IPAddressPool에서 할당한 IP 주소를 어떻게 광고(advertise) 할지를 정의한다.

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  namespace: metallb-system
  name: my-l2-advertisement
spec:
  ipAddressPools:
    - my-ip-pool
  • spec.ipAddressPools: 이 광고 설정에서 사용할 IPAddressPool을 지정한다. 여기서는 앞서 정의한 my-ip-pool을 사용한다.

3. 설정 적용

위에서 작성한 설정 파일을 클러스터에 적용한다.

kubectl apply -f metallb-config.yaml

4. 설치 확인

MetalLB가 제대로 설치되었는지 확인하기 위해 MetalLB 관련 Pod들이 정상적으로 실행 중인지 확인한다.

kubectl get pods -n metallb-system
# 출력 예시:
NAME                          READY   STATUS    RESTARTS   AGE
controller-5f6d8c7d9b-abcde    1/1     Running   0          5m
speaker-6f9d8c7d9b-fghij       1/1     Running   0          5m

 

5. 추가 설정 (선택 사항)

MetalLB 설치 후 필요에 따라 추가 설정을 할 수 있다.

  • RBAC 설정: 클러스터 보안을 강화하기 위해 Role-Based Access Control(RBAC) 설정을 추가로 구성할 수 있다. 이는 MetalLB가 클러스터 내에서 필요한 권한만을 가지도록 제한하는 역할을 한다.
  • 모니터링 및 로깅: MetalLB의 상태를 모니터링하기 위해 Prometheus 및 Grafana와 같은 도구와 연동할 수 있다. 이를 통해 MetalLB의 성능과 상태를 실시간으로 파악할 수 있다.
  • BGP 모드 사용: 보다 복잡한 네트워크 환경에서는 BGP(Border Gateway Protocol) 모드를 사용하여 MetalLB를 구성할 수 있다. 이는 네트워크 관리자와의 협력이 필요하며, 대규모 네트워크에서 효율적으로 IP를 광고할 수 있다.

 

MetalLB 동작 확인


MetalLB가 정상적으로 동작하는지 확인하기 위해 LoadBalancer 타입의 서비스를 생성하고 외부 IP가 할당되는지 테스트한다.

1. NGINX 배포 및 서비스 생성

먼저 NGINX를 배포하고 LoadBalancer 타입의 서비스를 생성한다.

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer

2. 서비스 확인

서비스가 생성되면 외부 IP가 할당되는지 확인한다.

kubectl get svc
# 출력 예시:
# EXTERNAL-IP에 MetalLB에서 지정한 IP 범위 내의 IP(192.168.1.240)가 할당되었는지 확인한다.
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
nginx   LoadBalancer   10.43.123.45    192.168.1.240    80:31380/TCP   2m

3. 접속 테스트

할당된 외부 IP를 통해 NGINX 서비스에 접근할 수 있는지 테스트한다. 브라우저나 curl 명령어를 사용할 수 있다.

curl http://192.168.1.240

NGINX의 기본 페이지가 응답해야 정상적으로 MetalLB가 동작하는 것이다.

 

728x90

'DevOps > K8S' 카테고리의 다른 글

[K8S] StatefulSet  (1) 2024.10.10
[K8S] Metric Server  (0) 2024.10.10
[K8S] 인그레스와 관련 리소스  (1) 2024.10.08
[k8s] DNS  (1) 2024.09.02
[k8s] Volume  (0) 2024.09.02