인스턴스별 가중치 적용 네트워크 부하 분산

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 상태 점검에서 보고한 가중치를 기반으로 부하 분산기의 백엔드 인스턴스 전체에 트래픽을 분산하도록 네트워크 부하 분산기를 구성하는 방법입니다.

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.

2. 구성 시작

Codelab에는 단일 프로젝트가 필요합니다.

이 튜토리얼에서는 3개의 VM 인스턴스가 있는 인스턴스 그룹을 만들고 각 인스턴스에 가중치를 할당합니다. HTTP 상태 점검을 만들어 백엔드 인스턴스 가중치를 보고합니다. 가중치 적용 네트워크 부하 분산기는 지역 부하 분산기 정책이 WEIGHTED_MAGLEV인 백엔드 서비스에서 사용 설정되었습니다.

시작하기 전에

gcloud services enable compute.googleapis.com

참고: Google Cloud 콘솔을 사용하여 지역 부하 분산기 정책을 구성하고 VM 인스턴스에 가중치를 할당할 수 없습니다. Google Cloud CLI를 대신 사용하세요.

VPC 네트워크, 서브넷, 방화벽 규칙 만들기

부하 분산기의 백엔드 VM에 대한 연결을 허용하는 VPC 네트워크, 서브넷, 인그레스 허용 방화벽 규칙을 만듭니다.

  1. 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: 만들려는 서브네트워크의 이름
  1. 대상 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 인스턴스를 만들고 가중치를 할당합니다.

  1. 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
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 상태 확인을 만드는 방법을 안내합니다.

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

HTTP_HEALTH_CHECK_NAME을 생성할 HTTP 상태 확인의 이름으로 바꿉니다.

백엔드 서비스 만들기

다음 예시에서는 가중치 적용 부하 분산을 사용하도록 구성된 리전별 외부 백엔드 서비스를 만드는 방법을 안내합니다.

  1. HTTP 상태 점검이 포함된 백엔드 서비스를 만들고 지역 부하 분산기 정책을 WEIGHTED_MAGLEV로 설정합니다.
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를 만들려는 백엔드 서비스의 이름으로 바꿉니다.
  1. 인스턴스 그룹을 백엔드 서비스에 추가합니다.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. 부하 분산기의 리전 외부 IP 주소를 예약합니다.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

ADDRESS_NAME을 생성할 IP 주소의 이름으로 바꿉니다. 결과를 보려면 compute addresses describe 명령어를 사용합니다. 예약된 고정 외부 IP 주소('IP_ADDRESS'')를 기록해 둡니다.

gcloud compute addresses describe ADDRESS_NAME
  1. 예약된 리전 외부 IP 주소('IP_ADDRESS')를 사용하여 전달 규칙을 만듭니다. 전달 규칙을 백엔드 서비스에 연결합니다.
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 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