1. はじめに
重み付きロード バランシングを使用して、HTTP ヘルスチェックから報告された重みに基づいてロードバランサのバックエンド インスタンス間でトラフィックを分散するようにネットワーク ロードバランサを構成できます。
重み付きロード バランシングでは、次の両方を構成する必要があります。
- バックエンド サービスの局所的なロードバランサ ポリシー(localityLbPolicy)を WEIGHTED_MAGLEV に設定する必要があります。
- バックエンド サービスで HTTP/HTTP2/HTTPS ヘルスチェックを構成する必要があります。HTTP ヘルスチェック レスポンスには、カスタム HTTP レスポンス ヘッダー フィールド X-Load-Balancing-Endpoint-Weight が含まれている必要があります。これにより、各バックエンド インスタンスの重み付けを 0 ~ 1000 の整数値(10 進数表記)で指定できます。
重み付きロードバランサを使用し、バックエンド サービスベースの複数のネットワーク ロードバランサのバックエンドとして同じインスタンス グループを使用する場合、バックエンド サービスのヘルスチェックごとに一意のリクエストパスを使用することをおすすめします。詳細については、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 を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。
プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。
この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、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 インスタンスを作成し、重みを割り当てます。
- 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-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 ヘルスチェックを作成する
このチュートリアルでは、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 ヘルスチェックの名前に置き換えます。
バックエンド サービスの作成
次の例では、重み付きロード バランシングを使用するよう構成したリージョン外部バックエンド サービスの作成手順を説明します。
- 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 アドレスを予約します。
- 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
- 予約済みのリージョン外部 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