1. 소개
가중치가 적용된 부하 분산을 사용하여 HTTP 상태 점검에서 보고된 가중치를 기준으로 부하 분산기의 백엔드 인스턴스에 트래픽을 분산하도록 네트워크 부하 분산기를 구성할 수 있습니다.
가중치가 적용된 부하 분산을 사용하려면 다음을 모두 구성해야 합니다.
- 백엔드 서비스의 지역별 부하 분산기 정책 (localityLbPolicy)을 WEIGHTED_MAGLEV로 설정해야 합니다.
- 백엔드 서비스를 HTTP/HTTP2/HTTPS 상태 점검으로 구성해야 합니다. HTTP 상태 점검 응답에는 커스텀 HTTP 응답 헤더 필드 X-Load-Balancing-Endpoint-Weight가 포함되어야 각 백엔드 인스턴스에 0~1000의 정수 값을 십진수 표현으로 사용하여 가중치를 지정할 수 있습니다.
가중치가 적용된 부하 분산을 사용하여 여러 백엔드 서비스 기반 네트워크 부하 분산기의 백엔드와 동일한 인스턴스 그룹을 사용하는 경우 백엔드 서비스의 각 상태 점검에 고유한 요청 경로를 사용하는 것이 좋습니다. 자세한 내용은 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를 실행하여 인증하세요.
- 컴퓨트 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을 보고하도록, 두 번째 백엔드 인스턴스는 가중치 100을 보고하도록, 세 번째 백엔드 인스턴스는 가중치 900을 보고하도록 구성합니다. 인스턴스를 만들려면
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