重み付きロード バランシングを構成する

このガイドでは、リージョン バックエンド サービスを使用して、仮想マシン(VM)インスタンスごとに重み付けをした外部パススルー ネットワーク ロードバランサのデプロイメントの作成手順について説明します。

このチュートリアルでは、3 つの VM インスタンスを含むインスタンス グループを作成し、各インスタンスに重みを割り当てます。バックエンド インスタンスの重みを報告する 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. 3 つのバックエンド VM インスタンスを構成し、HTTP レスポンスの X-Load-Balancing-Endpoint-Weight ヘッダーで重みを返します。このチュートリアルでは、1 つのバックエンド インスタンスが重み 0、次のバックエンド インスタンスが重み 100、3 番目のバックエンド インスタンスが重み 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-0instance-100instance-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 ヘルスチェックを作成する

このチュートリアルでは、HTTP ヘルスチェックを作成して、バックエンド VM の重みを含む 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 アドレスを予約します。

    • 1 つ以上の 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 ヘルスチェックに正しく報告されていることを確認します。

  • バックエンド サービスからバックエンドの重み(とヘルス ステータス)を取得するには、gcloud compute backend-services get-health コマンドを実行します。

    gcloud compute backend-services get-health BACKEND_SERVICE_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