가중치가 적용된 부하 분산 구성

이 가이드에서는 리전 백엔드 서비스를 사용하여 각 가상 머신(VM) 인스턴스에서 가중치가 적용된 외부 패스 스루 네트워크 부하 분산기 배포를 만드는 방법을 안내합니다.

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

시작하기 전에

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: 만들려는 서브네트워크의 이름입니다.
  2. 대상 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'
    

인스턴스 그룹 만들기

이 튜토리얼에서는 VM 인스턴스 3개(instance-0, instance-100, 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 상태 점검의 이름으로 바꿉니다.

백엔드 서비스 만들기

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

  1. 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을 만들려는 백엔드 서비스의 이름으로 바꿉니다.

  2. 인스턴스 그룹을 백엔드 서비스에 추가합니다.

    • 인스턴스 그룹을 추가하려면 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
      
  3. 부하 분산기의 리전 외부 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
      
  4. 예약된 리전 외부 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 상태 점검에 올바르게 보고되는지 확인합니다.

출력은 다음과 같습니다.

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