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

1. はじめに

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

この Codelab では、グローバル外部アプリケーション ロードバランサの高度なロード バランシング オプションを構成する方法について説明します。始める前に、Cloud Load Balancing に関するドキュメント(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 が 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 ポリシーで提供される他の機能を試す。