1. はじめに
高度なロード バランシング最適化のコードラボへようこそ。
この Codelab では、グローバル外部アプリケーション ロードバランサの高度なロード バランシング オプションを構成する方法について説明します。始める前に、Cloud Load Balancing に関するドキュメント(https://cloud.google.com/load-balancing/docs/load-balancing-overview)を確認することをおすすめします。
図 1. グローバル外部アプリケーション ロードバランサで宛先エンドポイントを選択するワークフロー。
Codelab のトポロジとユースケース
図 2. HTTP ロードバランサ ルーティング トポロジ
このコードラボでは、2 つのマネージド インスタンス グループを設定します。グローバル外部 HTTPS ロードバランサを作成します。ロードバランサは、Envoy ベースのロードバランサがサポートする高度な機能のいくつかの機能を利用します。デプロイしたら、シミュレートされた負荷を生成し、設定した構成が適切に機能していることを確認します。
学習内容
- ServiceLbPolicy を構成してロードバランサを微調整する方法。
必要なもの
- 外部 HTTPS ロード バランシングに関する知識。この Codelab の前半は、高度なトラフィック管理(Envoy)を備えた外部 HTTPs LB の Codelab(https://codelabs.developers.google.com/codelabs/externalhttplb-adv)と非常によく似ています。最初に確認することをおすすめします。
2. 始める前に
Cloud Shell で、プロジェクト ID が設定されていることを確認します。
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] prodproject=YOUR-PROJECT-NAME echo $prodproject
API を有効にする
必要なサービスをすべて有効にする
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com gcloud services enable networkservices.googleapis.com
3. VPC ネットワークを作成する
VPC ネットワークを作成する
Cloud Shell から
gcloud compute networks create httplbs --subnet-mode=auto
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 httplbs AUTO REGIONAL
VPC ファイアウォール ルールを作成する
VPC を作成したら、ファイアウォール ルールを作成します。このファイアウォール ルールは、すべての IP が HTTP トラフィック用にポート 80 でテスト アプリケーションのウェブサイトの外部 IP にアクセスできるようにするために使用されます。
Cloud Shell から
gcloud compute firewall-rules create httplb-allow-http-rule \ --allow tcp:80 \ --network httplbs \ --source-ranges 0.0.0.0/0 \ --priority 700
出力
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED httplb-allow-http-rule httplbs INGRESS 700 tcp:80 False
この Codelab では、VM の健全性を微調整します。そのため、SSH を許可するファイアウォール ルールも作成します。
Cloud Shell から
gcloud compute firewall-rules create fw-allow-ssh \ --network=httplbs \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
出力
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
4. マネージド インスタンス グループを設定する
HTTP ロードバランサで使用されるバックエンド リソースのパターンを含むマネージド インスタンス グループを設定する必要があります。まず、各リージョンに作成する VM の構成を定義するインスタンス テンプレートを作成します。次に、各リージョンのバックエンドに、インスタンス テンプレートを参照するマネージド インスタンス グループを作成します。
マネージド インスタンス グループは、スコープ内のゾーンまたはリージョンに設定できます。このラボ演習では、ゾーン マネージド インスタンス グループを作成します。
このセクションには、インスタンスの作成時に参照される事前作成された起動スクリプトが表示されます。この起動スクリプトにより、ウェブ アプリケーションのシミュレーションに使用するウェブサーバー機能がインストールされ、有効になります。このスクリプトをご参照ください。
インスタンス テンプレートを作成する
最初のステップは、インスタンス テンプレートを作成することです。
Cloud Shell から
gcloud compute instance-templates create test-template \ --network=httplbs \ --tags=allow-ssh,http-server \ --image-family=debian-9 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl 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 systemctl restart apache2'
出力
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
次の gcloud コマンドを使用して、インスタンス テンプレートが正常に作成されたことを確認できます。
Cloud Shell から
gcloud compute instance-templates list
出力
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
インスタンス グループを作成する
次に、前に作成したインスタンス テンプレートからマネージド インスタンス グループを作成します。
Cloud Shell から
gcloud compute instance-groups managed create us-east1-a-mig \ --size=1 \ --template=test-template \ --zone=us-east1-a
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-a-mig us-east1-a zone us-east1-a-mig 0 1 test-template no
Cloud Shell から
gcloud compute instance-groups managed create us-east1-b-mig \ --size=5 \ --template=test-template \ --zone=us-east1-b
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-b-mig us-east1-b zone us-east1-b-mig 0 5 test-template no
次の gcloud コマンドを使用して、インスタンス グループが正常に作成されたことを確認できます。
Cloud Shell から
gcloud compute instance-groups list
出力
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-east1-a-mig us-east1-a zone httplbs Yes 1 us-east1-b-mig us-east1-b zone httplbs Yes 5
ウェブサーバーの機能を確認する
各インスタンスは、次のような単純な PHP スクリプトを使用して Apache ウェブサーバーを実行するように構成されています。
ページの提供元: us-east1-a-mig-ww2h
ウェブサーバーが正常に機能していることを確認するには、[Compute Engine] > [VM インスタンス] に移動します。新しいインスタンス(us-east1-a-mig-xxx など)がインスタンス グループの定義に従って作成されていることを確認します。
ブラウザでウェブサーバーにウェブリクエストを送信して、ウェブサーバーが実行されていることを確認します(起動に 1 分ほどかかることがあります)。[Compute Engine] の [VM インスタンス] ページで、インスタンス グループによって作成されたインスタンスを選択し、その外部(パブリック)IP をクリックします。
または、ブラウザで http://<IP_Address> に移動します。
5. ロードバランサを設定する
ヘルスチェックを作成する
まず、基本的なヘルスチェックを作成して、サービスが正常に稼働していることを確認します。ここでは基本的なヘルスチェックを作成しますが、高度なカスタマイズも数多く可能です。
Cloud Shell から
gcloud compute health-checks create http http-basic-check \ --port 80
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check]. NAME PROTOCOL http-basic-check HTTP
外部 IP アドレスを予約する
この手順では、後でロードバランサに接続する、グローバルに使用可能な静的 IP アドレスを予約する必要があります。
Cloud Shell から
gcloud compute addresses create lb-ipv4-2 \ --ip-version=IPV4 \ --global
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].
予約された IP アドレスをメモします。
gcloud compute addresses describe lb-ipv4-2 \ --format="get(address)" \ --global
バックエンド サービスを作成する
次に、前に作成したマネージド インスタンス グループのバックエンド サービスを作成する必要があります。
Cloud Shell から
gcloud compute backend-services create east-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service]. NAME BACKENDS PROTOCOL east-backend-service HTTP
MIG をバックエンド サービスに追加する
バックエンド サービスが作成されたので、前に作成したマネージド インスタンス グループを各バックエンド サービスに追加する必要があります。
Cloud Shell から
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global
Cloud Shell から
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global
バックエンドが追加されたことを確認するには、次のコマンドを実行します。
Cloud Shell から
gcloud compute backend-services list
出力
NAME BACKENDS PROTOCOL east-backend-service us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig HTTP
URL マップを作成する
次に、URL マップを作成します。
gcloud compute url-maps create web-map-http \ --default-service=east-backend-service \ --global
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http]. NAME DEFAULT_SERVICE web-map-http backendServices/east-backend-service
HTTP フロントエンドを作成する
ロードバランサの作成の最後のステップは、フロントエンドを作成することです。これにより、前に予約した IP アドレスが、作成したロードバランサ URL マップにマッピングされます。
Cloud Shell から
gcloud compute target-http-proxies create http-lb-proxy-adv \ --url-map=web-map-http
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv]. NAME URL_MAP http-lb-proxy-adv web-map-http
次に、先ほど予約した IP アドレスを HTTP プロキシにマッピングするグローバル転送ルールを作成する必要があります。
Cloud Shell から
gcloud compute forwarding-rules create http-content-rule \ --load-balancing-scheme EXTERNAL_MANAGED \ --address=lb-ipv4-2 \ --global \ --target-http-proxy=http-lb-proxy-adv \ --ports=80
この時点で、前にメモした IP アドレスでロードバランサが機能していることを確認できます。
6. ロードバランサが機能していることを確認する
ロード バランシング機能が動作していることを確認するために、負荷を生成する必要があります。そのために、負荷をシミュレートする新しい VM を作成します。
Siege-vm を作成する
次に、負荷の生成に使用する siege-vm を作成します。
Cloud Shell から
gcloud compute instances create siege-vm \ --network=httplbs \ --zone=us-east1-a \ --machine-type=e2-medium \ --tags=allow-ssh,http-server \ --metadata=startup-script='sudo apt-get -y install siege'
出力
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-central1-ir1 e2-medium 10.132.0.15 34.143.20.68 RUNNING
次に、作成した VM に SSH 接続できます。作成したら、SSH をクリックしてターミナルを起動し、接続します。
接続したら、次のコマンドを実行して負荷を生成します。外部 HTTP ロードバランサ用に予約した IP アドレスを使用します。
Cloud Shell から
siege -c 20 http://$lb-ipv4-2
出力
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
負荷分散を確認する
Siege が実行されたので、トラフィックが 2 つのマネージド インスタンス グループに均等に分散されていることを確認します。
Stop the Siege
高度なトラフィック分割が機能していることを確認できたので、シージを停止します。これを行うには、siege-vm の SSH ターミナルに戻り、Ctrl+C キーを押して siege の実行を停止します。
7. Service Lb ポリシーを構成する
Service LB ポリシーを作成する
基本的な設定が完了したので、Service Lb Policy を作成して高度な機能を試してみましょう。たとえば、高度なロード バランシング設定を使用するようにサービスを構成します。この例では、自動容量ドレイン機能を実行するポリシーを作成します。他の機能もお試しください。
Cloud Shell から
gcloud beta network-services service-lb-policies create http-policy \ --auto-capacity-drain --location=global
次の gcloud コマンドを使用して、ポリシーが正常に作成されたことを確認できます。
Cloud Shell から
gcloud beta network-services service-lb-policies list --location=global
出力
NAME http-policy
Service LB ポリシーをバックエンド サービスに接続する
次に、上記の既存のバックエンド サービスに新しいポリシーを適用します。
Cloud Shell から
gcloud beta compute backend-services update east-backend-service \ --service-lb-policy=http-policy --global
8. バックエンドの状態を調整する
この時点で、新しいサービス lb ポリシーがバックエンド サービスに適用されています。技術的には、直接クリーンアップに進むことができます。この Codelab では、新しいポリシーの仕組みを示すために、本番環境でいくつかの調整も行います。
自動容量ドレイン機能は、正常なバックエンドの合計数が特定のしきい値(25%)を下回ると、バックエンド MIG をロードバランサから自動的に削除します。この機能をテストするために、us-east1-b-mig の VM に SSH で接続し、これらの VM を異常にします。しきい値が 25% の場合、4 つの VM に SSH 接続して Apache サーバーをシャットダウンする必要があります。
これを行うには、4 つの VM を選択し、SSH をクリックしてターミナルを起動し、接続します。その後、次のコマンドを実行します。
sudo apachectl stop
この時点で自動容量ドレイン機能がトリガーされ、us-east1-b-mig は新しいリクエストを受信しなくなります。
9. 自動容量ドレイン機能が機能していることを確認します。
Siege を再起動する
新しい機能を確認するため、Siege VM を再び使用します。前の手順で作成した VM に SSH で接続します。作成されたら、[SSH] をクリックしてターミナルを起動し、接続します。
接続したら、次のコマンドを実行して負荷を生成します。外部 HTTP ロードバランサ用に予約した IP アドレスを使用します。
Cloud Shell から
siege -c 20 http://$lb-ipv4-2
出力
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
この時点で、すべてのリクエストが us-east1-a-mig に送信されていることがわかります。
Stop the Siege
高度なトラフィック分割が機能していることを確認できたので、シージを停止します。これを行うには、siege-vm の SSH ターミナルに戻り、Ctrl+C キーを押して siege の実行を停止します。
10. クリーンアップ手順
ラボ環境の使用が完了したので、環境を削除します。次のコマンドを実行して、テスト環境を削除してください。
Cloud Shell から
gcloud compute instances delete siege-vm --zone=us-east1-a gcloud compute forwarding-rules delete http-content-rule --global gcloud compute target-http-proxies delete http-lb-proxy-adv gcloud compute url-maps delete web-map-http gcloud compute backend-services delete east-backend-service --global gcloud compute addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud beta network-services service-lb-policies delete http-policy --location=global gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b gcloud compute instance-templates delete test-template gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
11. 完了
以上で、この Codelab は完了です。
学習した内容
- サービス LB ポリシーを使用して外部アプリケーション ロードバランサを作成する。
- 自動容量ドレイン機能を使用してバックエンド サービスを構成します。
次のステップ
- サービス LB ポリシーで提供される他の機能を試す。