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

このガイドでは、ゾーン ネットワーク エンドポイント グループ(NEG)バックエンドを使用した内部パススルー ネットワーク ロードバランサをデプロイする方法を説明します。ゾーン NEG は、1 つのサブネット内の Google Cloud リソースの IP アドレスまたは IP アドレス / ポートの組み合わせのコレクションに相当するゾーンのリソースです。NEG を使用すると、VM 全体ではなく、ソフトウェア サービスを表す IP アドレスまたは IP アドレス / ポートの組み合わせの論理グループを作成できます。

このガイドに進む前に、次の内容を理解しておいてください。

内部パススルー ネットワーク ロードバランサは、GCE_VM_IP エンドポイントを含むゾーン NEG のみをサポートします。

権限

このガイドを使用する前に、インスタンスを作成し、プロジェクト内のネットワークを変更しておく必要があります。そのためにはプロジェクトのオーナーまたは編集者であるか、次の Compute Engine IAM のロールがすべて必要です。

タスク 必要な役割
ネットワーク、サブネット、ロードバランサ コンポーネントの作成 ネットワーク管理者
ファイアウォール ルールの追加と削除 セキュリティ管理者
インスタンスの作成 Compute インスタンス管理者

詳細については、次のガイドをご覧ください。

設定の概要

このガイドでは、GCE_VM_IP ゾーン NEG バックエンドを使用して内部パススルー ネットワーク ロードバランサを構成してテストする方法について説明します。このセクションでは、以下の構成方法について説明します。

  1. カスタム サブネットを持つ lb-network という名前のサンプル VPC ネットワーク
  2. バックエンド VM への受信接続を許可するファイアウォール ルール
  3. 4 つの VM。
    • ゾーン us-west1-a 内に VM vm-a1vm-a2
    • ゾーン us-west1-c 内に VM vm-c1vm-c2
  4. 2 つのバックエンド ゾーン NEG(ゾーン us-west1-a 内に neg-a、ゾーン us-west1-c 内に neg-c)。各 NEG には次のエンドポイントがあります。
    • neg-a には、次の 2 つのエンドポイントが含まれています。
      • VM vm-a1 の内部 IP アドレス
      • VM vm-a2 の内部 IP アドレス
    • neg-c には、次の 2 つのエンドポイントが含まれています。
      • VM vm-c1 の内部 IP アドレス
      • VM vm-c2 の内部 IP アドレス
  5. us-west1-a 内で接続テストに使用する 1 台のクライアント VM(vm-client
  6. 次の内部パススルー ネットワーク ロードバランサのコンポーネント:
    • us-west1 リージョンの内部バックエンド サービス。2 つのゾーン NEG への接続分散を管理します。
    • ロードバランサのフロントエンドの内部転送ルールと内部 IP アドレス

この例のアーキテクチャは次のようになります。

ゾーン NEG を使用した内部パススルー ネットワーク ロードバランサの構成
ゾーン NEG を使用した内部パススルー ネットワーク ロードバランサの構成

ネットワーク、リージョン、サブネットを構成する

このページで説明されているサンプルの内部パススルー ネットワーク ロードバランサは、lb-network という名前のカスタムモード VPC ネットワークで作成されています。

この例のバックエンド VM とゾーン NEG、ロードバランサのコンポーネントは、次のリージョンとサブネットに存在します。

  • リージョン: us-west1
  • サブネット: lb-subnet(プライマリ IP アドレス範囲は 10.1.2.0/24

サンプルのネットワークとサブネットを作成する手順は次のとおりです。

コンソール

  1. Google Cloud コンソールで [VPC ネットワーク] ページに移動します。
    [VPC ネットワーク] ページに移動
  2. [VPC ネットワークを作成] をクリックします。
  3. [名前] に「lb-network」を入力します。
  4. [サブネット] セクションで次の設定を行います。
    • [サブネット作成モード] を [カスタム] に設定します。
    • [新しいサブネット] セクションに、次の情報を入力します。
      • 名前: lb-subnet
      • リージョン: us-west1
      • IP アドレス範囲: 10.1.2.0/24
      • [完了] をクリックします。
  5. [作成] をクリックします。

gcloud

  1. カスタム VPC ネットワークを作成します。

    gcloud compute networks create lb-network --subnet-mode=custom
    
    1. lb-network ネットワーク内に、us-west1 リージョンのバックエンド VM のサブネットを作成します。
    gcloud compute networks subnets create lb-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

ファイアウォール ルールを構成する

この例では、次のファイアウォール ルールを使用します。

  • fw-allow-lb-access: VPC ネットワーク内のすべてのターゲットに適用される上り(内向き)ルールで、10.1.2.0/24 の範囲の送信元からのトラフィックを許可します。このルールは、lb-subnet にあるクライアントからの受信トラフィックを許可します。

  • fw-allow-ssh: 負荷分散されたインスタンスに適用される上り(内向き)ルール。任意のアドレスから TCP ポート 22 への SSH 接続が許可されます。このルールには、送信元 IP 範囲をより限定的に指定できます。たとえば、SSH セッションを開始するシステムの IP 範囲のみを許可するように指定できます。この例では、ターゲットタグ allow-ssh を使用して、適用する VM を識別させています。

これらのファイアウォール ルールがない場合は、デフォルトの上り(内向き)拒否ルールによってバックエンド インスタンスへの受信トラフィックがブロックされます。

コンソール

  1. Google Cloud コンソールで [ファイアウォール ポリシー] ページに移動します。
    [ファイアウォール ポリシー] に移動
  2. [ファイアウォール ルールを作成] をクリックして次の情報を入力し、サブネット トラフィックを許可するルールを作成します。
    • 名前: fw-allow-lb-access
    • ネットワーク: lb-network
    • 優先度: 1000
    • トラフィックの方向: 上り(内向き)
    • 一致したときのアクション: 許可
    • ターゲット: ネットワーク内のすべてのインスタンス
    • ソースフィルタ: IPv4 の範囲
    • 送信元 IPv4 範囲: 10.1.2.0/24
    • プロトコルとポート: すべて許可
  3. [作成] をクリックします。
  4. [ファイアウォール ルールを作成] を再度クリックして、SSH 接続の受信を許可するルールを作成します。
    • 名前: fw-allow-ssh
    • ネットワーク: lb-network
    • 優先度: 1000
    • トラフィックの方向: 上り(内向き)
    • 一致したときのアクション: 許可
    • ターゲット: 指定されたターゲットタグ
    • ターゲットタグ: allow-ssh
    • ソースフィルタ: IPv4 の範囲
    • 送信元 IPv4 範囲: 0.0.0.0/0
    • プロトコルとポート: 指定されたプロトコルとポートを選択してから、tcp:22 のように入力します。
  5. [作成] をクリックします。
  6. [ファイアウォール ルールを作成] をもう一度クリックして、Google Cloud ヘルスチェックを許可するルールを作成します。
    • 名前: fw-allow-health-check
    • ネットワーク: lb-network
    • 優先度: 1000
    • トラフィックの方向: 上り(内向き)
    • 一致したときのアクション: 許可
    • ターゲット: 指定されたターゲットタグ
    • ターゲットタグ: allow-health-check
    • ソースフィルタ: IPv4 の範囲
    • 送信元 IPv4 範囲: 130.211.0.0/2235.191.0.0/16
    • プロトコルとポート: すべて許可
  7. [作成] をクリックします。

gcloud

  1. fw-allow-lb-access ファイアウォール ルールを作成して、サブネットとの通信を許可します。

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24 \
        --rules=tcp,udp,icmp
    
  2. ネットワーク タグ allow-ssh を使用して、VM との SSH 接続を許可する fw-allow-ssh ファイアウォール ルールを作成します。source-ranges を省略すると、Google Cloud は任意の送信元を対象とするものとしてルールを解釈します。

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. Google Cloud ヘルスチェックを許可する fw-allow-health-check ルールを作成します。

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp,udp,icmp
    

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

内部パススルー ネットワーク ロードバランサのリージョン特性を示すために、この例では、2 つのゾーン NEG バックエンド(neg-aneg-c)をゾーン us-west1-aus- west1-c で使用します。トラフィックは、両方の NEG 間および各 NEG 内のエンドポイント間でロードバランスされます。

VM を作成する

この例をサポートするために、4 つの VM はそれぞれ、TCP ポート 80、8008、8080、8088、443、8443 をリッスンする Apache ウェブサーバーを実行します。

lb-subnet の内部 IP アドレスと外部(公開)エフェメラル IP アドレスがそれぞれの VM に割り当てられます。外部 IP アドレスは後で削除できます。

バックエンド VM には外部 IP アドレスは必要ありません。ただし、外部 IP アドレスにより VM がインターネットから Apache をダウンロードでき、SSH 経由の接続が可能なため、この例では外部 IP アドレスがあると便利です。デフォルトでは、Apache は任意の IP アドレスにバインドされます。内部パススルー ネットワーク ロードバランサは、宛先 IP を保持してパケットを配信します。

バックエンド VM で動作中のサーバー ソフトウェアが、ロードバランサの内部転送ルールの IP アドレスをリッスンしていることを確認してください。

説明を簡単にするため、これらのバックエンド VM では Debian GNU Linux 10 を実行します。

コンソール

VM を作成する

  1. Google Cloud コンソールの [VM インスタンス] ページに移動します。
    [VM インスタンス] ページに移動
  2. 次の手順を繰り返し、4 つの VM を作成します。次の名前とゾーンの組み合わせを使用します。
    • 名前: vm-a1、ゾーン: us-west1-a
    • 名前: vm-a2、ゾーン: us-west1-a
    • 名前: vm-c1、ゾーン: us-west1-c
    • 名前: vm-c2、ゾーン: us-west1-c
  3. [インスタンスを作成] をクリックします。
  4. ステップ 2 に示したように [名前] を設定します。
  5. [リージョン] には、us-west1 を選択し、手順 2 に示したゾーンを選択します。
  6. [ブートディスク] セクションで、ブートディスク オプションに Debian オペレーティング システムと 10 (buster) バージョンが選択されていることを確認します。必要に応じてイメージを変更するには、[選択] をクリックします。
  7. [詳細オプション] をクリックして、次の変更を行います。

    • [ネットワーク] をクリックして、ネットワーク タグ allow-sshallow-health-check を追加します。
    • [ネットワーク インターフェース] にある編集ボタン をクリックして、次の変更を行い、[完了] をクリックします。
      • ネットワーク: lb-network
      • サブネット: lb-subnet
      • プライマリ内部 IP: エフェメラル(自動)
      • 外部 IP: エフェメラル
    • [管理] をクリックします。[起動スクリプト] フィールドに、次のスクリプトの内容をコピーして貼り付けます。スクリプトの内容は 4 つの VM ですべて同じです。

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      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
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  8. [作成] をクリックします。

gcloud

次の [VM-NAME][ZONE] の 4 つの組み合わせを使用して、下のコマンドを 4 回実行して 4 つの VM を作成します。スクリプトの内容は 4 つの VM ですべて同じです。

  • vm-a1[VM-NAME]us-west1-a[ZONE]
  • vm-a2[VM-NAME]us-west1-a[ZONE]
  • vm-c1[VM-NAME]us-west1-c[ZONE]
  • vm-c2[VM-NAME]us-west1-c[ZONE]

    gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

GCE_VM_IP ゾーン NEG を作成する

NEG(neg-aneg-c)は、前の手順で作成した VM と同じゾーンに作成する必要があります。

コンソール

ゾーン ネットワーク エンドポイント グループを作成するには:

  1. Google Cloud コンソールの [ネットワーク エンドポイント グループ] ページに移動します。
    [ネットワーク エンドポイント グループ] ページに移動
  2. [ネットワーク エンドポイント グループを作成] をクリックします。
  3. ゾーン NEG の名前を入力します(例: neg-a)。
  4. [ネットワーク エンドポイント グループの種類] で [ネットワーク エンドポイント グループ(ゾーン)] を選択します。
  5. [ネットワーク] で lb-network を選択します。
  6. [サブネット] で lb-subnet を選択します。
  7. [ゾーン] で us-west1-a を選択します。
  8. [作成] をクリックします。
  9. この手順を繰り返して、neg-c という 2 番目のゾーン NEG を us-west1-c ゾーンに作成します。

エンドポイントをゾーン NEG に追加します。

  1. Google Cloud コンソールの [ネットワーク エンドポイント グループ] ページに移動します。
    [ネットワーク エンドポイント グループ] に移動
  2. 前の手順で作成した最初のネットワーク エンドポイント グループの名前neg-a)をクリックします。[ネットワーク エンドポイント グループの詳細] ページが表示されます。
  3. [このグループのネットワーク エンドポイント] セクションで [ネットワーク エンドポイントを追加] をクリックします。[ネットワーク エンドポイントの追加] ページが表示されます。

    1. [VM インスタンス] をクリックして [vm-a1] を選択し、その内部 IP アドレスをネットワーク エンドポイントとして追加します。
    2. [作成] をクリックします。
    3. もう一度 [ネットワーク エンドポイントを追加] をクリックし、[VM インスタンス] で [vm-a2] を選択します。
    4. [作成] をクリックします。
  4. 前の手順で作成した 2 番目のネットワーク エンドポイント グループの名前neg-c)をクリックします。[ネットワーク エンドポイント グループの詳細] ページが表示されます。

  5. [このグループのネットワーク エンドポイント] セクションで [ネットワーク エンドポイントを追加] をクリックします。[ネットワーク エンドポイントの追加] ページが表示されます。

    1. [VM インスタンス] をクリックして [vm-c1] を選択し、その内部 IP アドレスをネットワーク エンドポイントとして追加します。
    2. [作成] をクリックします。
    3. もう一度 [ネットワーク エンドポイントを追加] をクリックし、[VM インスタンス] で [vm-c2] を選択します。
    4. [作成] をクリックします。

gcloud

  1. gcloud compute network-endpoint-groups create コマンドを使用して、us-west1-aneg-a という GCE_VM_IP ゾーン NEG を作成します。

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

    gcloud compute network-endpoint-groups update neg-a \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-a1' \
        --add-endpoint='instance=vm-a2'
    
  3. gcloud compute network-endpoint-groups create コマンドを使用して、us-west1-cneg-c という GCE_VM_IP ゾーン NEG を作成します。

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

    gcloud compute network-endpoint-groups update neg-c \
        --zone=us-west1-c \
        --add-endpoint='instance=vm-c1' \
        --add-endpoint='instance=vm-c2'
    

ロードバランサ コンポーネントを構成する

次の手順では、すべての内部パススルー ネットワーク ロードバランサのコンポーネントを構成します。

  • バックエンド サービス: この例では、ロードバランサを HTTP トラフィックに渡す必要があります。したがって、UDP ではなく TCP を使用する必要があります。

  • 転送ルール: この例では、内部転送ルールを 1 つ作成します。

  • 内部 IP アドレス: この例では、転送ルールを作成する際に、内部 IP アドレス 10.1.2.99 を指定しています。

コンソール

gcloud

  1. 新しいリージョン HTTP ヘルスチェックを作成します。

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. バックエンド サービスを作成します。

    gcloud compute backend-services create bs-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. 2 つのゾーン NEG(neg-aneg-c)をバックエンド サービスに追加します。

    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-a \
        --network-endpoint-group-zone=us-west1-a
    
    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-c \
        --network-endpoint-group-zone=us-west1-c
    
  4. バックエンド サービスの転送ルールを作成します。転送ルールを作成するときは、サブネット内の内部 IP アドレスに 10.1.2.99 を指定します。

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=bs-ilb \
        --backend-service-region=us-west1
    

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

このテストでは、ロードバランサのバックエンド VM からではなく、個別のクライアント VM からロードバランサに接続します。セッション アフィニティが構成されていないため、トラフィックは 4 つのバックエンド VM に分散されます。

テスト クライアント VM を作成する

この例では、クライアント VM(vm-client)を、バックエンド(サーバー)VM と同じリージョンに作成します。クライアントを使用するのは、ロードバランサの構成を検証し、テストセクションで説明されている想定される動作を示すためです。

コンソール

  1. Google Cloud コンソールの [VM インスタンス] ページに移動します。
    [VM インスタンス] ページに移動
  2. [インスタンスを作成] をクリックします。
  3. [名前] を vm-client に設定します。
  4. [ゾーン] を us-west1-a に設定します。
  5. [詳細オプション] をクリックして、次の変更を行います。
    • [ネットワーキング] をクリックして allow-sshネットワーク タグに追加します。
    • [ネットワーク インターフェース] にある編集ボタンをクリックして、次の変更を行い、[完了] をクリックします。
      • ネットワーク: lb-network
      • サブネット: lb-subnet
      • プライマリ内部 IP: エフェメラル(自動)
      • 外部 IP: エフェメラル
  6. [作成] をクリックします。

gcloud

クライアント VM はロードバランサと同じリージョン内の任意のゾーンにあり、そのリージョン内の任意のサブネットを使用できます。この例では、クライアントは us-west1-a ゾーンにあり、バックエンド VM と同じサブネットを使用しています。

gcloud compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=lb-subnet

ロードバランサにトラフィックを送信する

次の手順でロードバランサに接続します。

  1. クライアント VM インスタンスに接続します。

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. curl を使用して IP アドレスに接続するロードバランサへのウェブ リクエストを作成します。レスポンスが異なるバックエンド VM から返ってくることを確認するために、このリクエストを繰り返します。レスポンスを生成する VM の名前が、各バックエンド VM 上で、/var/www/html/index.html のコンテンツによる HTML レスポンスのテキストとして表示されます。Page served from: vm-a1Page served from: vm-a2 のようなレスポンスが返されます。

    curl http://10.1.2.99
    

    転送ルールは、ポート 80800880808088 を処理するように構成されています。その他のポートにトラフィックを送信するには、次のように、IP アドレスの後にコロン(:)とポート番号を追加します。

    curl http://10.1.2.99:8008
    

次のステップ