Implementing Cloud Load Balancing for Compute Engine

목록
- Set Up Network Load Balancers
- Set Up Application Load Balancers ⬅️ 오늘의 Lab!
- Use an Internal Application Load Balancer
- Implement Load Balancing on Compute Engine: Challenge Lab
Compute Engine 가상 머신에 L7 애플리케이션 부하 분산기를 설정하는 방법을 알아보자. L7 부하 분산기는 HTTP(S) 프로토콜을 이해하므로 이러한 프로토콜에서 URL, 헤더, 쿠키, 요청 콘텐츠 같은 파라미터를 기반으로 라우팅을 결정할 수 있다. 그 결과 애플리케이션 성능과 응답성이 개선된다!

# 기본 리전 설정(Region 수정 필요)
gcloud config set compute/region Region
# 기본 영역 설정(Zone 수정 필요)
gcloud config set compute/zone Zone

# www1
gcloud compute instances create www1 \
--zone=Zone \
--tags=network-lb-tag \
--machine-type=e2-small \
--image-family=debian-11 \
--image-project=debian-cloud \
--metadata=startup-script='#!/bin/bash
apt-get update
apt-get install apache2 -y
service apache2 restart
echo "
<h3>웹 서버: www1</h3>" | tee /var/www/html/index.html'
# www2
gcloud compute instances create www2 \
--zone=Zone \
--tags=network-lb-tag \
--machine-type=e2-small \
--image-family=debian-11 \
--image-project=debian-cloud \
--metadata=startup-script='#!/bin/bash
apt-get update
apt-get install apache2 -y
service apache2 restart
echo "
<h3>웹 서버: www2</h3>" | tee /var/www/html/index.html'
# www3
gcloud compute instances create www3 \
--zone=Zone \
--tags=network-lb-tag \
--machine-type=e2-small \
--image-family=debian-11 \
--image-project=debian-cloud \
--metadata=startup-script='#!/bin/bash
apt-get update
apt-get install apache2 -y
service apache2 restart
echo "
<h3>웹 서버: www3</h3>" | tee /var/www/html/index.html'

gcloud compute firewall-rules create www-firewall-network-lb \
--target-tags network-lb-tag --allow tcp:80


# External_ip 확인
gcloud compute instances list
# 인스턴스 실행중인지 확인
curl http://[EXTERNAL_IP_ADDRESS]
➡️ 메인 인덱스 내의 문구가 출력되면 성공!
참고✨
이전 포스팅에서 진행한 L4(전송 계층) LB는 IP, Port 기준으로 부하 분산을 하는 것과 달리, 이번 실습의 L7(응용 계층) LB는 URL 경로, 쿠키, 언어 등 HTTP 내용 기준으로 부하 분산을 진행한다.

gcloud compute instance-templates create lb-backend-template \
--region=Region \
--network=default \
--subnet=default \
--tags=allow-health-check \
--machine-type=e2-medium \
--image-family=debian-11 \
--image-project=debian-cloud \
--metadata=startup-script='#!/bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
명령어 체크✅
--tags: HTTP 로드 밸런서가 서버의 상태를 확인할 때 사용하는 특정 IP 대역을 허용하기 위한 식별표--metadata=startup-script분석
a2enmod ssl: SSL(HTTPS) 설정 준비vm_hostname="$(curl ...)": 구글 내부 메타데이터 서버를 통해 실제 서버 이름을 가져오기Page served from: $vm_hostname: 접속했을 때, 해당 페이지가 어느 서버에서 보낸건지 정확히 알려주도록 설정

gcloud compute instance-groups managed create lb-backend-group \
--template=lb-backend-template --size=2 --zone=Zone

gcloud compute firewall-rules create fw-allow-health-check \
--network=default \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-health-check \
--rules=tcp:80

# IP 주소 생성
gcloud compute addresses create lb-ipv4-1 \
--ip-version=IPV4 \
--global
# IP 주소 확인
gcloud compute addresses describe lb-ipv4-1 \
--format="get(address)" \
--global
➡️ IP 주소는 35.201.85.243 이다.

gcloud compute health-checks create http http-basic-check \
--port 80

gcloud compute backend-services create web-backend-service \
--protocol=HTTP \
--port-name=http \
--health-checks=http-basic-check \
--global

gcloud compute backend-services add-backend web-backend-service \
--instance-group=lb-backend-group \
--instance-group-zone=Zone \
--global

gcloud compute url-maps create web-map-http \
--default-service web-backend-service
참고✨
URL 맵은 백엔드 서비스 또는 백엔드 버킷으로 요청을 라우팅하는 데 사용되는 Google Cloud 구성 리소스이다.
예를 들어 외부 애플리케이션 부하 분산기를 사용하면 단일 URL 맵을 사용하여 URL 맵에 구성된 규칙에 따라 요청을 다른 대상으로 라우팅할 수 있다.
https://example.com/video요청은 하나의 백엔드 서비스로 이동https://example.com/audio요청은 다른 백엔드 서비스로 이동https://example.com/images요청은Cloud Storage백엔드 버킷으로 이동- 다른 호스트 및 경로 조합에 대한 요청은 기본 백엔드 서비스로 이동

gcloud compute target-http-proxies create http-lb-proxy \
--url-map web-map-http

gcloud compute forwarding-rules create http-content-rule \
--address=lb-ipv4-1 \ # 예약한 고유 IP를 쓰고
--global \ # 전 세계 어디서든 이 규칙이 동작하게 하며
--target-http-proxy=http-lb-proxy \ # 검증된 패킷은 이 프록시로 넘기고
--ports=80 # 오직 80번 포트만 허용한다.
💫 흐름을 이해해보자!
지금 과정은 전 세계 어디서든 접속 가능한 거대한 서비스망을 구축하고 있다. 목표는 요청한 백엔드 서비스에 연결하는 지능적 배분을 하는 것!
1. 설정 순서(Bottom-up)
1)Instance Template & Group (MIG): 실제 연산을 수행할 컴퓨터 자원 정의
2)Health Check: 서버의 상태를 판단할 기준 생성
3)Backend Service: 서버 그룹(MIG)과 상태 확인을 하나로 묶어 트래픽 분산의 목적지를 설정
4)URL Map: 요청된 URL(호스트, 경로)을 어떤 백엔드 서비스로 보낼지 라우팅 규칙을 정의
5)Target Proxy: HTTP 요청을 받아 URL 맵과 연결해주는 중계기를 설정
6)Forwarding Rule (with Global IP): 외부 IP와 포트를 Proxy에 연결하여 인터넷에 노출
2. 요청 순서(Top-Down)
1)Global Forwarding Rule: 사용자의 패킷이 Google의 글로벌 엣지 네트워크(Google Front End)에 도달하고, 전달 규칙은 해당 IP와 80번 포트로 들어온 요청을 가로채서 다음 단계로 넘긴다.
2)Target HTTP Proxy: 전달 규칙으로부터 패킷을 넘겨받은 프록시는 들어온 패킷이 유효한 HTTP 프로토콜인지 확인하고, 이를 URL Map이 이해할 수 있는 형태로 전달
3)URL Map: HTTP 헤더를 분석하여 경로를 결정(라우팅)한다.
4)Backend Service: URL Map이 지정한 백엔드로 트래픽을 보낸다. 이때, 백엔드 서비스는 Health Check 및 부하 알고리즘을 체크한다.
5)Managed Instance Group: 선택된 특정 VM 인스턴스로 트래픽이 전달된다. VM 내부의 Apache2가 요청을 처리하고 HTTP 응답을 생성하여 다시 역순으로 사용자에게 보낸다.

➡️ 검색창에 Load Balancing 검색 > 생성한 부하 분산기(web-map-http) 클릭


➡️ VM 상태가 정상일 때, 웹 브라우저에서 Frontend 주소를 사용하여 부하 분산기 테스트
➡️ 3-4에서 체크한 IP 주소와 동일하기 때문에, 명령어를 통해 IP 주소를 확인해도 된다.

➡️ http://IP_ADDRESS/로 접속하여, 브라우저는 페이지를 제공한 인스턴스의 이름과 영역을 표시하는 콘텐츠로 페이지를 렌더링하는지 확인!