Cloud Load Balancing
Cloud Load Balancing
- 種類
- 作成
- ユースケース
1. 種類
Cloud Load Balancing の負荷分散の種類には以下がある。
種類 | 内部/外部 | リージョン/グローバル | プロキシ/パススルー | Docs | 補足 |
---|---|---|---|---|---|
内部 TCP/UDP | 内部 | リージョン限定 | パススルー | 内部 TCP/UDP 負荷分散の概要 | |
内部 HTTP(S) | 内部 | リージョン限定 | プロキシ | 内部 HTTP(S) 負荷分散 | |
TCP/UDP ネットワーク | 外部 | リージョン限定 | パススルー | 外部 TCP / UDP ネットワーク負荷分散 | ネットワークロードバランサ |
TCP プロキシ | 外部 | グローバル | プロキシ | TCP プロキシ負荷分散 | |
SSL プロキシ | 外部 | グローバル | プロキシ | SSL プロキシ負荷分散 | |
外部 HTTP(S) | 外部 | グローバル | プロキシ | 外部 HTTP(S) 負荷分散 | HTTP(S) ロードバランサ |
- 内部/外部
- 外部:インターネットからのトラフィック
- 内部: VPC 内のトラフィック
- リージョン/グローバル
- グローバル
- バックエンドが複数リージョンに分散
- 単一のエニーキャスト IP アドレスを使用してアクセスを提供( IPv6 もある)
- 「外部」かつ「プロキシ」の負荷分散
- リージョン
- バックエンドが同一リージョン内
- IPv4 のみ
- 「内部」または「パススルー」の負荷分散
- グローバル
- プロキシ/パススルー
- プロキシ( NAT 型)
- LB で一度接続終端する(送信元 IP が LB の内部 IP に変わる)ため、ファイアウォールルールは VPC ネットワーク内を許可する必要がある
- バックエンド VM からのレスポンスは、ロードバランサを経由して、クライアントに送信される
- パススルー( Direct Server Return : DSR 型)
- 接続終端しないのでクライアントの IP がそのまま届くため、ファイアウォールルールは
0.0.0.0/0
からのトラフィックを許可する必要がある - バックエンド VM からのレスポンスは、ロードバランサを経由せず、クライアントに直接送信される(DSR)
- 接続終端しないのでクライアントの IP がそのまま届くため、ファイアウォールルールは
- プロキシ( NAT 型)
選択方法としては以下のようになる。
ネットワークロードバランサ と HTTP(S) ロードバランサ の特徴は以下。
- ネットワークロードバランサ
- バックエンド サービスベースのネットワーク ロードバランサ(非レガシー、ただしプレビュー版)
- バックエンド サービスを使うと、レガシー ヘルスチェックではサポートされていない新しい機能が有効になる
- 非レガシー ヘルスチェック(TCP、SSL、HTTP、HTTPS、HTTP/2)のサポート、マネージド インスタンス グループによる自動スケーリング、コネクション ドレイン、構成可能なフェイルオーバー ポリシーなどが可能
- ターゲット プールベースのネットワーク ロードバランサ(レガシー)
- 以前は、ネットワーク ロードバランサの唯一の選択肢
- ターゲット プールは、Google Cloud のネットワーク ロードバランサでサポートされているレガシー バックエンド
- ターゲット プールは、ロードバランサから受信トラフィックを受け取るインスタンスのグループを定義している
- バックエンド サービスベースのネットワーク ロードバランサ(非レガシー、ただしプレビュー版)
- HTTP(S) ロードバランサ
- 複数のバックエンド タイプをサポート
- インスタンス グループ
- ゾーン ネットワーク エンドポイント グループ(NEG)
- サーバーレス NEG: 1 つ以上の App Engine、Cloud Run、Cloud Functions サービス
- インターネット NEG: Google Cloud の外部にあるエンドポイント(カスタム送信元とも呼ばれる)
- Cloud Storage のバケット
- 複数のバックエンド タイプをサポート
HTTP(S) ロードバランサ の構成イメージは以下。
1.1. 負荷分散
トラフィック分散には 次のような種類がある。
2. 作成
2.1. ネットワークロードバランサのコンセプト
- ターゲットプール
- 静的外部 IP アドレス
- レガシー HTTP ヘルスチェック リソース
- 転送ルール
2.2. ネットワークロードバランサの作成
デフォルトのリージョンとゾーンを設定する。
$ gcloud config set compute/zone us-central1-a
$ gcloud config set compute/region us-central1
3 つの Web サーバを構築する。(インスタンス名のみ異なり、それぞれ metadata の startup-script で apache をインストール・起動している。)
$ gcloud compute instances create www1 \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-a \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
$ gcloud compute instances create www2 \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-a \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
$ gcloud compute instances create www3 \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-a \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"
上記のインスタンスに適用するファイアウォール( network-lb-tag
がついたインスタンスに対して 80
ポートアクセスを許可)を作成する。
$ gcloud compute firewall-rules create www-firewall-network-lb \
--target-tags network-lb-tag --allow tcp:80
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/firewalls/www-firewall-network-lb].
Creating firewall...done.
NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED
www-firewall-network-lb default INGRESS 1000 tcp:80 False
インスタンス一覧から「 EXTERNAL_IP 」を確認して、それぞれ curl
で疎通する。
$ gcloud compute instances list
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
www1 us-central1-a n1-standard-1 10.128.0.2 35.238.246.91 RUNNING
www2 us-central1-a n1-standard-1 10.128.0.3 35.232.249.208 RUNNING
www3 us-central1-a n1-standard-1 10.128.0.4 34.123.247.106 RUNNING
$ curl http://35.238.246.91
!doctype html><html><body><h1>www1</h1></body></html>
$ curl http://35.232.249.208
!doctype html><html><body><h1>www2</h1></body></html>
$ curl http://34.123.247.106
!doctype html><html><body><h1>www3</h1></body></html>
ここまでが、負荷分散対象となる Web サーバ群の作成。
ターゲット プールベースのネットワーク ロードバランサを作成して上記 3 つの Web サーバを適用する。
まずは、静的外部 IP アドレスを作成する。
$ gcloud compute addresses create network-lb-ip-1 \
--region us-central1
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1/addresses/network-lb-ip-1].
次に、レガシー HTTP ヘルスチェック リソースを作成する。
$ gcloud compute http-health-checks create basic-check
NAME HOST PORT REQUEST_PATH
basic-check 80 /
次に、インスタンスと同じリージョンに ターゲットプール を追加する。
ターゲットプールが機能するにはヘルスチェックが必要なため、先ほど作成した HTTP ヘルスチェックリソースを適用して作成する。
$
gcloud compute target-pools create www-pool \
--region us-central1 --http-health-check basic-check
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1/targetPools/www-pool].
NAME REGION SESSION_AFFINITY BACKUP HEALTH_CHECKS
www-pool us-central1 NONE basic-check
ターゲットプールに 3 つの Web サーバインスタンスを追加する。
$ gcloud compute target-pools add-instances www-pool \
--instances www1,www2,www3
Updated [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1/targetPools/www-pool].
静的外部 IP アドレスに来たトラフィックを ターゲットプールに転送する 転送ルール を作成する。
$ gcloud compute forwarding-rules create www-rule \
--region us-central1 \
--ports 80 \
--address network-lb-ip-1 \
--target-pool www-pool
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1/forwardingRules/www-rule].
これで、静的外部 IP にアクセスすれば、 3 つの Web サーバに負荷分散される。
$ gcloud compute addresses list
NAME ADDRESS/RANGE TYPE PURPOSE NETWORK REGION SUBNET STATUS
network-lb-ip-1 35.232.6.132 EXTERNAL us-central1 IN_USE # IP 確認
$ gcloud compute forwarding-rules describe www-rule --region us-central1
IPAddress: 35.232.6.132 # IP 確認
IPProtocol: TCP
creationTimestamp: '2021-04-07T05:45:21.364-07:00'
description: ''
fingerprint: NinUJkv44qA=
id: '3582287157978470286'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
loadBalancingScheme: EXTERNAL
name: www-rule
networkTier: PREMIUM
portRange: 80-80
region: https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1/forwardingRules/www-rule
target: https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/regions/us-central1/targetPools/www-pool
$ curl http://35.232.6.132
# 連続で負荷分散の様子を確認
$ while true; do curl -m1 35.232.6.132; done
# www1/2/3 が不規則に出る
2.3. HTTP(S) ロードバランサのコンセプト
- インスタンステンプレート
- VM インスタンス や マネージドインスタンスグループ( MIG )を作成するために使用できるリソース
- マシンタイプ、ブートディスク イメージまたはコンテナ イメージ、ラベル、その他のインスタンス プロパティを定義できる
- マネージドインスタンスグループ( MIG )
- 単一のエンティティとして管理できる VM インスタンスのグループ
- 自動スケーリング、自動修復、リージョン(マルチゾーン)デプロイメント、自動更新などの自動化 MIG サービスを活用できる
- 負荷分散のためヘルスチェック ではなく、 マネージド インスタンス グループのヘルスチェック があり、自動修復の基準となる
gcloud compute instance-groups managed create
- グローバル静的外部 IP アドレス
- ヘルスチェエク
- バックエンドサービス
- URL マップ
- ターゲット HTTP プロキシ
- グローバル転送ルール
3.2.4. HTTP(S) ロードバランサの作成
外部 HTTP(S) ロードバランサの構成要素は以下の通り。
- グローバル外部 IP アドレス(
addresses --global
):OSI 参照モデル第4層 - ネットワーク層:IP アドレス - グローバル転送ルール(
forwarding-rules
)- IP アドレスが受信したトラフィックをプロキシへ転送する
- HTTP プロキシ(
target-http-proxies
): OSI 参照モデル第4層 - トランスポート層:TCP - URL マップ(
url-maps
): OSI 参照モデル第7層 - アプリケーション層:HTTP- ホストとパスに基づいてトラフィックを1つ以上の宛先に転送
- バックエンドサービス( backend-services )
- ヘルスチェック( health-checks )
負荷分散ターゲットの基となる インスタンステーンプレート を作成する。
$ gcloud compute instance-templates create lb-backend-template \
--region=us-central1 \
--network=default \
--subnet=default \
--tags=allow-health-check \
--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'
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/instanceTemplates/lb-backend-template].
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP
lb-backend-template n1-standard-1 2021-04-07T06:01:46.131-07:00
作成したテンプレートに基づいて、マネージドインスタンスグループ( MIG )を作成する。
$ gcloud compute instance-groups managed create lb-backend-group \
--template=lb-backend-template --size=2 --zone=us-central1-a
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/zones/us-central1-a/instanceGroupManagers/lb-backend-group].
NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED
lb-backend-group us-central1-a zone lb-backend-group 0 2 lb-backend-template no
fw-allow-health-check
ファイアウォール ルールを作成する。
これは、Google Cloud ヘルスチェック システム(130.211.0.0/22 と 35.191.0.0/16)からのトラフィックを許可する上り(内向き)ルール。( プローブ IP 範囲とファイアウォール ルール )
ターゲットタグ allow-health-check
を使用して VM が識別される。
$ gcloud compute firewall-rules create fw-allow-health-check \
--network=default \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-health-check \
--rules=tcp:80
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/firewalls/fw-allow-health-check].
Creating firewall...done.
NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED
fw-allow-health-check default INGRESS 1000 tcp:80 False
ロードバランサにユーザーが接続する際に使用するグローバル静的外部 IP アドレスを作成する。
$ gcloud compute addresses create lb-ipv4-1 \
--ip-version=IPV4 \
--global
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/addresses/lb-ipv4-1].
# 作成した IP のアドレスを確認
$ gcloud compute addresses describe lb-ipv4-1 \
--format="get(address)" \
--global
34.120.128.63
ロードバランサのヘルスチェックを作成。
$ gcloud compute health-checks create http http-basic-check --port 80
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/healthChecks/http-basic-check].
NAME PROTOCOL
http-basic-check HTTP
ヘルスチェックを適用した バックエンドサービス を作成。
$ gcloud compute backend-services create web-backend-service \
--protocol=HTTP \
--port-name=http \
--health-checks=http-basic-check \
--global
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/backendServices/web-backend-service].
NAME BACKENDS PROTOCOL
web-backend-service HTTP
MIG をバックエンドとしてバックエンドサービスに追加。
$ gcloud compute backend-services add-backend web-backend-service \
--instance-group=lb-backend-group \
--instance-group-zone=us-central1-a \
--global
Updated [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/backendServices/web-backend-service].
デフォルトの バックエンドサービス に受信リクエストをルーティングする URL マップを作成。
$ gcloud compute url-maps create web-map-http \
--default-service web-backend-service
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/urlMaps/web-map-http].
NAME DEFAULT_SERVICE
web-map-http backendServices/web-backend-service
作成した URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成。
$ gcloud compute target-http-proxies create http-lb-proxy \
--url-map web-map-http
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/targetHttpProxies/http-lb-proxy].
NAME URL_MAP
http-lb-proxy web-map-http
受信リクエストをプロキシにルーティングするグローバル転送ルールを作成。
$ gcloud compute forwarding-rules create http-content-rule \
--address=lb-ipv4-1\
--global \
--target-http-proxy=http-lb-proxy \
--ports=80
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-aa3df922e690/global/forwardingRules/http-content-rule].
Cloud Console のナビゲーション メニューで、[ネットワーク サービス] > [Cloud Load Balancing] に移動して、作成したロードバランサ(web-map-http)をクリック。
[バックエンド] セクションでバックエンドの名前をクリックして、VM が正常であることを確認。
ブラウザで「http://34.120.128.63」にアクセスして動確(リロードしまくり)。「lb-backend-group-xxxx」の「xxxx」が変わることで、 MIG 内の別インスタンスに負荷分散されていることがわかる。
3. ユースケース
3.1. Cloud Armor
外部 HTTP ロードバランサを作成し、 Cloud Armor を使用して DoS 対策を行う。
まず、HTTP とヘルスチェックのファイアウォール ルールを構成する。
# HTTP ファイアウォールルール default-allow-http を作成
$ gcloud compute firewall-rules create default-allow-http \
--action=allow \
--direction=ingress \
--source-ranges=0.0.0.0/0 \
--target-tags=http-server \
--rules=tcp:80
# ヘルスチェックのファイアウォールルール default-allow-health-check を作成
$ gcloud compute firewall-rules create default-allow-health-check \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=http-server \
--rules=tcp
インスタンス テンプレートを構成し、インスタンス グループを作成する。
#####
# us-east1
#####
# インスタンス テンプレート us-east1-template を作成
$ gcloud compute instance-templates create us-east1-template \
--region=us-east1 \
--network=default \
--subnet=default \
--tags=http-server \
--scopes default \
--metadata startup-script-url=gs://cloud-training/gcpnet/httplb/startup.sh
# インスタンス テンプレート us-east1-template から MIG us-east1-mig を作成
$ gcloud compute instance-groups managed create us-east1-mig \
--region=us-east1 \
--template=us-east1-template \
--size=1
# MIG us-east1-mig に CPU 使用率に基づくスケーリングを設定
$ gcloud compute instance-groups managed set-autoscaling us-east1-mig \
--region=us-east1 \
--target-cpu-utilization 0.80 \
--min-num-replicas 1 \
--max-num-replicas 5 \
--cool-down-period 45
#####
# europe-west1
#####
# インスタンス テンプレート europe-west1-template を作成
$ gcloud compute instance-templates create europe-west1-template \
--region=europe-west1 \
--network=default \
--subnet=default \
--tags=http-server \
--scopes default \
--metadata startup-script-url=gs://cloud-training/gcpnet/httplb/startup.sh
# インスタンス テンプレート europe-west1-template から MIG europe-west1-mig を作成
$ gcloud compute instance-groups managed create europe-west1-mig \
--region=europe-west1 \
--template=europe-west1-template \
--size=1
# MIG europe-west1-mig に CPU 使用率に基づくスケーリングを設定
$ gcloud compute instance-groups managed set-autoscaling europe-west1-mig \
--region=europe-west1 \
--target-cpu-utilization 0.80 \
--min-num-replicas 1 \
--max-num-replicas 5 \
--cool-down-period 45
HTTP ロードバランサを構成する。
# ヘルスチェックを作成
$ gcloud compute health-checks create http http-health-check \
--port 80
# ヘルスチェックを構成したバックエンドサービスを作成(ロギングを有効化し、サンプリングレート1.0)
$ gcloud compute backend-services create http-backend \
--protocol=HTTP \
--port-name=http \
--health-checks=http-health-check \
--enable-logging \
--logging-sample-rate=1.0 \
--global
# MIG をバックエンドに追加
$ gcloud compute backend-services add-backend http-backend \
--instance-group=us-east1-mig \
--instance-group-region=us-east1 \
--balancing-mode=RATE \
--max-rate=50 \
--capacity-scaler=1.0 \
--global
$ gcloud compute backend-services add-backend http-backend \
--instance-group=europe-west1-mig \
--instance-group-region=europe-west1 \
--balancing-mode=UTILIZATION \
--max-utilization=0.80 \
--capacity-scaler=1.0 \
--global
# フロントエンドを構成
# IP アドレスを作成
$ gcloud compute addresses create http-lb-ipv4 \
--ip-version=IPV4 \
--global
$ gcloud compute addresses create http-lb-ipv6 \
--ip-version=IPV6 \
--global
# URL マップを作成( URL マップが ロードバランサの名前に該当する、ここでは http-lb )
$ gcloud compute url-maps create http-lb \
--default-service http-backend # バックエンドサービスは http-backend
# URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成
$ gcloud compute target-http-proxies create http-lb-proxy \
--url-map http-lb
# 受信リクエストをプロキシにルーティングするグローバル転送ルールを作成
$ gcloud compute forwarding-rules create http-ipv4-rule \
--address=http-lb-ipv4 \
--global \
--target-http-proxy=http-lb-proxy \
--ports=80
$ gcloud compute forwarding-rules create http-ipv6-rule \
--address=http-lb-ipv6 \
--global \
--target-http-proxy=http-lb-proxy \
--ports=80
HTTP ロードバランサをテストする。
- ブラウザで
http://[LB_IP_v4]
にアクセス
HTTP ロードバランサのストレステストを実施する。
# ストレステスト用の VM インスタンス を作成
$ gcloud compute instances create siege-vm --zone=us-west1-c
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-04-c77142eb9067/zones/us-west1-c/instances/siege-vm].
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
siege-vm us-west1-c n1-standard-1 10.138.0.2 34.105.25.106 RUNNING
# siege-vm に SSH して設定
$ gcloud compute ssh siege-vm --zone=us-west1-c
$ sudo apt-get -y install siege
$ export LB_IP=34.98.93.118 # LB の IPV4
$ siege -c 250 http://$LB_IP
$ exit
siege-vm をブラックリストに登録する。
# siege-vm の外部 IP を確認
$ gcloud compute instances describe siege-vm
Google Cloud Armor を構成し、 VM インスタンス siege-vm からのリクエストを遮断する。
# Google Cloud Armor セキュリティ ポリシーを作成
$ gcloud compute security-policies create denylist-siege
# セキュリティ ポリシーに対するデフォルトのルールを更新し、トラフィックを許可
$ gcloud compute security-policies rules create 2147483647 \
--action=allow \
--src-ip-ranges=\* \
--security-policy=denylist-siege
# セキュリティ ポリシーにルールを追加し、siege-vm からのリクエストを拒否
$ gcloud compute security-policies rules create 1000 \
--action=deny\(403\) \
--src-ip-ranges=34.105.25.106 \
--security-policy=denylist-siege
# セキュリティ ポリシーをバックエンド サービスに接続
$ gcloud compute backend-services update http-backend \
--security-policy=denylist-siege
VM インスタンス siege-vm に SSH して接続が拒否されるのを確認する。
$ gcloud compute ssh siege-vm --zone=us-west1-c
$ export LB_IP=34.98.93.118 # LB の IPV4
$ curl http://$LB_IP
<!doctype html><meta charset="utf-8"><meta name=viewport content="width=device-width, initial-scale=1"><title>403</title>403 Forbidden
3.2. 内部ロードバランサの作成
TCP/UDP トラフィックの内部負荷分散機能を作成する。
内部負荷分散により、内部仮想(VM)マシンのインスタンスのみにアクセス可能なプライベート負荷分散 IP アドレスの背後でサービスを実行、スケーリングする。
まず、HTTP とヘルスチェックのファイアウォール ルールを構成する。
なお、us-central1
リージョン内に subnet-a
と subnet-b
を備えたネットワーク my-internal-app
があらかじめ構成されている。
# HTTP ファイアウォールルール app-allow-http を作成
$ gcloud compute firewall-rules create app-allow-http \
--network=my-internal-app \
--action=allow \
--direction=ingress \
--source-ranges=0.0.0.0/0 \
--target-tags=lb-backend \
--rules=tcp:80
# ヘルスチェックのファイアウォールルール app-allow-health-check を作成
$ gcloud compute firewall-rules create app-allow-health-check \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=lb-backend \
--rules=tcp
上記のファイアウォールはネットワークタグによって確実に適用される。
インスタンス テンプレートを構成し、インスタンス グループを作成する。
#####
# subnet-a
#####
# インスタンス テンプレート instance-template-1 を作成
$ gcloud compute instance-templates create instance-template-1 \
--region=us-central1 \
--network=my-internal-app \
--subnet=subnet-a \
--tags=lb-backend \
--scopes=default \
--metadata=startup-script-url=gs://cloud-training/gcpnet/ilb/startup.sh
# インスタンス テンプレート instance-template-1 から MIG instance-group-1 を作成
$ gcloud compute instance-groups managed create instance-group-1 \
--zone=us-central1-a \
--template=instance-template-1 \
--size=1
# MIG instance-group-1 に CPU 使用率に基づくスケーリングを設定
$ gcloud compute instance-groups managed set-autoscaling instance-group-1 \
--zone=us-central1-a \
--target-cpu-utilization 0.80 \
--min-num-replicas 1 \
--max-num-replicas 5 \
--cool-down-period 45
#####
# subnet-b
#####
# インスタンス テンプレート instance-template-2 を作成
$ gcloud compute instance-templates create instance-template-2 \
--region=us-central1 \
--network=my-internal-app \
--subnet=subnet-b \
--tags=lb-backend \
--scopes=default \
--metadata=startup-script-url=gs://cloud-training/gcpnet/ilb/startup.sh
# インスタンス テンプレート instance-template-2 から MIG instance-group-2 を作成
$ gcloud compute instance-groups managed create instance-group-2 \
--zone=us-central1-b \
--template=instance-template-2 \
--size=1
# MIG instance-group-2 に CPU 使用率に基づくスケーリングを設定
$ gcloud compute instance-groups managed set-autoscaling instance-group-2 \
--zone=us-central1-b \
--target-cpu-utilization 0.80 \
--min-num-replicas 1 \
--max-num-replicas 5 \
--cool-down-period 45
疎通用の VM インスタンス utility-vm
を作成する。
# 疎通用 VM インスタンス作成
$ gcloud compute instances create utility-vm \
--zone=us-central1-f \
--machine-type=f1-micro \
--network-interface=network=my-internal-app,subnet=subnet-a,private-network-ip=10.10.20.50,no-address
# SSH
$ gcloud compute ssh utility-vm --zone=us-central1-f
# instance-group-1-xxxx のスタートページを確認
$ curl 10.10.20.2
<h1>Internal Load Balancing Lab</h1><h2>Client IP</h2>Your IP address : 10.10.20.50<h2>Hostname</h2>Server Hostname: instance-group-1-zx46<h2>Server Location</h2>Region and Zone: us-central1-a
# instance-group-2-xxxx のスタートページを確認
$ curl 10.10.30.2
<h1>Internal Load Balancing Lab</h1><h2>Client IP</h2>Your IP address : 10.10.20.50<h2>Hostname</h2>Server Hostname: instance-group-2-095r<h2>Server Location</h2>Region and Zone: us-central1-b
$ exit
疎通する。
リージョン バックエンド サービスを構成する。
# ヘルスチェックを作成
$ gcloud compute health-checks create http my-ilb-health-check \
--region=us-central1 \
--port 80
# ヘルスチェックを構成したバックエンドサービスを作成
$ gcloud compute backend-services create http-backend \
--load-balancing-scheme=internal \
--protocol=tcp \
--region=us-central1 \
--health-checks=my-ilb-health-check \
--health-checks-region=us-central1
# MIG をバックエンドに追加
$ gcloud compute backend-services add-backend http-backend \
--region=us-central1 \
--instance-group=instance-group-1 \
--instance-group-zone=us-central1-a
$ gcloud compute backend-services add-backend http-backend \
--region=us-central1 \
--instance-group=instance-group-2 \
--instance-group-zone=us-central1-b
# フロントエンドを構成(内部 LB の場合、 URL マップ・プロキシは不要で、 IP アドレス・転送ルール のみでよい)
# IP アドレスを作成
$ gcloud compute addresses create my-ilb-ip \
--region=us-central1 \
--subnet=subnet-b \
--addresses=10.10.30.5
# 転送ルール(内部の場合、これが LB 名?)
$ gcloud compute forwarding-rules create my-ilb \
--region=us-central1 \
--load-balancing-scheme=internal \
--network=my-internal-app \
--subnet=subnet-b \
--address=my-ilb-ip \
--ip-protocol=TCP \
--ports=80 \
--backend-service=http-backend \
--backend-service-region=us-central1
# IP アドレスを作成:いらん
$ gcloud compute addresses create http-lb-ipv4 \
--ip-version=IPV4
# URL マップを作成( URL マップが ロードバランサの名前に該当する、ここでは http-lb ):いらん
$ gcloud compute url-maps create http-lb \
--default-service http-backend # バックエンドサービスは http-backend
# URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成:いらん
$ gcloud compute target-http-proxies create http-lb-proxy \
--url-map http-lb
# 受信リクエストをプロキシにルーティングするグローバル転送ルールを作成:内部の場合、これが LB 名?
$ gcloud compute forwarding-rules create http-ipv4-rule \
--address=http-lb-ipv4 \
--global \
--target-http-proxy=http-lb-proxy \
--ports=80
疎通用 VM インスタンスに SSH して何回か curl を叩いて、 instance-group-1も2も反応するかテストする。
# SSH
$ gcloud compute ssh utility-vm --zone=us-central1-f
# テスト
$ curl 10.10.30.5