インスタンスごとの重み付きネットワーク ロード バランシング

1. はじめに

重み付きロード バランシングを使用して、HTTP ヘルスチェックによって報告された重みに基づいてロードバランサのバックエンド インスタンス間でトラフィックを分散するようにネットワーク ロードバランサを構成できます。

重み付きロード バランシングでは、次の両方を構成する必要があります。

  • バックエンド サービスの局所的なロードバランサ ポリシー(localityLbPolicy)を WEIGHTED_MAGLEV に設定する必要があります。
  • HTTP/HTTP2/HTTPS ヘルスチェックを使用してバックエンド サービスを構成する必要があります。HTTP ヘルスチェック レスポンスには、カスタム HTTP レスポンス ヘッダー フィールド X-Load-Balancing-Endpoint-Weight が含まれている必要があります。これにより、0 ~ 1,000 の整数値で各バックエンド インスタンスの重みを 10 進数表現で指定する必要があります。

重み付きロード バランシングを使用して、バックエンド サービスベースの複数のネットワーク ロードバランサのバックエンドとして同じインスタンス グループを使用する場合は、バックエンド サービスのヘルスチェックごとに一意のリクエストパスを使用することをおすすめします。詳細については、HTTP、HTTPS、HTTP/2 ヘルスチェックの成功基準をご覧ください。

HTTP ヘルスチェックは、HTTP 200(OK)レスポンスを返し、ヘルスチェックに合格すると、バックエンド インスタンスが正常とみなされます。すべてのバックエンド インスタンスがヘルスチェックに合格し、X-Load-Balancing-Endpoint-Weight が重み 0 で返された場合、ロードバランサは正常なバックエンド間で新しい接続を分散し、それらのバックエンドを同等の重みで扱います。ロードバランサは、正常でないバックエンド間で新しい接続を分散することもできます。詳細については、トラフィック分散をご覧ください。

重み付きロード バランシングの例については、バックエンドの選択と接続トラッキングをご覧ください。

重み付きロード バランシングは、次のシナリオで使用できます。

  • 一部の接続が他の接続よりも多くのデータを処理する場合や、一部の接続が他の接続よりも長く存続する場合、バックエンドのロード バランシングが不均一になる可能性があります。インスタンスごとの重みが低いことを通知することで、既存の接続の処理を継続しながら、負荷の高いインスタンスで新しい接続のシェアを減らすことができます。
  • バックエンドが過負荷状態になっており、より多くの接続を割り当てると、既存の接続が切断される可能性があります。このようなバックエンドには重み 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 を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。
  • なお、3 つ目の値は、一部の API で使用される [プロジェクト番号] です。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に課金が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

7ffe5cbb04455448.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

2. 設定を開始

Codelab に必要なプロジェクトは 1 つです。

このチュートリアルでは、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. 3 つのバックエンド VM インスタンスを構成して、HTTP レスポンスの X-Load-Balancing-Endpoint-Weight ヘッダーで重みを返します。このチュートリアルでは、1 つのバックエンド インスタンスが重み 0、2 つ目のバックエンド インスタンスが重み 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-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