このガイドでは、基本的なネットワーク負荷分散の構成を作成する手順を説明します。この例では、トラフィックを分散する Compute Engine インスタンス上に複数のウェブサーバーがあることを想定しています。このシナリオでは、正常に動作しているインスタンスの間で HTTP トラフィックを分散させるように、レイヤ 4 負荷分散を構成します。また、正常なインスタンスにだけトラフィックが送信されるように、基本的な HTTP ヘルスチェックを構成します。
この例では、HTTP トラフィックの負荷分散を行っていますが、ネットワーク負荷分散を使用して UDP、TCP、SSL のトラフィックの負荷分散も行うことができます。始める前に、ネットワーク負荷分散の概要をご覧ください。
始める前に
gcloud
コマンドライン ツールをインストールします。ツールの完全な概要については、gcloud ツールガイドをご覧ください。負荷分散に関連するコマンドは、gcloud compute
コマンド グループにあります。
--help
フラグを使用して、gcloud
コマンドの詳細なヘルプを入手することもできます。
gcloud compute http-health-checks create --help
gcloud
コマンドライン ツールをまだ実行していない場合は、最初に gcloud init
を実行して認証します。
また、ロードバランサの静的外部 IP アドレスも作成する必要があります。Compute Engine が提供するイメージを使用している場合、仮想マシン(VM)インスタンスはこの IP アドレスを処理するように自動的に構成されます。その他のイメージを使用する場合は、このアドレスを eth0 のエイリアスまたは各インスタンスのループバックとして構成する必要があります。
このガイドは、bash の知識があることを前提としています。
Compute Engine VM インスタンスの構成
この負荷分散のシナリオでは、3 つの Compute Engine VM インスタンスを作成し、Apache をインストールします。また、HTTP トラフィックがインスタンスに到達できるようにファイアウォール ルールを追加します。
ネットワーク ロードバランサのバックエンド VM として参加するインスタンスでは、適切な Linux ゲスト環境、Windows ゲスト環境、または同等の機能を提供する他のプロセスが実行されている必要があります。
バックエンド インスタンスの設定
Console
- Google Cloud Console の [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動 - [インスタンスを作成] をクリックします。
- [名前] を
www1
に設定します。 - [リージョン] を us-central1 に設定します。
- [ゾーン] を us-central1-b に設定します。
- [ブートディスク] で、
Debian GNU/Linux 9 (stretch)
のデフォルトの OS イメージが選択済みになっています。 - [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックして、詳細設定を表示します。
- [管理] タブで、[起動スクリプト] フィールドに次のスクリプトを挿入します。
#! /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
- [ネットワーク] の [タグ] フィールドに「
network-lb-tag
」と入力します。 - 残りのフィールドはデフォルト値のままにします。
- [作成] をクリックします。
- [管理] タブで、[起動スクリプト] フィールドに次のスクリプトを挿入します。
- 同じ設定を使って
www2
という名前のインスタンスを作成します。ただし、[自動化] の [起動スクリプト] フィールドには次のスクリプトを挿入します。#! /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
- 同じ設定を使って
www3
という名前のインスタンスを作成します。ただし、[自動化] の [起動スクリプト] フィールドには次のスクリプトを挿入します。#! /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
gcloud
次のコマンドはすべてローカル システムで実行し、bash
コマンド プロンプトを使用することを前提としています。
OS イメージ名、属性、ステータスを確認するには、gcloud compute images list
コマンドを使用します。
指定したゾーンで 3 つの新しい仮想マシンを作成し、それらすべてに同じタグを設定します。この例では、ゾーンを us-central1-b に設定します。
tags
フィールドを設定すると、ファイアウォール ルールと同じように、これらのインスタンスを同時に参照できます。これらのコマンドにより、各インスタンスに Apache もインストールされ、インスタンスごとに固有のホームページが提供されます。gcloud compute instances create www1 \ --image-family debian-9 \ --image-project debian-cloud \ --zone us-central1-b \ --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-b \ --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-b \ --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"
api
instances.insert
メソッドを使用して、ゾーン us-central1-b
にインスタンス www1
を作成する
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances { "canIpForward": false, "deletionProtection": false, "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "www1", "initializeParams": { "sourceImage": "projects/eip-images/global/images/debian-9-drawfork-v20181101", "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2", "metadata": { "items": [ { "key": "startup-script", "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html" } ] }, "name": "www1", "networkInterfaces": [ { "network": "projects/[PROJECT_ID]/global/networks/default", "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default" } ], "tags": { "items": [ "network-lb-tag" ] } }
同じ設定で www2
、www3
というインスタンスを作成します。ただし deviceName
、value
、name
フィールドの www1
は置き換えます。
この VM インスタンスへの外部トラフィックを許可するファイアウォール ルールを作成する
Console
- Google Cloud Console の [ファイアウォール] ページに移動します。
[ファイアウォール] ページに移動 - [ファイアウォール ルールを作成] をクリックします。
- [名前] に
www-firewall-network-lb
と入力します。 - ファイアウォール ルールを適用するネットワークを選択します(デフォルト)。
- [ターゲット] で [指定されたターゲットタグ] を選択します。
- [ターゲットタグ] フィールドに「
network-lb-tag
」と入力します。 - [ソース IP の範囲] を
0.0.0.0/0
に設定します。これにより、任意の送信元からのトラフィックが許可されます。 - [指定したプロトコルとポート] で、[TCP] の隣にあるチェックボックスをクリックして「
80
」と入力します。 - [作成] をクリックします。新しいファイアウォール ルールがコンソールに表示されるまで少し時間がかかる場合があります。表示されない場合は、[更新] をクリックしてルールを表示してみてください。
gcloud
gcloud compute firewall-rules create www-firewall-network-lb \ --target-tags network-lb-tag --allow tcp:80
api
firewalls.insert
**メソッド**を使用して、サブネット内のすべてのトラフィックを許可するファイアウォール ルールを作成する
POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls { "name": "www-firewall-network-lb", "direction": "INGRESS", "priority": 1000, "targetTags": [ "network-lb-tag" ], "allowed": [ { "IPProtocol": "tcp", "ports": [ "80" ] } ], "sourceRanges": [ "0.0.0.0/0" ] }
インスタンスの外部 IP アドレスを取得し、インスタンスが実行中であることを確認する
Console
- Google Cloud Console の [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動 - [外部 IP] 列で、インスタンスのアドレスを確認します。
- インスタンスの実行中であることを確認するには、インスタンス名の左側にある緑色のチェックマークを探します。緑色のチェックマークが表示されない場合は、インスタンスの一般的なトラブルシューティングのページをご覧ください。
gcloud
次のコマンドを実行してインスタンスを一覧表示し、
EXTERNAL_IP
列から IP アドレスを取得します。gcloud compute instances list
各インスタンスが実行中であることを確認します。
コマンドラインで、各インスタンスの外部 IP アドレスを使用して
curl
を実行し、すべてのインスタンスが応答することを確認します。curl http://[IP_ADDRESS]
api
instances.get
メソッドを使用してインスタンス www1
に関する情報を取得する
status
フィールドが RUNNING
であることを確認し、natIP
フィールドで外部 IP アドレスを探します。
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1 { "kind": "compute#instance", "id": "6734015273571474749", "creationTimestamp": "2018-11-09T11:45:23.487-08:00", "name": "www1", "description": "", "tags": { "items": [ "network-lb-tag" ], "fingerprint": "9GVlO4gPawg=" }, "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2", "status": "RUNNING", "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b", "canIpForward": false, "networkInterfaces": [ { "kind": "compute#networkInterface", "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default", "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default", "networkIP": "10.128.0.2", "name": "nic0", "accessConfigs": [ { "kind": "compute#accessConfig", "type": "ONE_TO_ONE_NAT", "name": "External NAT", "natIP": "35.192.37.233", "networkTier": "PREMIUM" } ], "fingerprint": "lxD5f5ua_sw=" } ], "disks": [ { "kind": "compute#attachedDisk", "type": "PERSISTENT", "mode": "READ_WRITE", "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1", "deviceName": "www1", "index": 0, "boot": true, "autoDelete": true, "licenses": [ "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-9-stretch" ], "interface": "SCSI", "guestOsFeatures": [ { "type": "VIRTIO_SCSI_MULTIQUEUE" } ] } ], "metadata": { "kind": "compute#metadata", "fingerprint": "IyHRmHoJx6E=", "items": [ { "key": "startup-script", "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html" } ] }, "serviceAccounts": [ { "email": "674259759219-compute@developer.gserviceaccount.com", "scopes": [ "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/trace.append" ] } ], "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1", "scheduling": { "onHostMaintenance": "MIGRATE", "automaticRestart": true, "preemptible": false }, "cpuPlatform": "Intel Haswell", "labelFingerprint": "42WmSpB8rSM=", "startRestricted": false, "deletionProtection": false }
www2
と www3
に、この API 呼び出しを繰り返します。
負荷分散サービスの構成
次に、負荷分散サービスを設定します。
負荷分散サービスを設定すると、仮想マシン インスタンスは、設定した静的外部 IP アドレス宛てのパケットを受信します。Compute Engine で提供されるイメージを使用する場合は、この IP アドレスを処理するようにインスタンスが自動的に構成されます。その他のイメージを使用する場合は、このアドレスを eth0 のエイリアスまたは各インスタンスのループバックとして構成する必要があります。
Console
- Google Cloud Console で [ロードバランサの作成] ページに移動します。
[ロードバランサの作成] ページに移動 [TCP 負荷分散] で [構成を開始] をクリックします。
[インターネット接続または内部専用] で [From Internet to my VMs] を選択します。
[マルチリージョンまたはシングル リージョン] で [Single region only] を選択します。
[バックエンド タイプ] で、ターゲット プールまたはターゲット インスタンスを選択します。
[続行] をクリックします。
バックエンドを構成する
- 新しい TCP ロードバランサの画面で、新しいロードバランサの [名前] に「
www-network-lb
」と入力します。 - [バックエンドの構成] をクリックします。
- 前に入力したロードバランサの名前が表示されますが、変更できません。
- [リージョン] で、
us-central1
を選択します。 - [バックエンド] で、[既存のインスタンスを選択] タブをクリックして、[インスタンスを追加] をクリックします。インスタンスとして「
www1
」と入力します。インスタンスwww2
とwww3
に同じ手順を繰り返します。 [ヘルスチェック] で、[ヘルスチェックを作成] または [別のヘルスチェックを作成] を選択します。
- ヘルスチェックの [名前] に「
basic-check
」と入力します。 - デフォルト設定のままにします。
- [保存して次へ] ボタンをクリックします。
[バックエンド設定] の左側にある青い丸のチェックマークが表示されていれば、設定に成功しています。
- ヘルスチェックの [名前] に「
転送ルールを構成する
- [フロントエンドの設定] をクリックします。
- [名前] に「
www-rule
」を入力します。 - [IP] にあるプルダウン メニューをクリックして、[IP アドレスを作成] を選択します。
- [新しい静的 IP アドレスの予約] 画面で、名前に「
lb-ip-1
」と入力します。 - [予約] をクリックします。
- [新しい静的 IP アドレスの予約] 画面で、名前に「
- [ポート] に
80
と入力します。 [完了] ボタンをクリックします。
[フロントエンドの設定] の左側にある青い丸のチェックマークが表示されていれば、設定に成功しています。
構成を確認する
- [確認と確定] ボタンをクリックして、ロードバランサのすべての構成設定を確認します。
設定が正しい場合は、[作成] をクリックします。ロードバランサの作成には数分かかります。
[負荷分散] 画面で、新しいロードバランサの [バックエンド] 列に緑色のチェックマークが表示されていれば、新しく作成したロードバランサは正常な状態です。
gcloud
負荷分散に使用する静的外部 IP アドレスを作成します。
gcloud compute addresses create network-lb-ip-1 \ --region us-central1
レガシー HTTP ヘルスチェック リソースを追加します。
この例では、ヘルスチェック メカニズムのデフォルト設定を使用しますが、独自にカスタマイズすることもできます。
gcloud compute http-health-checks create basic-check
ターゲット プールを追加します。
仮想マシン インスタンスと同じリージョンにターゲット プールを追加します。このターゲット プールに対して、前のステップで作成したヘルスチェックを使用します。ターゲット プールが機能するには、ヘルスチェック サービスが必要です。
gcloud compute target-pools create www-pool \ --region us-central1 --http-health-check basic-check
インスタンスをターゲット プールに追加します。
gcloud compute target-pools add-instances www-pool \ --instances www1,www2,www3 \ --instances-zone us-central1-b
ターゲット プール内のインスタンスは同じリージョンに属している必要がありますが、同じリージョン内の異なるゾーンにまたがっていてもかまいません。たとえば、ゾーン
us-central1-f
のインスタンスとゾーンus-central1-b
のインスタンスは同じリージョンus-central1
にあるため、同じターゲット プール内に含めることができます。転送ルールを追加します。
ターゲット IP アドレスとポート範囲の代わりに機能する転送ルールを追加します。
--address
フィールドには数値 IP アドレスまたは完全修飾名を使用します。gcloud compute forwarding-rules create www-rule \ --region us-central1 \ --ports 80 \ --address network-lb-ip-1 \ --target-pool www-pool
api
負荷分散に使用する静的外部 IP アドレスを作成します。
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses { "name": "network-lb-ip-1" }
レガシー HTTP ヘルスチェックを追加します。
この例では、ヘルスチェック メカニズムのデフォルト設定を使用しますが、独自にカスタマイズすることもできます。
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks { "name": "basic-check" }
ターゲット プールを追加します。
仮想マシン インスタンスと同じリージョンにターゲット プールを追加します。このターゲット プールに対して、前のステップで作成したヘルスチェックを使用します。ターゲット プールが機能するには、ヘルスチェック サービスが必要です。
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools { "name": "www-pool", "healthChecks": [ "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check" ] }
-
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance { "instances": [ { "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1" } ] }
インスタンス
www2
とwww3
に、この API 呼び出しを繰り返します。ターゲット プール内のインスタンスは同じリージョンに属している必要がありますが、同じリージョン内の異なるゾーンにまたがっていてもかまいません。たとえば、ゾーン
us-central1-f
のインスタンスとゾーンus-central1-b
のインスタンスは同じリージョンus-central1
にあるため、同じターゲット プール内に含めることができます。 転送ルールを追加します。
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules { "name": "www-rule", "portRange": "80", "loadBalancingScheme": "EXTERNAL", "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb" }
インスタンスへのトラフィックの送信
負荷分散サービスの構成が完了したので、転送ルールへのトラフィックの送信を開始できます。また、別のインスタンスに分散されるトラフィックをモニタリングできます。
転送ルールの外部 IP アドレスを検索する
Console
- Google Cloud Console の負荷分散の [詳細] ページにある [転送ルール] タブに移動します。
[転送ルール] タブに移動 - ロードバランサが使用する転送ルール
www-rule
を探します。 www-rule
の [IP アドレス] 列に表示された外部 IP アドレスをメモします。
gcloud
次のコマンドを入力して、ロードバランサが使用する www-rule
転送ルールの外部 IP アドレスを表示します。
gcloud compute forwarding-rules describe www-rule --region us-central1
api
forwardingRules.get
メソッドを使用して www-rule
転送ルールの外部 IP アドレスを表示する
出力で IPAddress
フィールドを探します。
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule { "kind": "compute#forwardingRule", "id": "5133886346582800002", "creationTimestamp": "2018-11-09T14:21:33.574-08:00", "name": "www-rule", "description": "", "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1", "IPAddress": "35.232.228.9", "IPProtocol": "TCP", "portRange": "80-80", "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb", "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule", "loadBalancingScheme": "EXTERNAL", "networkTier": "PREMIUM" }
ICMP はバックエンド インスタンスのサポート対象外
ネットワーク負荷分散は、バックエンド インスタンスに ICMP パケットを配信しません。ping
や traceroute
などを使用して ICMP パケットを送信しても、ロードバランサのバックエンド インスタンスから返信はありません。
ロードバランサのバックエンド インスタンスで ICMP トラフィックを禁止するファイアウォール ルールがある場合でも、Google Cloud インフラストラクチャが ICMP レスポンスを送信する場合があります。この動作は変更できません。
curl
コマンドを使用して外部 IP アドレスにアクセスする
curl
コマンドからのレスポンスは、3 つのインスタンスの間でランダムに変わります。最初のレスポンスで失敗した場合は、構成が完全に読み込まれてインスタンスが正常であるとマークされるまで最大 30 秒待ってから、もう一度やり直してください。
$ while true; do curl -m1 IP_ADDRESS; done
次のステップ
- ターゲット プールを使用したネットワーク負荷分散の仕組みを確認する。ターゲット プールを使用したネットワーク負荷分散の概要をご覧ください。
- ネットワーク ロードバランサがターゲット プールではなくリージョン バックエンド サービスでどのように機能するかを確認する。以下をご覧ください。
- UDP トラフィックでネットワーク ロードバランサを使用する際の問題と回避策を確認する。ネットワーク負荷分散で UDP を使用する方法をご覧ください。
- ロードバランサの設定をクリーンアップする。