複数の IP プロトコルに対するネットワーク負荷分散の設定

このガイドでは、TCP、UDP、ESP、ICMP トラフィックを負荷分散するバックエンド サービス ベースのネットワーク ロードバランサを作成する手順について説明します。このような構成は、TCP または UDP 以外の IP プロトコルを使用するトラフィックの負荷分散を行う場合に使用できます。ターゲット プール ベースのネットワーク ロードバランサは、この機能をサポートしていません。

TCP または UDP 以外の IP プロトコルのネットワーク ロードバランサを構成するには、プロトコルを L3_DEFAULT に設定した転送ルールを作成します。この転送ルールは、プロトコルが UNSPECIFIED に設定されたバックエンド サービスを参照します。

次の例では、2 つのネットワーク ロードバランサを使用して、us-central1 リージョンの 2 つのゾーン マネージド インスタンス グループ内のバックエンド VM にトラフィックを分散します。両方のロードバランサが同じ外部 IP アドレスでトラフィックを受信します。

1 つのロードバランサには、プロトコル TCP とポート 80 を設定した転送ルールを作成し、もう 1 つのロードバランサにはプロトコル L3_DEFAULT を設定した転送ルールを作成しています。ポート 80 の IP アドレスに到達する TCP トラフィックは、TCP 転送ルールによって処理されます。TCP 固有の転送ルールと一致しない TCP、UDP、ESP、ICMP トラフィックは、すべて L3_DEFAULT 転送ルールによって処理されます。

ゾーン マネージド インスタンス グループを使用したネットワーク ロードバランサ
ゾーン マネージド インスタンス グループを使用したネットワーク負荷分散

このシナリオでは、正常に動作しているインスタンスにトラフィックを分散します。この構成をサポートするため、TCP ヘルスチェックを作成し、正常なインスタンスにのみトラフィックが送信されるようにします。

ネットワーク ロードバランサはリージョン ロードバランサです。ロードバランサのすべてのコンポーネントは同じリージョンに配置する必要があります。

始める前に

gcloud コマンドライン ツールをインストールします。ツールの完全な概要については、gcloud ツールガイドをご覧ください。負荷分散に関連するコマンドについては、API と gcloud のリファレンス ガイドをご覧ください。

gcloud コマンドライン ツールをまだ実行していない場合は、最初に gcloud init を実行して認証します。

このガイドは、bash の知識があることを前提としています。

ゾーン マネージド インスタンス グループの作成

この負荷分散のシナリオでは、2 つの Compute Engine ゾーン マネージド インスタンス グループを作成し、各インスタンスに echo サーバーをインストールします。

ネットワーク ロードバランサのバックエンド VM として参加するインスタンスでは、適切な Linux ゲスト環境Windows ゲスト環境、または同等の機能を提供する他のプロセスが実行されている必要があります。

ポート 80 の TCP トラフィックにインスタンス グループを設定する

Cloud Console

  1. Cloud Console の [インスタンス グループ] ページに移動します。

    [インスタンス グループ] ページに移動

  2. [インスタンス グループを作成] をクリックします。
  3. 左側の [新しいマネージド インスタンス グループ] を選択します。
  4. [名前] に「ig-us-tcp-80」と入力します。
  5. [ロケーション] で、[シングルゾーン] を選択します。
  6. [リージョン] で、[us-central1] を選択します。
  7. [ゾーン] で、[us-central1-b] を選択します。
  8. [インスタンス テンプレート] で、[新しいインスタンス テンプレートを作成] を選択します。

    1. [名前] に「ig-us-template-tcp-80」と入力します。
    2. [ブートディスク] が Debian GNU/Linux 9 (stretch) などの Debian イメージに設定されていることを確認します。以降の手順では、apt-get などの Debian でのみ使用できるコマンドを使用します。
    3. [管理、セキュリティ、ディスク、ネットワーキング、単一テナンシー] で、[管理] タブの [起動スクリプト] フィールドに次のスクリプトを挿入します。

      #! /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
      
    4. [ネットワーク] の [タグ] フィールドに「network-lb-tcp-80」タグを入力します。

    5. [保存して次へ] をクリックします。

  9. グループ内に作成するインスタンスの数を指定します。

    この例では、[自動スケーリング モード] で次の項目を選択します。

    • 自動スケーリングしない
    • [インスタンス数] に 2 を入力します。
  10. [作成] をクリックして、新しいインスタンス グループを作成します。

gcloud

このガイドの gcloud の手順は、Cloud Shell または bash がインストールされた別の環境を使用していることを前提としています。

  1. gcloud compute instance-templates create コマンドを使用して、HTTP サーバーで VM インスタンス テンプレートを作成します。

    gcloud compute instance-templates create ig-us-template-tcp-80 \
    --region=us-central1 \
    --tags=network-lb-tcp-80 \
    --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'
    
  2. gcloud compute instance-groups managed create コマンドを使用して、ゾーンにマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create ig-us-tcp-80 \
        --zone us-central1-a \
        --size 2 \
        --template ig-us-template-tcp-80
    

TCP(ポート 8080)、UDP、ESP、ICMP トラフィックにインスタンス グループを設定する

Cloud Console

  1. Cloud Console の [インスタンス グループ] ページに移動します。

    [インスタンス グループ] ページに移動

  2. [インスタンス グループを作成] をクリックします。
  3. 左側の [新しいマネージド インスタンス グループ] を選択します。
  4. [名前] に「ig-us-l3-default」と入力します。
  5. [ロケーション] で、[シングルゾーン] を選択します。
  6. [リージョン] で、[us-central1] を選択します。
  7. [ゾーン] で、[us-central1-c] を選択します。
  8. [インスタンス テンプレート] で、[新しいインスタンス テンプレートを作成] を選択します。

    1. [名前] に「ig-us-template-l3-default」と入力します。
    2. [ブートディスク] が Debian GNU/Linux 9 (stretch) などの Debian イメージに設定されていることを確認します。これらの手順では、apt-get などの Debian でのみ使用できるコマンドを使用します。
    3. [管理、セキュリティ、ディスク、ネットワーキング、単一テナンシー] で、[管理] タブの [起動スクリプト] フィールドに次のスクリプトを挿入します。 起動スクリプトを修正し、Apache サーバーがポート 80 ではなく、ポート 8080 をリッスンするように構成します。

      #! /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
      sed -ire 's/^Listen 80$/Listen 8080/g' /etc/apache2/ports.conf
      systemctl restart apache2
      
    4. [ネットワーク] の [タグ] フィールドに「network-lb-l3-default」タグを入力します。

    5. [保存して次へ] をクリックします。

  9. グループ内に作成するインスタンスの数を指定します。

    この例では、[自動スケーリング モード] で次の項目を選択します。

    • 自動スケーリングしない
    • [インスタンス数] に 2 を入力します。
  10. [作成] をクリックして、新しいインスタンス グループを作成します。

gcloud

このガイドの gcloud の手順は、Cloud Shell または bash がインストールされた別の環境を使用していることを前提としています。

  1. gcloud compute instance-templates create コマンドを使用して、HTTP サーバーで VM インスタンス テンプレートを作成します。

    起動スクリプトを修正し、Apache サーバーがポート 80 ではなく、ポート 8080 をリッスンするように構成します。

    gcloud compute instance-templates create ig-us-template-l3-default \
    --region=us-central1 \
    --tags=network-lb-l3-default \
    --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
    sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
    systemctl restart apache2'
    
  2. gcloud compute instance-groups managed create コマンドを使用して、ゾーンにマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create ig-us-l3-default \
        --zone us-central1-c \
        --size 2 \
        --template ig-us-template-l3-default
    

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

次のファイアウォール ルールを作成します。

  • 外部 TCP トラフィックがポート 80 の ig-us-tcp-80 インスタンス グループのバックエンド インスタンスに到達できるようにするファイアウォール ルール(ターゲットタグ network-lb-tcp-80 を使用)。
  • 他の外部トラフィック(ポート 8080 の TCP、UDP、ESP、ICMP)が ig-us-l3-default インスタンス グループのバックエンド インスタンスに到達できるようにするファイアウォール ルール。(ターゲットタグ network-lb-l3-default を使用)

Console

  1. Google Cloud Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. TCP トラフィックの最初のファイアウォール ルールを作成します。
    1. [ファイアウォール ルールを作成] をクリックします。
    2. [名前] に allow-network-lb-tcp-80 と入力します。
    3. ファイアウォール ルールを適用する [ネットワーク] を選択します(default)。
    4. [ターゲット] で、[指定されたターゲットタグ] を選択します。
    5. [ターゲットタグ] フィールドに「network-lb-tcp-80」と入力します。
    6. [ソース IP の範囲] を 0.0.0.0/0 に設定します。これにより、任意の送信元からのトラフィックが許可されます。これにより、外部トラフィックとヘルスチェック プローブの両方がバックエンド インスタンスに到達できるようになります。
    7. [プロトコルとポート] で、[指定したプロトコルとポート] をオンにします。[tcp] の横にあるチェックボックスをオンにして、「80」と入力します。
    8. [作成] をクリックします。新しいファイアウォール ルールが Console に表示されるまで少し時間がかかる場合があります。表示されない場合は、[更新] をクリックしてルールを表示してみてください。
  3. 2 つ目のファイアウォール ルール(UDP、ESP、ICMP トラフィック用)を作成します。
    1. [ファイアウォール ルールを作成] をクリックします。
    2. [名前] に allow-network-lb-l3-default と入力します。
    3. ファイアウォール ルールを適用する [ネットワーク] を選択します(default)。
    4. [ターゲット] で、[指定されたターゲットタグ] を選択します。
    5. [ターゲットタグ] フィールドに「network-lb-l3-default」と入力します。
    6. [ソース IP の範囲] を 0.0.0.0/0 に設定します。これにより、任意の送信元からのトラフィックが許可されます。これにより、外部トラフィックとヘルスチェック プローブの両方がバックエンド インスタンスに到達できるようになります。
    7. [プロトコルとポート] で、[指定したプロトコルとポート] をオンにします。
      1. [tcp] の横にあるチェックボックスをオンにして、「8080」と入力します。
      2. [udp] の横にあるチェックボックスをオンにします。
      3. [その他のプロトコル] の横にあるチェックボックスをオンにして、「esp, icmp」と入力します。
    8. [作成] をクリックします。新しいファイアウォール ルールが Console に表示されるまで少し時間がかかる場合があります。表示されない場合は、[更新] をクリックしてルールを表示してみてください。

gcloud

  1. TCP トラフィックの最初のファイアウォール ルールを作成します。

    gcloud compute firewall-rules create allow-network-lb-tcp-80 \
        --target-tags network-lb-tcp-80 \
        --allow tcp:80
    
  2. 2 つ目のファイアウォール ルール(UDP、ESP、ICMP トラフィック用)を作成します。このファイアウォールにより、TCP ヘルスチェック プローブがポート 8080 のインスタンスに到達できるようになります。

    gcloud compute firewall-rules create allow-network-lb-l3-default \
        --target-tags network-lb-l3-default \
        --allow tcp:8080,udp,esp,icmp
    

ロードバランサの構成

次に、ロードバランサを設定します。1 つはロードバランサはポート 80 で TCP トラフィックを処理し、もう 1 つのロードバランサは TCP(ポート 8080)、UDP、ESP、ICMP トラフィックを処理します。両方のロードバランサは、その転送ルールで同じ外部 IP アドレスを使用します。

ロードバランサを構成すると、構成した静的外部 IP アドレス宛てのパケットがバックエンド VM インスタンスに送信されます。Compute Engine で提供されるイメージを使用する場合は、この IP アドレスを処理するようにインスタンスが自動的に構成されます。その他のイメージを使用する場合は、このアドレスを eth0 のエイリアスまたは各インスタンスのループバックとして構成する必要があります。

gcloud

  1. ロードバランサに使用する静的外部 IP アドレスを作成します。

    gcloud compute addresses create network-lb-ip \
        --region us-central1
    
  2. ポート 80 の TCP ヘルスチェックを作成します。これは、ig-us-tcp-80 インスタンス グループのバックエンドの正常性を確認するために使用されます。

    gcloud compute health-checks create tcp tcp-health-check-80 \
        --region us-central1 \
        --port 80
    
  3. ポート 8080 の TCP ヘルスチェックを作成します。これは、ig-us-l3-default インスタンス グループのバックエンドの正常性を確認するために使用されます。

    gcloud compute health-checks create tcp tcp-health-check-8080 \
        --region us-central1 \
        --port 8080
    
  4. ポート 80 の TCP トラフィックを処理するロードバランサを作成します。

    1. プロトコル TCP を設定してバックエンド サービスを作成します。

      gcloud alpha compute backend-services create backend-service-tcp-80 \
          --protocol TCP \
          --health-checks tcp-health-check-80 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. バックエンド インスタンス グループをバックエンド サービスに追加します。

      gcloud alpha compute backend-services add-backend backend-service-tcp-80 \
          --instance-group ig-us-tcp-80 \
          --instance-group-zone us-central1-a \
          --region us-central1
      
    3. ポート 80 で受信した TCP トラフィックをバックエンド サービスにルーティングする転送ルールを作成します。TCP はデフォルトの転送ルール プロトコルで、明示的に設定する必要はありません。

      手順 1 で予約した IP アドレスをロードバランサの静的外部 IP アドレスとして使用します。

      gcloud alpha compute forwarding-rules create forwarding-rule-tcp-80 \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports 80 \
          --address network-lb-ip \
          --backend-service backend-service-tcp-80
      
  5. TCP(ポート 8080)、UDP、ESP、ICMP トラフィックを処理するロードバランサを作成します。

    1. プロトコル UNSPECIFIED を設定してバックエンド サービスを作成します。

      gcloud alpha compute backend-services create backend-service-l3-default \
          --protocol UNSPECIFIED \
          --health-checks tcp-health-check-8080 \
          --health-checks-region us-central1 \
          --region us-central1
      
    2. バックエンド インスタンス グループをバックエンド サービスに追加します。

      gcloud alpha compute backend-services add-backend backend-service-l3-default \
          --instance-group ig-us-l3-default \
          --instance-group-zone us-central1-c \
          --region us-central1
      
    3. サポートされているすべての IP プロトコル トラフィック(ポート 8080 の TCP、UDP、ESP、ICMP)を処理するため、プロトコルを L3_DEFAULT に設定した転送ルールを作成します。L3_DEFAULT 転送ルールは、すべてのポートに構成する必要があります。

      最初のロードバランサと同じ外部 IP アドレスを使用します。

      gcloud alpha compute forwarding-rules create forwarding-rule-l3-default \
          --load-balancing-scheme external \
          --region us-central1 \
          --ports all \
          --ip-protocol L3_DEFAULT \
          --address network-lb-ip \
          --backend-service backend-service-l3-default
      

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

負荷分散サービスの構成が完了したので、ロードバランサの外部 IP アドレスにトラフィックの送信を開始できます。また、バックエンド インスタンスに分散されるトラフィックを監視できます。

ロードバランサの外部 IP アドレスを調べる

Console

  1. 負荷分散の [詳細] ページにある [転送ルール] タブに移動します。
    [転送ルール] タブに移動
  2. forwarding-rule-tcp-80 または forwarding-rule-l3-default を探します。この例では、両方のロードバランサに同じ IP アドレスを使用しているため、どちらでも構いません。
  3. [IP アドレス] 列に表示された外部 IP アドレスをメモします。

gcloud

次のコマンドを入力して、ロードバランサが使用する転送ルールの外部 IP アドレスを表示します。

gcloud alpha compute forwarding-rules describe forwarding-rule-tcp-80 \
    --region us-central1

この例では、両方の転送ルールに同じ IP アドレスを使用しているため、forwarding-rule-l3-default も使用できます。

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

この手順により、ロードバランサに外部トラフィックが送信されます。次のテストを行い、ポート 80 の TCP トラフィックが ig-us-tcp-80 インスタンス グループによって負荷分散され、その他すべてのトラフィック(ポート 8080 の TCP、UDP、ESP、ICMP)が ig-us-l3-default インスタンス グループによって負荷分散されていることを確認します。

ポート 80 の TCP リクエストの動作を確認する

  1. curl を使用して IP アドレスに接続し、ロードバランサにウェブ リクエストを送信します(ポート 80 の TCP 経由)。

    $ while true; do curl -m1 IP_ADDRESS; done
    
  2. curl コマンドによって返された値の文字列をメモします。レスポンスを生成するバックエンド VM の名前が文字列内に表示されます(たとえば、Page served from: VM_NAME)。ig-us-tcp-80 インスタンス グループのインスタンスからのみ、レスポンスが返されます。

    最初のレスポンスで失敗した場合は、構成が完全に読み込まれてインスタンスが正常であるとマークされるまで最大 30 秒待ってから、もう一度やり直してください。

ポート 8080 の TCP リクエストの動作を確認する

  1. curl を使用して IP アドレスに接続し、ロードバランサにウェブ リクエストを送信します(ポート 8080 の TCP 経由)。

    $ while true; do curl -m1 IP_ADDRESS:8080; done
    
  2. curl コマンドによって返された値の文字列をメモします。ig-us-l3-default インスタンス グループのインスタンスからのみ、レスポンスが返されます。

    これは、ロードバランサの IP アドレスのポート 8080 に送信されたトラフィックが、ig-us-l3-default インスタンス グループのバックエンドによってのみ処理されていることを示しています。

ICMP リクエストの動作を確認する

ICMP トラフィックの動作を確認するには、tcpdump コマンドを実行して、ロードバランサへの ICMP リクエストを ig-us-l3-default インスタンス グループのバックエンド VM のみが処理していることを確認します。

  1. バックエンド VM に SSH で接続します。

    1. Cloud Console で、[VM インスタンス] ページに移動します。
      [VM インスタンス] ページに移動

    2. 仮想マシン インスタンスのリストで、接続するインスタンスの行にある [SSH] をクリックします。

  2. 次のコマンドを実行し、tcpdump を使用して ICMP トラフィックのリッスンを開始します。

    sudo tcpdump icmp -w ~/icmpcapture.pcap -s0 -c 10000
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    SSH ウィンドウを開いたままにします。

  3. 4 つのバックエンド VM すべてに手順 1 と 2 を繰り返します。

  4. ping を使用して IP アドレスに接続し、ロードバランサに ICMP リクエストを送信します。

    ping IP_ADDRESS
    
  5. 開いている各 VM の SSH ウィンドウに戻り、tcpdump キャプチャ コマンドを停止します。これを行うには、Ctrl+C を使用します。

  6. VM ごとに、icmpcapture.pcap ファイルにある tcpdump コマンドの出力を確認します。

    sudo tcpdump -r ~/icmpcapture.pcap -n
    

    ig-us-l3-default インスタンス グループのバックエンド VM の場合、次のようなエントリが表示されます。

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    22:13:07.814486 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 1, length 64
    22:13:07.814513 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 1, length 64
    22:13:08.816150 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 2, length 64
    22:13:08.816175 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 2, length 64
    22:13:09.817536 IP 35.230.115.24 > 35.193.84.93: ICMP echo request, id 1995, seq 3, length 64
    22:13:09.817560 IP 35.193.84.93 > 35.230.115.24: ICMP echo reply, id 1995, seq 3, length 64
    ...
    

    ig-us-tcp-80 インスタンス グループのバックエンド VM の場合は、パケットを受信していないため、ファイルに何も記録されません。

    reading from file /home/[user-directory]/icmpcapture.pcap, link-type EN10MB (Ethernet)
    

次のステップ