앞 포스트의 연결 방식은 들어오는 요청을 모두 워커 노드의 노드포트를 통해 노트포트 서비스로 이동하고 이를 다시 쿠버네티스의 파드로 보내는 구조이다. 이 방식은 매우 비효율적이다. 그래서 쿠버네티스에서는 로드밸런서라는 서비스 타입을 제공해 다음 그림과 같은 간단한 구조로 파드를 외부에 노출하고 부하를 분산한다.
하지만 로드밸런서를 사용하려면 로드밸런서를 이미 구현해 둔 서비스업체의 도움을 받아 쿠버네티스 클러스터 외부에 구현애햐 한다. 클라우드에서 제공하는 쿠버네티스를 사용하고 있다면 아래와 같이 선언만 하면된다. 그러면 쿠버네티스 클러스터에 로드밸런서 서비스가 생성돼 외부와 통신할 수 있느느 IP가 부여되고 외부와 통신할 수 있으며 부하도 분산된다.
kubectl expose deployment ex-lb --type=LoadBalancer --name=ex-svc
온프레스에서 로드밸런서를 사용하려면 내부에 로드밸런서 서비스를 받아주는 구성이 필요한데, 이를 지원하는 것이 MetalLB이다. MetalLB는 베어메탈(bare metal, 운영체제가 설치되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트이아.
MetalLB는 특별한 네트워크 설정이나 구성이 있는 것이 아니라 기존의 L2 네트워크(ARP/NDP)와 L3 네트워크(BGP)로 로드밸런서를 구현한다. 그러므로 네트워크를 새로 배워야 할 부담이 없으며 연동하기도 매우 쉽다.
L2 네트워크로 로드밸런서를 구현하고, 네트워크 경로는 다음과 같이 구성해본다.
그림에서 알 수 있듯이 기존의 로드밸런서와 거의 동일한 경로로 통신하며, 테스트 목적으로 두 개의 MetalLB 로드밸런서 서비스를 구현한다.
MetalLB 컨트롤러는 작동 방식(Protocol, 프로토콜)을 정의하고 EXTERNAL-IP를 부여해 관리한다. MetalLB 스피커(Speaker)는 정해진 작동 방식(L2/ARP, L3/BGP)에 따라 경로를 만들 수 있도록 네트워크 정보를 광고하고 수집해 각 파드의 경로를 제공한다. 이때 L2는 스피커 중에서 리더를 선출해 경로 제공을 총괄하게 한다.
kubectl create deployment lb-hname-pods --image=sysnet4admin/echo-hname
kubectl scale deployment lb-hname-pods --replicas=3
kubectl create deployment lb-ip-pods --image=sysnet4admin/echo-ip
kubectl scale deployment lb-ip-pods --replicas=3
MetalLB는
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
위 명령으로도 설치 가능
kubectl apply -f ~/_Book_k8sInfra/ch3/3.3.4/metallb.yaml
configMap은 정의된 포맷이라고 생각하면 된다.
kubectl apply -f ~/_Book_k8sInfra/ch3/3.3.4/metallb-l2config.yaml
metallb-l2config 파일
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: nginx-ip-range
protocol: layer2
addresses:
- 192.168.1.11-192.168.1.13
ConfigMap이 생성됐는지 확인
kubectl expose deployment lb-hname-pods --type=LoadBalancer --name=lb-hname-svc --port=80
kubectl expose deployment lb-ip-pods --type=LoadBalancer --name=lb-ip-svc --port=80
이렇게 온프레미스에서도 로드밸런서를 사용할 수 있게 하는 MetalLB를 구성해봤다.