1. 소개
가중치가 적용된 부하 분산을 사용하여 HTTP 상태 점검에서 보고된 가중치를 기준으로 부하 분산기의 백엔드 인스턴스에 트래픽을 분산하도록 네트워크 부하 분산기를 구성할 수 있습니다.
가중치가 적용된 부하 분산을 사용하려면 다음을 모두 구성해야 합니다.
- 백엔드 서비스의 지역별 부하 분산기 정책 (localityLbPolicy)을 WEIGHTED_MAGLEV로 설정해야 합니다.
- 백엔드 서비스를 HTTP/HTTP2/HTTPS 상태 점검으로 구성해야 합니다. HTTP 상태 점검 응답에는 커스텀 HTTP 응답 헤더 필드 X-Load-Balancing-Endpoint-Weight가 포함되어야 각 백엔드 인스턴스에 0~1000의 정수 값을 10진수 표현으로 가중치를 지정할 수 있습니다.
가중치가 적용된 부하 분산을 사용하여 여러 백엔드 서비스 기반 네트워크 부하 분산기의 백엔드와 동일한 인스턴스 그룹을 사용하는 경우 백엔드 서비스의 각 상태 점검에 고유한 request-path를 사용하는 것이 좋습니다. 자세한 내용은 HTTP, HTTPS, HTTP/2 상태 점검의 성공 기준을 참조하세요.
HTTP 상태 점검은 상태 점검이 통과되고 백엔드 인스턴스가 정상으로 간주되도록 HTTP 200 (OK) 응답을 반환해야 합니다. 모든 백엔드 인스턴스가 상태 점검을 통과하고 가중치가 0인 X-Load-Balancing-Endpoint-Weight를 반환하는 경우 부하 분산기는 정상 백엔드 간에 새 연결을 분산하여 동일한 가중치가 적용된 백엔드로 취급합니다. 부하 분산기는 비정상 백엔드 간에 새 연결을 분산할 수도 있습니다. 자세한 내용은 트래픽 분산을 참조하세요.
가중치가 적용된 부하 분산의 예시는 백엔드 선택 및 연결 추적을 참조하세요.
가중치가 적용된 부하 분산은 다음 시나리오에서 사용할 수 있습니다.
- 일부 연결이 다른 연결보다 많은 데이터를 처리하거나 일부 연결이 다른 연결보다 오래 지속되는 경우 백엔드 부하 분산이 불균형해질 수 있습니다. 더 낮은 인스턴스당 가중치를 알리면 부하가 높은 인스턴스는 기존 연결을 유지하면서 새로운 연결의 비율을 줄일 수 있습니다.
- 백엔드에 과부하가 걸려 있고 연결을 더 할당하면 기존 연결이 끊어질 수 있으며, 이러한 백엔드는 자체적으로 가중치를 0으로 할당합니다. 가중치 0을 적용하면 백엔드 인스턴스는 새로운 연결의 서비스를 중단하지만 기존 연결은 계속 처리합니다.
- 백엔드가 유지보수 전에 기존 연결을 드레이닝하면 백엔드는 자체적으로 가중치를 0으로 할당합니다. 가중치 0을 적용하면 백엔드 인스턴스는 새로운 연결의 서비스를 중단하지만 기존 연결은 계속 처리합니다.
학습할 내용
- 가중치가 적용된 부하 분산을 사용하여 HTTP 상태 점검에서 보고된 가중치를 기준으로 부하 분산기의 백엔드 인스턴스에 트래픽을 분산하도록 네트워크 부하 분산기를 구성하는 방법
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.



- 프로젝트 이름 은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID 는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다 (설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 지정해서 사용할 수 있는지 확인할 수 있습니다. 이 단계 후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호 입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화$300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
2. 구성 시작
Codelab에는 단일 프로젝트가 필요합니다.
이 튜토리얼에서는 VM 인스턴스가 3개 있는 인스턴스 그룹을 만들고 각 인스턴스에 가중치를 할당합니다. 백엔드 상태 가중치를 보고하는 HTTP 상태 점검을 만듭니다. 가중치가 적용된 네트워크 부하 분산기가 지역 부하 분산기 정책이 WEIGHTED_MAGLEV로 설정된 백엔드 서비스에서 사용 설정됩니다.
시작하기 전에
- 백엔드 서비스 기반 외부 네트워크 부하 분산 개요를 읽습니다.
- Google Cloud CLI 설치 이 도구에 대한 전체 개요는 gcloud CLI 개요를 참조하세요. API 및 gcloud CLI 참조에서 부하 분산과 관련된 명령어를 확인할 수 있습니다. 이전에 Google Cloud CLI를 실행한 적이 없다면 먼저 gcloud init를 실행하여 인증하세요.
- Compute API를 사용 설정합니다.
gcloud services enable compute.googleapis.com
참고: Google Cloud 콘솔을 사용하여 지역 부하 분산기 정책을 구성하고 VM 인스턴스에 가중치를 할당할 수 없습니다. Google Cloud CLI를 대신 사용하세요.
VPC 네트워크, 서브넷, 방화벽 규칙 만들기
VPC 네트워크, 서브넷, 수신 허용 방화벽 규칙을 만들어 부하 분산기의 백엔드 VM에 연결할 수 있도록 합니다.
- VPC 네트워크 및 서브넷을 만듭니다. a. VPC 네트워크를 만들기 위해
gcloud compute networks create명령어를 실행합니다:
gcloud compute networks create NETWORK_NAME --subnet-mode custom
b. 이 예시에서 서브넷의 기본 IPv4 주소 범위는 10.10.0.0/24입니다.
서브넷을 만들려면 gcloud compute networks subnets create 명령어를 실행합니다.
gcloud compute networks subnets create SUBNET_NAME \ --network=NETWORK_NAME \ --range=10.10.0.0/24 \ --region=us-central1
다음을 바꿉니다.
NETWORK_NAME: 만들려는 VPC 네트워크의 이름SUBNET_NAME: 만들려는 서브네트워크의 이름
- 수신 허용 방화벽 규칙을 만들어 대상 TCP 포트 80 및 443으로 전송된 패킷이 백엔드 VM으로 전달되도록 합니다. 이 예시에서 방화벽 규칙은 모든 소스 IP 주소의 연결을 허용합니다. 방화벽 규칙은 네트워크 태그
network-lb-tag가 있는 VM에 적용됩니다. 방화벽 규칙을 만들려면gcloud compute firewall-rules create명령어를 실행합니다.
gcloud compute firewall-rules create FIREWALL_RULE_NAME \ --direction=INGRESS \ --priority=1000 \ --network=NETWORK_NAME \ --action=ALLOW \ --rules=tcp:80,tcp:443 \ --source-ranges=0.0.0.0/0 \ --target-tags=network-lb-tag
FIREWALL_RULE_NAME을 만들려는 방화벽 규칙의 이름으로 바꿉니다.
VM 인스턴스 만들기 및 가중치 할당
VM 인스턴스 3개를 만들고 가중치를 할당합니다.
- HTTP 응답과 함께 X-Load-Balancing-Endpoint-Weight 헤더에 가중치를 반환하도록 백엔드 VM 인스턴스 3개를 구성합니다. 이 튜토리얼에서는 가중치 0을 보고하도록 백엔드 인스턴스 1개, 가중치 100을 보고하도록 백엔드 인스턴스 2개, 가중치 900을 보고하도록 백엔드 인스턴스 3개를 구성합니다. 인스턴스를 만들려면
gcloud compute instances create명령어를 실행합니다.
gcloud compute instances create instance-0 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet= SUBNET_NAME \ --metadata=load-balancing-weight=0,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load 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 lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
gcloud compute instances create instance-100 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet=SUBNET_NAME \ --metadata=load-balancing-weight=100,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load 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 lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
gcloud compute instances create instance-900 \
--zone=us-central1-a \
--tags=network-lb-tag \
--image-family=debian-10 \
--image-project=debian-cloud \
--subnet=
SUBNET_NAME
\
--metadata=load-balancing-weight=900,startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
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
lb_weight="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
tee /etc/apache2/conf-enabled/headers.conf
systemctl restart apache2'
인스턴스 그룹 만들기
이 튜토리얼에서는 모든 VM 인스턴스(instance-0, instance-100, and instance-900)가 포함된 비관리형 인스턴스 그룹을 만드는 방법을 설명합니다.
- 인스턴스 그룹을 만들려면
gcloud compute instance-groups unmanaged create명령어를 실행합니다.
gcloud compute instance-groups unmanaged create INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \ --zone=us-central1-a \ --instances=instance-0,instance-100,instance-900
INSTANCE_GROUP 을 만들려는 인스턴스 그룹의 이름으로 바꿉니다.
HTTP 상태 점검 만들기
이 튜토리얼에서는 백엔드 VM 가중치가 포함된 HTTP 응답을 읽기 위해 HTTP 상태 점검을 만드는 방법을 제공합니다.
- HTTP 상태 점검을 만들려면
gcloud compute health-checks create명령어를 실행합니다.
gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \ --region=us-central1
HTTP_HEALTH_CHECK_NAME을 만들려는 HTTP 상태 점검의 이름으로 바꿉니다.
백엔드 서비스 만들기
다음 예시에서는 가중치가 적용된 부하 분산을 사용하도록 구성된 리전 외부 백엔드 서비스를 만드는 방법을 설명합니다.
- HTTP 상태 점검으로 백엔드 서비스를 만들고 지역 부하 분산기 정책을 WEIGHTED_MAGLEV로 설정합니다.
- 백엔드 서비스를 만들려면
gcloud compute backend-services create명령어를 실행합니다.
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --load-balancing-scheme=external \ --protocol=tcp \ --region=us-central1 \ --health-checks=HTTP_HEALTH_CHECK_NAME \ --health-checks-region=us-central1 \ --locality-lb-policy=WEIGHTED_MAGLEV
BACKEND_SERVICE_NAME을 만들려는 백엔드 서비스의 이름으로 바꿉니다.
- 인스턴스 그룹을 백엔드 서비스에 추가합니다.
- 인스턴스 그룹을 추가하려면
gcloud compute backend-services add-backend명령어를 실행합니다.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=INSTANCE_GROUP \ --instance-group-zone=us-central1-a \ --region=us-central1
- 부하 분산기의 리전 외부 IP 주소를 예약합니다.
- IP 주소를 하나 이상 예약하려면
gcloud compute addresses create명령어를 실행합니다.
gcloud compute addresses create ADDRESS_NAME \ --region us-central1
ADDRESS_NAME을 만들려는 IP 주소의 이름으로 바꿉니다. compute addresses describe 명령어를 사용하여 결과를 확인합니다. 예약된 고정 외부 IP 주소(IP_ADDRESS')를 기록해 둡니다.
gcloud compute addresses describe ADDRESS_NAME
- 예약된 리전 외부 IP 주소 ‘IP_ADDRESS'를 사용하여 전달 규칙을 만듭니다. 전달 규칙을 백엔드 서비스에 연결합니다.
- 전달 규칙을 만들려면
gcloud compute forwarding-rules create명령어를 실행합니다.
gcloud compute forwarding-rules create FORWARDING_RULE \ --region=us-central1 \ --ports=80 \ --address=IP_ADDRESS \ --backend-service=BACKEND_SERVICE_NAME
- 다음을 바꿉니다.
FORWARDING_RULE: 만들려는 전달 규칙의 이름IP_ADDRESS:인스턴스에 할당할 IP 주소 주소 이름이 아닌 예약된 고정 외부 IP 주소를 사용합니다.
백엔드 서비스 API를 사용하여 백엔드 가중치 확인
백엔드 가중치가 HTTP 상태 점검에 올바르게 보고되는지 확인합니다.
- 백엔드 서비스에서 백엔드 가중치를 (상태와 함께) 가져오려면
gcloud compute backend-services get-health명령어를 실행합니다.
gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \ --region=us-central1
출력은 다음과 같아야 합니다.
backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
healthStatus:
- forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
forwardingRuleIp: 34.135.46.66
healthState: HEALTHY
instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
ipAddress: 10.10.0.5
port: 80
weight: '0'
- forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
forwardingRuleIp: 34.135.46.66
healthState: HEALTHY
instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
ipAddress: 10.10.0.6
port: 80
weight: '100'
- forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
forwardingRuleIp: 34.135.46.66
healthState: HEALTHY
instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
ipAddress: 10.10.0.7
port: 80
weight: '900'
kind: compute#backendServiceGroupHealth