高度なロード バランシング最適化の Codelab

1. はじめに

高度なロード バランシング最適化の Codelab にようこそ。

この Codelab では、グローバル外部アプリケーション ロードバランサの高度なロード バランシング オプションを構成する方法について説明します。始める前に、クラウド ロード バランシングに関するドキュメント(https://cloud.google.com/load-balancing/docs/load-balancing-overview)を確認することをおすすめします。

c3fb1d3f027e8640.png

図 1. グローバル外部アプリケーション ロードバランサを使用して宛先エンドポイントを選択するワークフロー。

Codelab のトポロジとユースケース

2f7368df335d3de9.png

図 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 がポート 80 のテスト アプリケーションのウェブサイトの外部 IP に http トラフィックでアクセスできるようにするために使用されます。

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. サービス LB ポリシーを構成する

サービス 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

サービス 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 接続して、それらを異常な状態にします。しきい値が 25% の場合、4 つの VM に SSH 接続して Apache サーバーをシャットダウンする必要があります。

これを行うには、4 つの VM を選択し、[SSH] をクリックしてターミナルを起動して接続し、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 ポリシーで提供されている他の機能を試す。