Cloud/Docker & Kubernetes

쿠버네티스의 서비스 (LoadBalancer)

DGO 2023. 5. 17. 21:49

Loadbalancer

 

로드밸런서는 서버에 가해지는 부하를 분산해주는 기술 및 장치로 클라이언트와 서버 사이에 위치하여 한 대의 서버로 부

 

하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 성능을 내게 한다.

 

쿠버네티스에서도 로드밸런서를 사용 가능하며 이전 포스트의 NodePort 방식과 같은 경우 클라이언트의 요청을 모두 워

 

커 노드의 노드포트를 통해 노드포트 서비스로 이동하고 이를 다시 각 파드로 보내는 방식이기 때문에 비효율적이라고 볼

 

수 있다.

 

NodePort 서비스 구성도

 

하지만 로드밸런서를 사용하면 다음과 같은 구조로 간단하게 외부에 노출하고 부하를 분산할 수 있다.

 

 

하지만 로드밸런서를 사용하려면 쿠버네티스를 클라우드 환경에 구축하고 해당 클라우드에서 제공하는 로드밸런서

 

(Amazon의 ELB, Azure의 Azure Load Balancer 등)를 사용하여 클러스터 외부에 구현하여야 한다.

 

 

 

MetalLB

 

현재 로컬에 온프레미스 환경으로 클러스터를 구축했기 때문에 외부에서 제공받을 로드밸런서가 따로 없으며 온프레미스

 

에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트인 MetalLB를 사용 할 수 있다.

 

MetalLB의 경우 특별한 네트워크 설정이나 구성이 있는 것이 아니라 기존의 L2,L3 네트워크를 활용해 로드밸런서를 구현

 

하기 때문에 새로 배워야 할 부담도 적고 연동하기 매우 쉬운 장점이 있다.

 

실습으로 MetalLB의 L2 네트워크로 로드밸런서를 구현하고 아래와 같이 두 개의 MetalLB 로드밸런서 서비스를 구현한다.

 

사용자가 로드밸런서 서비스에 접근하면 서비스에서 파드로 포워딩 해주는 위와 동일한 구조이다.

 

 

MetalLB는 크게 ControllerSpeaker가 존재하는데

 

Controller는 프로토콜을 정의하고 로드밸런싱을 수행할 EXT IP를 할당해 관리한다.

 

Speaker는 EXT IP로 오는 요청이 Speaker가 실행되는 노드의 파드로 전달 될 수 있도록 네트워크 정보를 수집

 

하고 각 파드의 경로를 제공한다.

 

 

우선 두 종류의 파드(lb-hname-pods, lb-ip-pods)를 디플로이먼트를 생성하고 scale 명령으로 파드를 3개로 늘린다.

 

 

이전 포스트의 인그레스와 마찬가지로 사전에 정의된 설치에 제공되는 오브젝트 스펙으로 MetalLB를 설치한다.

 

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml

 

설치가 완료되면 설정된 네임스페이스로 MetalLB의 파드를 조회한다.

 

controller 1개, speaker 4개가 생성된 것을 볼 수 있다.

 

 

인그레스와 마찬가지로 MetalLB도 설정을 적용해야 하는데 Configmap이라는 오브젝트를 사용하며 Configmap은 설정이

 

정의된 포맷이라고 할 수 있다.

 

 

metallb_config.yaml

apiVersion: v1
kind: ConfigMap				// configmap으로 오브젝트 설정
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2			// L2 스위치 방식으로 설정
      addresses:
      - 192.168.1.11-192.168.1.13	// Ext ip 대역 설정

 

configmap을 적용하였으면 생성한 디플로이먼트를 expose 명령어로 로드밸런서 서비스로 노출하고 로드밸런서 서비스

 

별로 Ext IP가 잘 적용되었는지 확인한다.

 

 

웹페이지에 접속하여 배포된 파드 중 하나의 이름과 IP가 표시되는 것을 확인 할 수 있다.

 

 

또한 아래의 반복문으로 접속 부하를 유발해 보면 여러 파드로 부하를 분산하는 것을 확인 할 수 있다.

$i=0; 
while($true)
	{       
		% { $i++; write-host -NoNewline "$i $_" }
		(Invoke-RestMethod "http://192.168.1.11")-replace '\n', " "
	}

'Cloud > Docker & Kubernetes' 카테고리의 다른 글

PV, PVC  (0) 2023.05.24
쿠버네티스의 서비스 (HPA)  (0) 2023.05.18
쿠버네티스의 서비스 (NodePort, Ingress)  (2) 2023.05.16
Dockerfile로 이미지 생성  (0) 2023.04.21
쿠버네티스 노드 유지보수  (0) 2023.04.20