自動 Envoy デプロイによる Compute Engine VM での Traffic Director の設定

このガイドの手順に沿って進める前に、Traffic Director の設定の準備を確認し、ドキュメントに記載されている前提条件のタスクを完了していることを確認してください。

このガイドでは、Envoy サイドカー プロキシで構成されるデータプレーンの自動デプロイ、Traffic Director を使用した構成、設定が正常に機能していることの確認などを実施する方法について説明します。このプロセスでは次のことを行います。

  1. テストサービスを作成する。
  2. Envoy プロキシを使用して Compute Engine にシンプルなデータプレーンをデプロイする。
  3. Compute Engine API を使用して Traffic Director を設定し、Traffic Director で Envoy サイドカー プロキシを構成できるようにする。
  4. Envoy プロキシを実行している VM にログインし、Envoy プロキシ経由で負荷分散バックエンドにリクエストを送信する。

このドキュメントの構成例はデモを目的とするものです。本番環境では、環境と要件に基づいて、コンポーネントの追加のデプロイが必要になることがあります。

Hello World テストサービスの作成

このセクションでは、クライアントからのリクエストを処理した VM のホスト名を返す、簡単なテストサービスを作成する方法について説明します。テストサービスは単純で、Compute Engine のマネージド インスタンス グループ全体にデプロイされたウェブサーバーです。

Hello World テストサービスのインスタンス テンプレートを作成する

作成したインスタンス テンプレートは、startup-script パラメータを使用してサンプルの apache2 ウェブサーバーを構成します。

Console

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

    [インスタンス テンプレート] ページに移動

  2. [インスタンス テンプレートを作成] をクリックします。
  3. フィールドに次の情報を入力します。
    • 名前: td-demo-hello-world-template
    • ブートディスク: Debian GNU/Linux 10(buster)
    • サービス アカウント: Compute Engine default service account
    • アクセス スコープ: すべての Cloud APIs への完全アクセス権を許可
  4. [管理、セキュリティ、ディスク、ネットワーキング、単一テナンシー] をクリックします。1 [ネットワーク] タブの [ネットワーク タグ] フィールドに、td-http-server タグを追加します。
  5. [管理] タブで、次のスクリプトを [起動スクリプト] フィールドにコピーします。

    #!/bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html
    
  6. [作成] をクリックします。

gcloud

インスタンス テンプレートを作成するには:

gcloud compute instance-templates create td-demo-hello-world-template \
  --machine-type=n1-standard-1 \
  --boot-disk-size=20GB \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=td-http-server \
  --metadata=startup-script="#! /bin/bash
sudo apt-get update -y
sudo apt-get install apache2 -y
sudo service apache2 restart
sudo mkdir -p /var/www/html/
echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html"

Hello World サービス用のマネージド インスタンス グループを作成する

このセクションでは、マネージド インスタンス グループにテストサービスの 2 つのインスタンスが常に存在するように設定します。これはデモ用です。Traffic Director は自動スケーリングされたマネージド インスタンス グループをサポートしています。

Console

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

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

  2. [インスタンス グループを作成] をクリックします。
  3. 新しいマネージド インスタンス グループが選択されていることを確認します。
  4. マネージド インスタンス グループの名前として「td-demo-hello-world-mig」を入力し、us-central1-a ゾーンを選択します。
  5. [インスタンス テンプレート] で、作成したインスタンス テンプレート(td-demo-hello-world-template)を選択します。
  6. [自動スケーリング モード] で [自動スケーリングしない] を選択します。
  7. [インスタンス数] で、グループ内に作成するインスタンスの数を 2 つ以上指定します。
  8. [作成] をクリックします。

gcloud

gcloud コマンドライン ツールを使用して、以前に作成したインスタンス テンプレートでマネージド インスタンス グループを作成します。

gcloud compute instance-groups managed create td-demo-hello-world-mig \
  --zone us-central1-a \
  --size=2 \
  --template=td-demo-hello-world-template

インスタンス テンプレートと Envoy がデプロイされているマネージド インスタンス グループを作成する

このセクションの手順に従って、Envoy プロキシを自動的にデプロイする Traffic Director 用のインスタンス テンプレートとマネージド インスタンス グループを作成します。マネージド インスタンス グループは、自動スケーリングを使用して新しいバックエンド VM を作成します。

VM で実行されているソフトウェア コンポーネント

--service-proxy=enabled でインスタンス テンプレートを作成すると、次のコンポーネントが VM にインストールされます。

  • Traffic Director で構成された Envoy プロキシが、専用の Cloud Storage バケットからダウンロードされます。バケットには、公式の Istio リリースの Envoy プロキシ バイナリが含まれています。
  • サービス プロキシ エージェント。Envoy プロキシとプロキシのコンポーネントを初期化します。サービス プロキシ エージェントは、トラフィック インターセプトを設定して、VM の稼働中に Envoy プロキシの健全性をモニタリングします。サービス プロキシ エージェントは Cloud Storage バケットからダウンロードされます。

インスタンス テンプレートの作成

インスタンス テンプレートは、マネージド インスタンス グループ内に作成される VM インスタンスの構成を指定します。インスタンス テンプレートに渡すフラグは、Envoy をインストールし、Traffic Director の準備ができるように VM インスタンスを構成します。

このようなインスタンス テンプレートを作成するには:

  gcloud beta compute instance-templates create td-vm-template-auto \
    --service-proxy=enabled
 

Envoy のデプロイをカスタマイズするには、Envoy の自動デプロイのリファレンス ガイドをご覧ください。

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

Console

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

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

  2. [インスタンス グループを作成] をクリックします。
  3. マネージド インスタンス グループの名前として「td-vm-mig-us-central1」を入力し、us-central1-a ゾーンを選択します。
  4. [グループタイプ] で、[マネージド インスタンス グループ] を選択します。
  5. [インスタンス テンプレート] で、作成したインスタンス テンプレート(td-vm-template-auto)を選択します。
  6. グループに作成するインスタンスの数として 2 を指定します。
  7. [作成] をクリックして、新しいグループを作成します。

gcloud

gcloud コマンドライン ツールを使用して、以前に作成したインスタンス テンプレートでマネージド インスタンス グループを作成します。

 gcloud compute instance-groups managed create td-vm-mig-us-central1 \
    --zone us-central1-a --size=2 --template=td-vm-template-auto

Google Cloud 負荷分散コンポーネントを使用して Traffic Director を構成する

このセクションの手順では、Envoy プロキシが 2 つのバックエンド インスタンス間で送信トラフィックを負荷分散するように Traffic Director を構成する方法を示します。次のコンポーネントを構成します。

ヘルスチェックの作成

ヘルスチェックを作成するには、次の手順に従います。詳細については、ヘルスチェックの作成をご覧ください。

Console

  1. Google Cloud Console の [ヘルスチェック] ページに移動します。
    [ヘルスチェック] ページに移動
  2. [ヘルスチェックを作成] をクリックします。
  3. [名前] に「td-vm-health-check」と入力します。
  4. プロトコルとして [HTTP] を選択します。
  5. [作成] をクリックします。

gcloud

  1. ヘルスチェックを作成します。

    gcloud compute health-checks create http td-vm-health-check
    
  2. ヘルスチェック用のファイアウォール ルールを作成します。

    gcloud compute firewall-rules create fw-allow-health-checks \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags td-http-server \
      --rules tcp:80
    

バックエンド サービスの作成

バックエンド サービスを作成します。gcloud コマンドライン ツールを使用する場合は、負荷分散スキームが INTERNAL_SELF_MANAGED のグローバル バックエンド サービスとして指定する必要があります。ヘルスチェックとマネージド インスタンス グループまたは非マネージド インスタンス グループをバックエンド サービスに追加します。この例では、マネージド インスタンス グループの作成で作成したサンプル HTTP サービスを実行する Compute Engine VM テンプレートで、マネージド インスタンス グループを使用します。

Console

  1. Cloud Console の [Traffic Director] ページに移動します。

    [Traffic Director] ページに移動

  2. [サービス] タブで、[サービスを作成] をクリックします。

  3. [続行] をクリックします。

  4. サービス名に「td-vm-service」と入力します。

  5. 正しい VPC ネットワークを選択します。

  6. [バックエンド タイプ] が [インスタンス グループ] であることを確認します。

  7. td-demo-hello-world-mig を選択します。これは、Hello World テストサービスのバックエンドを含む、作成したマネージド インスタンス グループです。

  8. [ポート番号] に正しい値を入力します。

  9. [負荷分散モード] として [使用率] または [レート] を選択します。デフォルト値は [レート] です。

  10. [完了] をクリックします。

  11. 作成したヘルスチェックを選択するか、[別のヘルスチェックを作成] をクリックして、プロトコルとして [HTTP] を選択します。

  12. [コネクション ドレインのタイムアウト] で、値を 30 秒以上に設定します。

  13. [続行] をクリックします。

  14. [作成] をクリックします。

gcloud

  1. バックエンド サービスを作成します。

    gcloud compute backend-services create td-vm-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED \
     --connection-draining-timeout=30s \
     --health-checks td-vm-health-check
    
  2. バックエンド サービスにバックエンドを追加します。

    gcloud compute backend-services add-backend td-vm-service \
      --instance-group td-demo-hello-world-mig \
      --instance-group-zone us-central1-a \
      --global
    

ルーティング ルール マップの作成

ルーティング ルール マップは、Traffic Director がメッシュ内のトラフィックをルーティングする方法を定義します。ルーティング ルール マップの一部として、仮想 IP(VIP)アドレスと、ホストベースのルーティングなど関連する一連のトラフィック管理ルールを構成します。アプリケーションが VIP にリクエストを送信すると、Envoy プロキシは次の処理を行います。

  1. リクエストをインターセプトします。
  2. URL マップのトラフィック管理ルールに従って評価します。
  3. リクエスト内のホスト名に基づいてバックエンド サービスを選択します。
  4. 選択したバックエンド サービスに関連付けられているバックエンドまたはエンドポイントを選択します。
  5. そのバックエンドまたはエンドポイントにトラフィックを送信します。

トラフィック管理の詳細については、高度なトラフィック管理をご覧ください。

Console

Cloud Console では、ターゲット プロキシの作成は転送ルールの作成と統合されます。転送ルールを作成すると、Google Cloud によってターゲット HTTP プロキシが自動的に作成され、URL マップに接続されます。

  1. Cloud Console の [Traffic Director] ページに移動します。

    [Traffic Director] ページに移動

  2. [ルーティング ルール マップ] タブで、[ルーティング ルール マップを作成] をクリックします。

  3. 名前を入力します。

  4. [転送ルールを追加] をクリックします。

  5. 転送ルール名に「td-vm-forwarding-rule」と入力します。

  6. ネットワークを選択します。

  7. [内部 IP] を選択します。この IP アドレスに送信されたトラフィックは、Envoy プロキシによってインターセプトされ、ホストとパスのルールに従って適切なサービスに送信されます。

    転送ルールは、load-balancing-schemeINTERNAL_SELF_MANAGED に設定されたグローバル転送ルールとして作成されます。

  8. [カスタム IP] フィールドに「10.0.0.1」と入力します。VM がこの IP アドレスに送信すると、Envoy プロキシがインターセプトし、URL マップで定義されたトラフィック管理ルールに従って、バックエンド サービスのエンドポイントに送信します。

    VPC ネットワーク内の各転送ルールには、VPC ネットワークごとに一意の IP アドレスとポートが必要です。同じ IP アドレスとポートで、特定の VPC ネットワーク内に複数の転送ルールを作成すると、最初の転送ルールだけが有効になります。それ以外は無視されます。ネットワークで 10.0.0.1 を利用できない場合は、別の IP アドレスを選択してください。

  9. [ポート] が 80 に設定されていることを確認します。

  10. [保存] をクリックします。

  11. [ルーティング ルール] セクションで、[単純なホストとパスのルール] を選択します。

  12. [ホストとパスのルール] セクションで、サービスとして td-vm-service を選択します。

  13. [ホストとパスのルールを追加] をクリックします。

  14. [ホスト] に「hello-world」と入力します。

  15. [サービス] で td-vm-service を選択します。

  16. [保存] をクリックします。

gcloud

  1. バックエンド サービス td-vm-service をデフォルトとして使用する URL マップを作成します。

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. ホスト名とパスに基づいてサービスのトラフィックをルーティングするパスマッチャーとホストルールを作成します。この例では、サービス名として td-vm-service を使用し、このホスト(/*)のすべてのパスリクエストに一致するデフォルトのパスマッチャーを使用します。

    gcloud compute url-maps add-path-matcher td-vm-url-map \
       --default-service td-vm-service \
       --path-matcher-name td-vm-path-matcher
    
    gcloud compute url-maps add-host-rule td-vm-url-map \
       --path-matcher-name=td-vm-path-matcher \
       --hosts=hello-world
    
  3. ターゲット HTTP プロキシを作成します。

    gcloud compute target-http-proxies create td-vm-proxy \
       --url-map=td-vm-url-map
    
  4. 転送ルールを作成します。

    転送ルールはグローバルにする必要があり、load-balancing-scheme の値を INTERNAL_SELF_MANAGED に設定して作成する必要があります。

    gcloud compute forwarding-rules create td-vm-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=10.0.0.1 \
       --target-http-proxy=td-vm-proxy \
       --ports=80 \
       --network=default
    

この時点で、Traffic Director は、URL マップで指定されたサービスのトラフィックをマネージド インスタンス グループのバックエンド間で負荷分散するように構成されます。

構成の確認

Compute Engine VM 用の Traffic Director 設定ガイドの最後の部分では、クライアント VM から転送ルール VIP に向けて送信されたトラフィックがインターセプトされ、Envoy プロキシにリダイレクトされるかどうかをテストします。その後、Hello World サービスをホストする VM へのリクエストをルーティングします。

これを行うには、トラフィックをインターセプトして Envoy にリダイレクトするように構成されたクライアント VM にログインします。ルーティング ルール マップに関連付けられている VIP に curl リクエストを送信します。Envoy は curl リクエストを検査し、解決する必要のあるサービスを特定して、そのサービスに関連するバックエンドにリクエストを送信します。

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

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

  2. td-vm-mig-us-central1 インスタンス グループを選択します。
  3. [VM の概要] セクションの [接続] で、[SSH] をクリックします。
  4. クライアント VM にログインしたら、curl ツールを使用して、Envoy を介して Hello World サービスにリクエストを送信します。
curl -H "Host: hello-world" http://10.0.0.1/

このコマンドを繰り返し実行すると、Hello World マネージド インスタンス グループ内のバックエンドのホスト名を含むさまざまな HTML レスポンスが表示されます。これは、Envoy が Hello World サービスのバックエンドにトラフィックを送信するときに、デフォルトの負荷分散アルゴリズムであるラウンドロビン負荷分散を使用しているためです。

次のステップ

ネットワークでのマイクロサービスの分散方法によっては、URL マップに転送ルールまたはホストとパスのルールを追加することが必要な場合があります。転送ルールと URL マップの詳細については、次のドキュメントをご覧ください。