テックまとめ

Cloud Load Balancing

Cloud Load Balancing

  1. 種類
  2. 作成
  3. ユースケース

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)

選択方法としては以下のようになる。

choose-lb

ネットワークロードバランサ と 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) ロードバランサ の構成イメージは以下。

https-load-balancer-diagram https-load-balancer-diagram

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-asubnet-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