gcloud CLI로 GCP L4&L7 로드밸런서 구축하기
들서론
로드밸런서(Load Balancer)는 들어오는 트래픽을 여러 서버로 나눠주는 장치로, 서버 한 대에 부하가 몰리지 않게 분산시켜 주는 역할을 한다.
여기서는 gcloud CLI로 두 가지 방식의 로드밸런서를 직접 만들어 보는 hands-on을 리뷰할 예정.
- 1부. 네트워크 로드밸런서 (L4) — VM 3대를 만들고 하나로 묶는 가장 기본적인 방식
- 2부. HTTP 로드밸런서 (L7) — Template, MIG를 이용하는 확장성 있는 방식
1부. 네트워크 로드밸런서 (L4)
트래픽을 IP/포트 수준에서 단순하게 나눠주는 방식으로, 총 6단계로 구성된다.
1단계. 웹 서버 VM 3대 생성
먼저 트래픽을 받을 서버 3대(web1, web2, web3)를 만든다. 다음과 같이 반복문으로 한 번에 생성할 수 있고, 각 서버에 Apache 웹 서버를 설치하는 시작 스크립트를 넣는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for i in 1 2 3; do
gcloud compute instances create web$i \
--zone=europe-west3-c \
--machine-type=e2-small \
--tags=network-lb-tag \
--image-family=debian-12 \
--image-project=debian-cloud \
--network=default \
--metadata=startup-script='#!/bin/bash
apt-get update
apt-get install apache2 -y
service apache2 restart
echo "<h3>Web Server: web'$i'</h3>" | tee /var/www/html/index.html'
done
--tags=network-lb-tag는 이후 단계에서 방화벽/로드밸런서가 이 태그가 붙은 서버를 찾을 때 쓰는 태그
2단계. 방화벽 규칙 생성
외부 사용자가 서버의 80번 포트(HTTP)로 접속할 수 있도록 방화벽을 열어준다.
기본적으로 GCP는 외부 접근을 막고 있기 때문에 이 과정을 해야 한다.
1
2
3
4
5
gcloud compute firewall-rules create www-firewall-network-lb \
--network=default \
--allow=tcp:80 \
--target-tags=network-lb-tag \
--source-ranges=0.0.0.0/0
3단계. 고정 외부 IP 예약
로드밸런서가 사용할 대표 접속 주소(고정 IP)를 미리 확보한다. IP가 바뀌지 않도록 고정해 둠.
1
2
gcloud compute addresses create network-lb-ip-1 \
--region=europe-west3
4단계. 헬스체크 + 타겟풀 생성
- 헬스체크(Health Check): 서버가 살아있는지 주기적으로 확인하는 감시 장치
- 타겟풀(Target Pool): 트래픽을 나눠 보낼 서버들의 묶음
1
2
3
4
5
6
7
# 헬스체크 생성
gcloud compute http-health-checks create basic-check
# 타겟풀 생성 (헬스체크 연결)
gcloud compute target-pools create www-pool \
--region=europe-west3 \
--http-health-check=basic-check
5단계. 타겟풀에 VM 연결
4단계에서 만든 타겟풀(www-pool)에 실제 서버 3대를 넣고 연결.
1
2
3
gcloud compute target-pools add-instances www-pool \
--instances=web1,web2,web3 \
--instances-zone=europe-west3-c
6단계. 전달 규칙 생성 → L4 완성
마지막으로 “고정 IP로 들어온 요청을 타겟풀로 전달하라”는 규칙을 만들면 네트워크 로드밸런서가 완성된다.
1
2
3
4
5
gcloud compute forwarding-rules create www-rule \
--region=europe-west3 \
--ports=80 \
--address=network-lb-ip-1 \
--target-pool=www-pool
동작 확인
로드밸런서 IP로 반복 접속하면 요청이 web1, web2, web3으로 번갈아 분산되는 것을 볼 수 있습니다.
1
2
3
4
5
6
IPADDRESS=$(gcloud compute forwarding-rules describe www-rule \
--region=europe-west3 --format="json" | jq -r .IPAddress)
echo "Load Balancer IP: $IPADDRESS"
while true; do curl -m1 $IPADDRESS; sleep 1; done
2부. HTTP 로드밸런서 (L7)
이번에는 서버를 하나씩 묶지 않고, 템플릿(설계도) → 자동 확장 그룹(MIG) 구조로 만든다.
이후 URL 맵·프록시 같은 관문을 연결해 더 똑똑하게 트래픽을 나누는 방식이다.
1단계. 인스턴스 템플릿 생성
1부에서 했던 방식과 다르게, 템플릿에 VM 규격과 시작 스크립트를 미리 정의해 둔다.
1
2
3
4
5
6
7
8
9
10
gcloud compute instance-templates create lb-backend-template \
--machine-type=e2-medium \
--image-family=debian-12 \
--image-project=debian-cloud \
--tags=allow-health-check \
--metadata=startup-script='#!/bin/bash
apt-get update
apt-get install apache2 -y
service apache2 restart
echo "<h3>Web Server: Backend</h3>" | tee /var/www/html/index.html'
2단계. 관리형 인스턴스 그룹(MIG) 생성
템플릿을 바탕으로 서버 2대를 자동 생성하는 그룹을 만든다.
로드밸런서가 인식할 수 있도록 HTTP 포트(80)도 매핑해 준다.
1
2
3
4
5
6
7
8
9
10
# 템플릿으로 MIG 생성 (서버 2대)
gcloud compute instance-groups managed create lb-backend-group \
--template=lb-backend-template \
--size=2 \
--zone=europe-west3-c
# 포트 이름 매핑 (http:80)
gcloud compute instance-groups managed set-named-ports lb-backend-group \
--named-ports=http:80 \
--zone=europe-west3-c
3단계. 헬스체크용 방화벽 개방
GCP 로드밸런서가 서버 상태를 점검할 때는 구글의 전용 IP 대역에서 접근한다. 이 대역(130.211.0.0/22, 35.191.0.0/16)만 열어주도록 한다.
1
2
3
4
5
6
7
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
4단계. 글로벌 고정 외부 IP 예약
1부의 region IP와 달리, HTTP 로드밸런서는 전 세계에서 접근하는 글로벌 IP를 사용한다.
1
2
3
gcloud compute addresses create lb-ipv4-1 \
--ip-version=IPV4 \
--global
5단계. 상태 검사(헬스체크) 생성
서버가 정상인지 확인하는 글로벌 헬스체크를 만든다.
1
2
gcloud compute health-checks create http http-basic-check \
--port=80
6단계. 백엔드 서비스 생성 + MIG 연결
백엔드 서비스는 트래픽 분산을 담당하는 “중앙 두뇌” 역할로, 헬스체크(5단계)와 서버 그룹(2단계)을 하나로 묶는다.
1
2
3
4
5
6
7
8
9
10
11
12
# 백엔드 서비스 생성
gcloud compute backend-services create web-backend-service \
--protocol=HTTP \
--port-name=http \
--health-checks=http-basic-check \
--global
# MIG를 백엔드로 연결
gcloud compute backend-services add-backend web-backend-service \
--instance-group=lb-backend-group \
--instance-group-zone=europe-west3-c \
--global
7단계. URL 맵 생성
사용자가 요청한 URL 경로에 따라 어느 백엔드로 보낼지 결정하는 “이정표”로,
여기서는 모든 요청을 기본 서비스로 보낸다.
1
2
gcloud compute url-maps create web-map-http \
--default-service=web-backend-service
8단계. 대상 HTTP 프록시 생성
외부 요청을 받아 위에서 생성한 URL 맵의 규칙대로 넘겨주는 중계 역할이다.
1
2
gcloud compute target-http-proxies create http-lb-proxy \
--url-map=web-map-http
9단계. 글로벌 전달 규칙 생성 → L7 완성
마지막으로 고정 IP(4단계)와 프록시(8단계)를 연결하면 HTTP 로드밸런서가 완성된다.
1
2
3
4
5
gcloud compute forwarding-rules create http-content-rule \
--address=lb-ipv4-1 \
--global \
--target-http-proxy=http-lb-proxy \
--ports=80
참고
트래픽은 어떻게 흐를까?
구축은 뒤쪽(VM)부터 쌓아 올렸지만, 실제 사용자 요청은 반대로 앞쪽(IP) 대문으로 들어와 관문을 하나씩 통과해 VM에 도달한다.
graph TD
U[사용자 요청 HTTP] --> F["고정 IP + 전달 규칙<br/>lb-ipv4-1 · http-content-rule"]
F --> P["대상 HTTP 프록시<br/>http-lb-proxy"]
P --> M["URL 맵<br/>web-map-http"]
M --> B["백엔드 서비스<br/>web-backend-service"]
B --> V["MIG의 VM Apache<br/>lb-backend-group"]


