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에는 단일 프로젝트가 필요합니다.
이 튜토리얼에서는 3개의 VM 인스턴스가 있는 인스턴스 그룹을 만들고 각 인스턴스에 가중치를 할당합니다. 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 네트워크, 서브넷, 방화벽 규칙 만들기
부하 분산기의 백엔드 VM에 대한 연결을 허용하는 VPC 네트워크, 서브넷, 인그레스 허용 방화벽 규칙을 만듭니다.
- 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 인스턴스 만들기 및 가중치 할당
3개의 VM 인스턴스를 만들고 가중치를 할당합니다.
- 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'
인스턴스 그룹 만들기
이 튜토리얼에서는 3개의 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