Implementing Cloud Load Balancing for Compute Engine

목록
- Set Up Network Load Balancers ⬅️ 오늘의 Lab!
- Set Up Application Load Balancers
- Use an Internal Application Load Balancer
- Implement Load Balancing on Compute Engine: Challenge Lab
Load Balancers를 구성해보자.

# 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 instances create www:www라는 이름의 VM 인스턴스 생성--zone: 인스턴스가 위치할 물리적 영역을 지정--machine-type: 가상 머신의 사양 설정
- 이미지 및 네트워크 설정
--image-family: 최신 패치가 적용된 이미지를 자동으로 선택--image-project: 이미지를 제공하는 구글 프로젝트 경로--tags: 인스턴스에 네트워크 태그 태그 부여 ➡️ 보통 방화벽 규칙이나 부하 분산기 설정에서 특정 인스턴스 그룹을 식별할 때 사용
- 시작 스크립트 분석
----metadata=startup-script: 인스턴스가 부팅될 때 자동으로 실행되는 스크립트
apt-get update: 패치 업데이트apt-get install apache2 -y: Apache2 웹 서버 설치(-y는 확인 질문에 자동 승인 옵션)service apache2 restart: 설치된 Apache 서비스 활성화echo "..." | tee ../index.html: 문구가 뜨도록 메인 인덱스 파일 수정

gcloud compute firewall-rules create www-firewall-network-lb \
--target-tags network-lb-tag --allow tcp:80
명령어 분석🤖
gcloud compute firewall-rules create www-firewall-network-lb:www-firewall-network-lb라는 이름의 새로운 방화벽 규칙 생성--target-tags network-lb-tag: 가상 머신 만들 때--tag: network-lb-tag로 태그를 설정한 인스턴스에 해당하는 서버에 방화벽 규칙 적용--allow tcp:80: TCP 프로토콜의 80번 포트(HTTP)를 통한 통신 허용

gcloud compute instances list

curl http://[EXTERNAL_IP_ADDRESS]
➡️ 메인 인덱스에 설정한 문구가 뜨는지 확인!

gcloud compute addresses create network-lb-ip-1 \
--region Region
➡️ network-lb-ip-1라는 이름의 IP 주소 자원 생성
✅ 명령어 사용 이유
보통 VM 인스턴스를 만들면 IP가 자동으로 할당되지만, 인스턴스를 껐다 켜면 IP가 바뀔 수 있기 때문에 아래와 같은 이유로 고정 외부 IP가 필요하다.
1. 여러 대의 서버 앞에 서는 부하 분산기의 주소를 통해 사용자가 접속하기 때문에, 주소가 바뀌면 안된다.
2. IP를 미리 이름으로 만들어두면, 나중에 부하 분산기 설정 시 IP 번호를 일일이 외울 필요 없이 이름으로 연결할 수 있어 관리가 편하다.

gcloud compute http-health-checks create basic-check
➡️ basic-check라는 이름의 HTTP 상태 확인 규칙을 생성
➡️ 동작 방법: 각 인스턴스의 80번 포트로 접속 후, 서버가 200 OK 응답을 주면 정상(Healthy), 서버가 응답하지 않거나 오류를 뱉으면 비정상(Healthy) 판단한다.
➡️ 비정상 시에는 부하 분산기는 해당 서버로의 트래픽 전송을 즉시 중단한다.

gcloud compute target-pools create www-pool \
--region Region --http-health-check basic-check
➡️ 대상 풀(Target Pool): 부하 분산기가 트래픽을 전달할 서버들의 대기 명단
명령어 분석🤖
gcloud compute target-pools create www-pool:www-pool이라는 이름의 대상 풀을 생성--http-health-check basic-check: 3-2 에서 만든 HTTP 상태 점검 리소스를 풀에 연결 ➡️ 이 풀에 들어있는 서버들이 살아있는지basic-check규칙을 사용하여 확인
✅ 네트워크 태그 vs. 대상 풀

gcloud compute target-pools add-instances www-pool \
--instances www1,www2,www3
참고✨
gcloud compute target-pools add-instances www-pool \ --instances=$(gcloud compute instances list --filter="tags.items=network-lb-tag" --format="value(name)" | paste -sd "," -) \ --zone=Zone➡️ 인스턴스가 많을 경우, 인스턴스 태그를 사용하여 한 번에 풀에 넣을 수 있다.
gcloud ... instances list --filter="...":network-lb-tag태그가 달린 서버들만 골라낸다.--format="value(name)": 다른 정보 빼고 오직 이름만 출력$( ... ): 이 결과를add-instances의--instances값으로 설정
✅ 인스턴스 그룹을 사용하여 여러 대 서버를 한 번에 풀에 넣기
1. 인스턴스 템플릿 생성
gcloud compute instance-templates create www-template \ --region=Region \ --network-interface=address=,network-tier=PREMIUM \ --machine-type=e2-small \ --tags=network-lb-tag \ --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>웹 서버: $(hostname)</h3>" | tee /var/www/html/index.html'➡️ 인스턴스 그룹은 서버를 자동으로 찍어내야 하므로, 태그와 시작 스크립트를 미리 정의
2. 인스턴스 그룹 생성gcloud compute instance-groups managed create www-group \ --base-instance-name=www \ --size=3 \ --template=www-template \ --target-pool=www-pool \ --zone=Zone➡️ 설계도를 바탕으로 서버 묶음을 만든다. 대상 풀(
www-pool)을 바로 연결 가능하고,--size=3을 통해 서버 3대가 동시에 만들어진다.
3. 참고 - 이미 있는 서버들 그룹으로 묶기# 1. 빈 그룹 생성 gcloud compute instance-groups unmanaged create www-unmanaged-group --zone=Zone # 2. 기존 인스턴스들을 그룹에 추가 gcloud compute instance-groups unmanaged add-instances www-unmanaged-group \ --instances=www1,www2,www3 --zone=Zone

gcloud compute forwarding-rules create www-rule \
--region Region \
--ports 80 \
--address network-lb-ip-1 \ # 고정 외부 IP
--target-pool www-pool # Target-Pool로 트래픽 전달
➡️ 지금까지 만든 모든 구성 요소(고정 IP, 대상 풀, 서버들)를 하나로 묶어 서비스를 최종적으로 인터넷에 공개하는 "스위치" 역할

gcloud compute forwarding-rules describe www-rule --region Region

IPADDRESS=$(gcloud compute forwarding-rules describe www-rule --region Region --format="json" | jq -r .IPAddress)

echo $IPADDRESS

while true; do curl -m1 $IPADDRESS; done
➡️ 부하 분산기를 통해 www1~3 인스턴스에 골고루 접근하는 것을 알 수 있다.