쿠버네티스/도커(온프레미스에서 로드밸런서를 제공하는 MetalLB)

맹민재·2022년 10월 22일
0

클라우드에서 쉽게 구성 가능한 로드밸런서

앞 포스트의 연결 방식은 들어오는 요청을 모두 워커 노드의 노드포트를 통해 노트포트 서비스로 이동하고 이를 다시 쿠버네티스의 파드로 보내는 구조이다. 이 방식은 매우 비효율적이다. 그래서 쿠버네티스에서는 로드밸런서라는 서비스 타입을 제공해 다음 그림과 같은 간단한 구조로 파드를 외부에 노출하고 부하를 분산한다.

하지만 로드밸런서를 사용하려면 로드밸런서를 이미 구현해 둔 서비스업체의 도움을 받아 쿠버네티스 클러스터 외부에 구현애햐 한다. 클라우드에서 제공하는 쿠버네티스를 사용하고 있다면 아래와 같이 선언만 하면된다. 그러면 쿠버네티스 클러스터에 로드밸런서 서비스가 생성돼 외부와 통신할 수 있느느 IP가 부여되고 외부와 통신할 수 있으며 부하도 분산된다.

kubectl expose deployment ex-lb --type=LoadBalancer --name=ex-svc

온프레미스에서 로드밸런서를 제공하는 MetalLB

온프레스에서 로드밸런서를 사용하려면 내부에 로드밸런서 서비스를 받아주는 구성이 필요한데, 이를 지원하는 것이 MetalLB이다. MetalLB는 베어메탈(bare metal, 운영체제가 설치되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트이아.

MetalLB는 특별한 네트워크 설정이나 구성이 있는 것이 아니라 기존의 L2 네트워크(ARP/NDP)와 L3 네트워크(BGP)로 로드밸런서를 구현한다. 그러므로 네트워크를 새로 배워야 할 부담이 없으며 연동하기도 매우 쉽다.

L2 네트워크로 로드밸런서를 구현하고, 네트워크 경로는 다음과 같이 구성해본다.

그림에서 알 수 있듯이 기존의 로드밸런서와 거의 동일한 경로로 통신하며, 테스트 목적으로 두 개의 MetalLB 로드밸런서 서비스를 구현한다.

MetalLB 컨트롤러는 작동 방식(Protocol, 프로토콜)을 정의하고 EXTERNAL-IP를 부여해 관리한다. MetalLB 스피커(Speaker)는 정해진 작동 방식(L2/ARP, L3/BGP)에 따라 경로를 만들 수 있도록 네트워크 정보를 광고하고 수집해 각 파드의 경로를 제공한다. 이때 L2는 스피커 중에서 리더를 선출해 경로 제공을 총괄하게 한다.

1. 디플로이먼트를 이용해 2종류(lb-hname-pods, lb-ip-pods)의 파드 생성, sacle 명령으로 파드 증가시키기

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

2. 사전에 정의된 오브젝트 스펙으로 MetalLB 구성

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 오브젝트를 사용해 MetalLB 설정 적용

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이 생성됐는지 확인

모든 설정이 완료됐으므로 각 디플로이먼트(lb-hname-pods, lb-ip-pods)를 로드밸런서 서비스로 노출

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

EXTERNAL-IP 동작 확인

이렇게 온프레미스에서도 로드밸런서를 사용할 수 있게 하는 MetalLB를 구성해봤다.

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글