1. 개요
42서울 과제인 ft_services는 Kubernetes를 기반으로 다양한 서비스들을 배포해보는 과제입니다. Kubernetes의 node로 들어온 트래픽을 각 서비스에 분산시켜주는 Load Balancer에 대해 알아보겠습니다.
A. Load Balancer란?
: 다수의 중앙처리장치나 저장장치와 같은 컴퓨터 자원들에게 작업을 나눠주는 장치
- 여기서 작업을 왜 나누어줘야 하고 어떻게 나눠주는지 궁금증이 생길 수 있습니다. 본 글에서는 Why와 How에 대해서 중점적으로 살펴보고 과제에 어떻게 적용될 수 있는지 살펴볼 것입니다.
B. 왜 Load Balancer를 사용하는가?
1) 문제
- 한 두명의 클라이언트가 서버에 요청을 보낸다면 서버는 여유롭게 응답을 보내줄 수 있습니다. 하지만, 클라이언트의 수가 수백~수천만명이라면?
- 클라이언트의 수가 수백~수천만명이라면 초기엔 서버가 하나씩 응답을 보내주려고 노력하겠지만, 결국엔 지쳐서 동작이 멈춘다고 합니다.
2) 해결책
- 여기서 관리자는 두 개의 선택지를 고려할 수 있습니다.
- scale-up : 서버 하드웨어의 성능을 높이는 방법
- scale-out : 여러대의 서버를 증설하여 부하를 낮추는 방법
3) Load Balancer의 등장
- 특별한 조건 없이 비용만을 고려한다고 했을 때, 서버 한 대의 사양을 높이는 것(scale-up) 보다 여러 대의 서버를 증설하는 것(scale-out)이 합리적입니다.
- 서버를 증설하고 각 서버마다 공인 ip를 할당한다면 클라이언트들이 각각 다른 ip로 서버에 요청하였을 때, 개발자는 의도대로 부하를 관리하기 어려워집니다.
- 이 때, 증설한 서버에 부하를 효율적으로 나누어줄 장치가 필요한 데 그것이 Load Balancer입니다.
2. Load Balancer의 특징
A. Load Balancer의 종류
Load Balancer는 크게 운영체제 Load Balancer와 네트워크 Load Balancer로 나뉘는데, 본 글에서는 네트워크 Load Balancer를 다룰 것입니다.
1) 네트워크 Load Balancer의 종류
- L2(브릿지, 허브 등)
: Mac address를 활용한 Load Balancing을 수행합니다. 구조가 간단하고 신뢰성이 높지만, 상위계층 프로토콜을 기반으로 스위칭이 불가능 하다는 특징을 가지고 있습니다.
- L3(Router, ICMP 프로토콜, IP)
: IP address를 활용한 Load Balancing을 수행합니다. 지속적으로 트래픽을 체크해줄 수 있지만, 특정 프로토콜을 이용해야 스위칭이 가능하다는 특징을 가지고 있습니다.
- L4(TCP, UDP Protocol)
: IP + Port를 활용하여 Load Balancing을 수행합니다. port기반으로 스위칭을 해주고 Virtual IP를 활용하여 여러대를 한 대로 묶어 부하분산을 시켜줄 수 있습니다. 주로 Round Robin 방식이 활용됩니다.
- L7(HTTP, FTP, SMTP Protocol)
: 사용자 Request를 기반으로 Load Balancing을 수행합니다.
ex) 213.12.32.123:80, 213.12.32.123:1024 + GET/ img/aaa.jpg
B. Load Balancer의 동작 방식
여러 Load Balancer가 있지만, 본 글에서는 L4 Load Balancer와 L7 Load Balancer를 다뤄보겠습니다.
1) Load Balancer 동작 방식
- 기본적인 방식인 Bridge/Transparent Mode로 살펴보겠습니다.
- 클라이언트가 Load Balancer에 서비스를 요청합니다.
- Load Balancer가 NAT(Network Address Translation)를 활용하여 받은 패킷의 IP 및 MAC 주소를 변조하고 실제 서버에 요청을 보냅니다.
- 실제 서버가 Load Balancer로 요청에 대한 응답을 보냅니다.
- Load Balancer는 NAT를 활용하여 실제 서버 IP 주소를 Load Balancer IP 주소로 변환하고 클라이언트에 응답을 보냅니다.
2) Load Balancer의 주요 기능
- Load Balancer는 아래 기능들을 통해 Load Balancing을 수행합니다.
- Network Address Translation(NAT) : 사설 IP를 공인 IP로 바꾸거나 공인 IP를 사설 IP로 바꿔줍니다.
- Tunneling : 데이터를 캡슐화하여 연결된 노드만 캡슐을 해제할 수 있게 합니다.
- Dynamic Source Routing protocol(DSR) : 요청에 대한 응답을 보낼 때 로드밸런서가 아닌 클라이언트의 IP로 직접 보냅니다.(응답 시 Load Balancer를 경유하지 않음)
3) 서버를 선택하는 방법
- Round Robin : 요청이 들어오는 대로 서버에 균등하게 요청을 분배합니다. 가장 단순한 분배 방식입니다.
- Weighted Round Robin Scheduling : Round Robin방식으로 분배하지만 서버의 가중치에 따라 요청을 더 분배하기도, 덜 분배하기도 합니다. 서버 가중치는 사용자가 지정할 수 있고 동적으로 조정되기도 합니다.
- Least Connection : 서버마다 연결된 커넥션이 몇개인지 체크하여 커넥션이 가장 적은 서버로 요청을 분배하는 방식입니다.
- Weighted Least Connections : Least Connection방식으로 분배하지만 서버 가중치에 따라 요청을 더 분배하기도, 덜 분배하기도 합니다. 서버 가중치는 사용자가 지정할 수 있고 동적으로 조정되기도 합니다. 서버 풀에 존재하는 서버들의 사양이 일관적이지 않고 다양한 경우 이 방법이 효과적입니다.
- Fastest Response Time : 서버가 요청에 대해 응답하는 시간을 체크하여 가장 빠른 서버로 요청을 분배하는 방식입니다.
- Source Hash Scheduling : 사용자의 IP를 해싱한 후 그 결과에 따라 서버로 요청을 분배합니다. 사용자의 IP는 고정되어 있기 때문에 항상 같은 서버로 연결된다는 보장을 받을 수 있습니다.(연결 보장)
4) L4 vs L7
출처 : https://velog.io/@makeitcloud/%EB%9E%80-L4-load-balancer-vs-L7-load-balancer-%EB%9E%80
3. 참고