ゾーン NEG を使用した内部 TCP / UDP 負荷分散の設定

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

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

内部 TCP / UDP 負荷分散は、GCE_VM_IP エンドポイントを含むゾーン NEG のみをサポートします。

権限

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

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

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

設定の概要

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

  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. 次の内部 TCP / UDP ロードバランサ コンポーネント:
    • us-west1 リージョンの内部バックエンド サービス。2 つのゾーン NEG への接続分散を管理します。
    • ロードバランサのフロントエンドの内部転送ルールと内部 IP アドレス

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

ゾーン NEG を使用した内部 TCP / UDP 負荷分散構成
ゾーン NEG を使用した内部 TCP / UDP 負荷分散構成

ネットワーク、リージョン、サブネットの構成

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

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

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

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

Console

  1. Google Cloud Console で [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 を識別させています。

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

Console

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

VM とネットワーク エンドポイント グループの作成

内部 TCP / UDP 負荷分散のリージョン特性を示すために、この例では、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 アドレスにバインドするように構成されます。内部 TCP / UDP ロードバランサは、宛先 IP を保持してパケットを配信します。

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

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

Console

VM を作成する

  1. Google Cloud Console の [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://169.254.169.254/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://169.254.169.254/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 と同じゾーンに作成する必要があります。

Console

Cloud Console を使用して GCE_VM_IP NEG を作成または管理することはできません。gcloud または REST API を使用してください。

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'
    

クライアント VM の作成

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

Console

  1. Google Cloud Console の [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

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

次の手順では、すべての内部 TCP / UDP ロードバランサ コンポーネントを構成します。

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

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

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

Console

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 に分散されます。

  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
    

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

    curl http://10.1.2.99:8008
    

次のステップ