ゾーン NEG バックエンドを使用してグローバル外部パススルー ネットワーク ロードバランサを設定する

このドキュメントでは、複数のリージョンにデプロイされたゾーン NEG バックエンド間でトラフィックのバランスを取るグローバル外部パススルー ネットワーク ロードバランサを作成する方法について説明します。

始める前に

設定が次の前提条件を満たしていることを確認します。

Google Cloud CLI をインストールする

このガイドの手順では、Google Cloud CLI を使用してグローバル外部パススルー ネットワーク ロードバランサを構成します。インストールするには、gcloud CLI をインストールするをご覧ください。

必要なロール

プロジェクト作成者にはオーナーロールroles/owner)が付与されます。デフォルトでは、オーナーロール(roles/owner)または編集者ロール(roles/editor)には、このドキュメントの手順に沿って操作するために必要な権限が含まれています。

プロジェクト作成者でない場合は、プロジェクトで必要な権限を適切なプリンシパルに付与する必要があります。プリンシパルは、Google アカウント(エンドユーザーの場合)やサービス アカウントになることもあります。

VM インスタンス グループ バックエンドを使用してグローバル外部パススルー ネットワーク ロードバランサを構成するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

Cloud Load Balancing のロールと権限の詳細については、ロールと権限をご覧ください。転送ルールの条件付き付与で IAM ポリシーを定義する方法については、転送ルールの IAM 条件をご覧ください。

設定の概要

次の図は、us-west1 リージョンと europe-west2 リージョンにデプロイされたゾーン NEG バックエンドを使用するグローバル外部パススルー ネットワーク ロードバランサを示しています。グローバル外部パススルー ネットワーク ロードバランサの仕組みについては、概要ガイドのアーキテクチャ セクションをご覧ください。

この例では、次のコンポーネントが構成されています。

  • 4 つのバックエンド VM:

    • us-west1-a ゾーンの vm-us-1vm-us-2
    • europe-west2-a ゾーンの vm-eu-1vm-eu-2
  • GCE_VM_IP エンドポイントを使用する 2 つのゾーン NEG:

    • vm-us-1vm-us-2nic0us-west1-a ゾーンの NEG に接続する
    • vm-eu-1vm-eu-2nic0europe-west2-a ゾーンの NEG に接続する
  • 4 つのネットワーク エンドポイント間で TCP:80 トラフィックを分散する単一のグローバル外部パススルー ネットワーク ロードバランサ。

グローバル外部パススルー ネットワーク ロードバランサは、`us-west1` リージョンと `europe-west2` リージョンにデプロイされたゾーン NEG バックエンドにトラフィックを送信します。
グローバル外部パススルー ネットワーク ロードバランサを使用してゾーン NEG バックエンドにトラフィックを分散する(クリックして拡大)

ネットワークとサブネットを設定する

この例では、2 つの異なるリージョンにサブネットを持つ lb-network という名前のカスタムモード VPC ネットワークを使用します。

グローバル外部パススルー ネットワーク ロードバランサを構成して、スタックタイプが IPv4 のみまたはデュアルスタックのいずれかである VM のネットワーク インターフェースを参照できる GCE_VM_IP ネットワーク エンドポイントを設定できます。

次の表に、ロードバランサのトラフィック タイプ、バックエンド VM ネットワーク インターフェース、VPC サブネット スタック タイプの互換性を示します。グローバル外部パススルー ネットワーク ロードバランサのアーキテクチャ ガイドに記載されている、バックエンド VM のネットワーク インターフェースと VPC サブネットの互換性要件を理解しておきます。

ロードバランサのトラフィック タイプ バックエンド VM ネットワーク インターフェースのスタックタイプ VPC サブネットのスタックタイプ
IPv4 トラフィックのみ IPV4_ONLY IPV4_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv6 トラフィックのみ IPV6_ONLY IPV6_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 トラフィックと IPv6 トラフィック IPV4_IPV6 IPV4_IPV6

gcloud

  1. VPC ネットワークを作成します。この例では、VPC ネットワークの名前は lb-network です。

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. VPC ネットワーク(lb-network)内に、2 つのリージョンにサブネットを作成します。

    us-west1 リージョンのネットワーク エンドポイント用に lb-subnet-us という名前のサブネットを作成します

    IPv4 専用のサブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    デュアル スタック サブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    europe-west2 リージョンのネットワーク エンドポイント用に lb-subnet-eu という名前のサブネットを作成します

    IPv4 トラフィックのみの場合は、次のコマンドを使用して IPv4 専用サブネットを作成します。

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

    IPv4 トラフィックと IPv6 トラフィックの場合は、次のコマンドを使用してデュアルスタック サブネットを作成します。

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

ファイアウォール ルールの作成

本番環境を安全に構成するには、次の 2 つのファイアウォール ルールを個別に作成する必要があります。

  • ヘルスチェック ファイアウォール ルール。次の範囲からの上り(内向き)トラフィックを許可するように構成されています。

  • ユーザー トラフィック ファイアウォール ルール。上り(内向き)トラフィックを許可するように構成されています。

    • ロードバランサにアクセスする必要がある特定のクライアント ソース IP 範囲。
    • 転送ルールで構成されている IP プロトコルとポート

次の点にご注意ください。

  • アプリケーションが制限なしですべてのインターネット ユーザーにサービスを提供している場合は、IPv4 トラフィックに 0.0.0.0/0、IPv6 トラフィックに ::/0 のソース IP 範囲を構成します。

  • ロード バランシングの IP プロトコルとポートをプローブするようにヘルスチェックを構成した場合は、ヘルスチェックとユーザー トラフィックのファイアウォール ルールを統合して、単一のファイアウォール ルールを構成できます。

gcloud

  • すべての送信元範囲からの TCP トラフィックがポート 80 でバックエンド VM インスタンスに到達することを許可するファイアウォール ルールを作成します。このポートとプロトコルは、ロード バランシングとヘルスチェックの両方に使用されます。

    • すべての IPv4 トラフィックを許可するには、次のコマンドを実行します。

      gcloud compute firewall-rules create firewall-allow-traffic-ipv4 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=0.0.0.0/0
      
    • すべての IPv6 トラフィックを許可するには、次のコマンドを実行します。

      gcloud compute firewall-rules create firewall-allow-traffic-ipv6 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=::/0
      

バックエンド VM を作成する

このロード バランシングの例では、設定の概要セクションで説明したように、4 つの VM を作成します。

この例では、VM の nic0 インターフェースは lb-network VPC ネットワークとサブネット(lb-subnet-us または lb-subnet-eu)のいずれかに関連付けられています。GCE_VM_IP エンドポイントで参照されるネットワーク インターフェースは、ゾーン NEG に関連付けられた同じ VPC サブネットに存在する必要があります。

次の表に、ロードバランサのトラフィック タイプ、バックエンド VM ネットワーク インターフェース、VPC サブネット スタック タイプの互換性を示します。グローバル外部パススルー ネットワーク ロードバランサのアーキテクチャ ガイドに記載されている、バックエンド VM のネットワーク インターフェースと VPC サブネットの互換性要件を理解しておきます。

ロードバランサのトラフィック タイプ バックエンド VM ネットワーク インターフェースのスタックタイプ VPC サブネットのスタックタイプ
IPv4 トラフィックのみ IPV4_ONLY IPV4_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv6 トラフィックのみ IPV6_ONLY IPV6_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 トラフィックと IPv6 トラフィック IPV4_IPV6 IPV4_IPV6

gcloud

VM_NAMEREGIONZONESUBNET に次の 4 つの組み合わせを使用して、gcloud compute instances create コマンドを 4 回実行して 4 つの VM を作成します。Bash スクリプトは 4 つの VM ですべて同じです。

VM_NAME REGION ZONE SUBNET
vm-us-1 us-west1 us-west1-a lb-subnet-us
vm-us-2 us-west1 us-west1-a lb-subnet-us
vm-eu-1 europe-west2 europe-west2-a lb-subnet-eu
vm-eu-2 europe-west2 europe-west2-a lb-subnet-eu

IPv4 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_ONLY \
    --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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

デュアルスタック ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_IPV6,ipv6-network-tier=PREMIUM \
    --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://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

GCE_VM_IP エンドポイントを使用してゾーン NEG を作成する

このロード バランシングの例では、GCE_VM_IP エンドポイントを使用して 2 つのゾーン NEG を作成します。

  • us-west1-a ゾーンのゾーン NEG neg-us。ゾーン NEG は、次の 2 つのネットワーク エンドポイントで構成されています。
    • vm-us-1vm-us-2nic0 をゾーン NEG neg-us に接続する
  • europe-west2-a のゾーン NEG neg-eu。ゾーン NEG は、次の 2 つのネットワーク エンドポイントで構成されています。
    • vm-eu-1vm-eu-2nic0 をゾーン NEG neg-eu に接続する

GCE_VM_IP エンドポイントを含む新しいゾーン NEG を作成する場合は、NEG にエンドポイントを追加する前に、NEG を VPC サブネットに明示的に関連付ける必要があります。ロードバランサは、NEG に関連付けられた VPC サブネット内のネットワーク インターフェースにパケットを配信します。この例では、ゾーン NEG のエンドポイントは VM の nic0 を指します。

gcloud

  1. us-west1-a ゾーンに neg-us という名前の GCE_VM_IP ゾーン NEG を作成します。

    gcloud compute network-endpoint-groups create neg-us \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet-us
    
  2. エンドポイントをゾーン NEG neg-us に追加します。

    gcloud compute network-endpoint-groups update neg-us \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-us-1' \
        --add-endpoint='instance=vm-us-2'
    
  3. europe-west2-a ゾーンに neg-eu という GCE_VM_IP ゾーン NEG を作成します。

    gcloud compute network-endpoint-groups create neg-eu \
        --network-endpoint-type=gce-vm-ip \
        --zone=europe-west2-a \
        --network=lb-network \
        --subnet=lb-subnet-eu
    
  4. エンドポイントをゾーン NEG neg-eu に追加します。

    gcloud compute network-endpoint-groups update neg-eu \
        --zone=europe-west2-a \
        --add-endpoint='instance=vm-eu-1' \
        --add-endpoint='instance=vm-eu-2'
    

グローバル外部 IP アドレスを予約する

グローバル外部パススルー ネットワーク ロードバランサには、2 つのグローバル外部 IP アドレス(各アベイラビリティ グループから 1 つずつ)が必要です。これらの 2 つの IP アドレスは、ロードバランサの転送ルールに関連付けられます。

グローバル外部パススルー ネットワーク ロードバランサの場合、転送ルールの IP アドレスは VPC サブネットから完全に切り離されます。IP アドレスは、Google 所有のグローバル外部 IP アドレス プールまたは BYOIP グローバル外部 IPv4 パブリック委任プレフィックスに属し、VPC サブネットに関連付けられていません。

IPv6 転送ルールを構成すると、転送ルール IP アドレスは /96 プレフィックスとして割り当てられます。

gcloud

IPv4 トラフィックの場合:

  1. 可用性グループ 0 で lb-ipv4-ag0 という最初のグローバル外部 IP アドレスを予約します。

    gcloud beta compute addresses create lb-ipv4-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV4
    
  2. 可用性グループ 1 で 2 番目のグローバル外部 IP アドレス lb-ipv4-ag1 を予約します。

    gcloud beta compute addresses create lb-ipv4-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV4
    

IPv6 トラフィックの場合:

  1. 可用性グループ 0 で lb-ipv6-ag0 という最初のグローバル外部 IP アドレスを予約します。

    gcloud beta compute addresses create lb-ipv6-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV6
    
  2. 可用性グループ 1 で 2 番目のグローバル外部 IP アドレス lb-ipv6-ag1 を予約します。

    gcloud beta compute addresses create lb-ipv6-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV6
    

ロードバランサを構成する

グローバル外部パススルー ネットワーク ロードバランサを設定するには、ヘルスチェック、バックエンド サービス、転送ルールを作成します。

gcloud

  1. TCP:80 プローブを生成するように構成された TCP ヘルスチェックを作成する

    gcloud compute health-checks create tcp hc-tcp-80 \
      --global \
      --port=80
    
  2. EXTERNAL_PASSTHROUGH ロード バランシング方式でグローバル バックエンド サービスを作成します。

    gcloud beta compute backend-services create lb-backend-service \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --health-checks=hc-tcp-80 \
      --global
    
  3. バックエンドとしてゾーン NEG をバックエンド サービスに追加します。

    us-west1-a ゾーンのゾーン NEG をバックエンド サービスに追加します。

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-us \
        --network-endpoint-group-zone=us-west1-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    

    europe-west2-a ゾーンのゾーン NEG をバックエンド サービスに追加します。

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-eu \
        --network-endpoint-group-zone=europe-west2-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    
  4. TCP:80 トラフィックを処理するグローバル転送ルールを作成します。IPv4 トラフィックと IPv6 トラフィックの両方を処理するには、2 つの転送ルールを作成する必要があります。

    転送ルールの IP バージョンがバックエンド VM ネットワーク インターフェースのスタックタイプと一致していることを確認します。

    転送ルールは、各可用性グループの IP アドレスを参照します。

    IPv4 トラフィックの場合:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv4 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
    

    IPv6 トラフィックの場合:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv6 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
    

ロードバランサをテストする

  1. 転送ルールにアタッチされている予約済み IP アドレスを取得します。

      gcloud beta compute forwarding-rules describe lb-forwarding-rule-ipv4 \
          --global
    

    これにより、可用性グループごとに 1 つずつ、2 つの IP アドレスが返されます。これらの IP アドレスは IP_ADDRESS_AVAILABILITY_GROUP_0IP_ADDRESS_AVAILABILITY_GROUP_1 と呼ばれます。

  2. いずれかの IP アドレスにトラフィックを送信します。

      curl http://IP_ADDRESS_AVAILABILITY_GROUP_0
    
      curl http://IP_ADDRESS_AVAILABILITY_GROUP_1
    

ロケーションとバックエンドの健全性に応じて、異なるリージョンのバックエンド VM からのレスポンスが表示されます。

ロードバランサの IP アドレスについてローカル ルーティング テーブルを確認する

バックエンド VM のローカル ルーティング テーブルには、グローバル外部パススルー ネットワーク ロードバランサの IP アドレスが含まれています。

バックエンド VM のローカルルートを確認するには、SSH を使用してバックエンド VM に接続し、次のコマンドを実行します。

  ip route list table local

出力は次のとおりです。

local 10.1.2.5 dev ens4 proto kernel scope host src 10.1.2.5
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 136.124.69.214 dev ens4 proto 66 scope host
local 136.124.83.205 dev ens4 proto 66 scope host

上記の例では、136.124.69.214136.124.83.205 はロードバランサの転送ルールに割り当てられた IP アドレスです。VM のローカル ルーティング テーブルの local 136.124.69.214 dev ens4 proto 66 scope hostlocal 136.124.83.205 dev ens4 proto 66 scope host の行エントリにより、ロードバランサの IP アドレス宛てのパケットがバックエンドで受け入れられます。このエントリの追加は、 Cloud de Confiance ゲスト環境が行います。

バックエンド VM のローカル ルーティング テーブル エントリは、ローカルホスト配信用のパケットを受け入れます。ネットワーク スタックは、このパケットをリッスン アプリケーションに配信します。その後、アプリケーションからのレスポンス パケットがクライアントに直接送信されます。

ロードバランサの IP アドレスは、実際には VM のネットワーク インターフェースで構成されていません。これを確認するには、次のコマンドを実行します。

  ip addr list

出力は次のとおりです。IP アドレス(136.124.69.214136.124.83.205)はローカル ルーティング テーブルに表示されますが、ネットワーク インターフェースには構成されていません。

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens4:  mtu 1460 qdisc fq_codel state UP group default qlen 1000
    link/ether 42:01:0a:01:02:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.1.2.13/32 metric 100 scope global dynamic ens4
       valid_lft 84283sec preferred_lft 84283sec
    inet6 fe80::4001:aff:fe01:20d/64 scope link
       valid_lft forever preferred_lft forever

次のステップ