自動 Envoy デプロイを使用した Compute Engine VM の設定

このドキュメントの内容は、古い API に適用されます。プレビュー版の新しいサービス ルーティング API を使用してデプロイする場合は、HTTP サービスを使用した Envoy プロキシの Cloud Service Mesh の設定をご覧ください。

このガイドの手順に進む前に、Envoy とプロキシレス ワークロードを使用したサービス ルーティング API の設定の準備で説明されている前提条件のタスクを完了します。

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

  1. Cloud OS Config API を有効にする。
  2. テストサービスを作成する。
  3. Envoy プロキシ(xDS v3 のみをサポートする Envoy バージョン 1.18.4)を使用して、Compute Engine にシンプルなデータプレーンをデプロイする。
  4. Compute Engine API を使用して Cloud Service Mesh を設定し、Cloud Service Mesh で Envoy サイドカー プロキシを構成できるようにする。
  5. Envoy プロキシを実行している VM にログインし、Envoy プロキシ経由で負荷分散バックエンドにリクエストを送信する。

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

Cloud OS Config API を有効にする

Cloud OS Config API を有効にします。この操作を行わないと、必要なコンポーネントを VM にインストールできません。

方法は次のとおりです。

Console

  1. Google Cloud コンソールで [API とサービス] に移動します。
    [API ライブラリ] ページに移動
  2. 正しいプロジェクトを選択します。
  3. 検索ボックスに「Cloud OS Config API」と入力して Enter キーを押します。
  4. [Cloud OS Config API] を選択します。
  5. [有効にする] をクリックします。

gcloud

gcloud services enable osconfig.googleapis.com

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

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

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

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

コンソール

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

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

  2. [インスタンス テンプレートを作成] をクリックします。
  3. フィールドに次の情報を入力します。
    • 名前: td-demo-hello-world-template
    • ブートディスク: オペレーティング システムとバージョンを選択します。
    • サービス アカウント: Compute Engine のデフォルトのサービス アカウント
    • アクセス スコープ: すべての 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

多数のオペレーティング システム バージョンから選択できます。この例では、デフォルト値である Debian 10 を使用しています。

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

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 つのインスタンスが常に存在するように設定します。これはデモ用です。Cloud Service Mesh は、自動スケーリングされたマネージド インスタンス グループをサポートしています。

コンソール

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

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

  2. [インスタンス グループを作成] をクリックします。
  3. [新しいマネージド インスタンス グループ(ステートレス)] を選択します。詳細については、ステートレス MIG とステートフル MIG をご覧ください。
  4. マネージド インスタンス グループの名前として「td-demo-hello-world-mig」を入力し、us-central1-a ゾーンを選択します。
  5. [インスタンス テンプレート] で、作成したインスタンス テンプレート(td-demo-hello-world-template)を選択します。
  6. [自動スケーリング モード] で [Off:do not autoscale] を選択します。
  7. [インスタンスの最大数] で、グループ内に作成するインスタンスの数を 2 つ以上指定します。
  8. [作成] をクリックします。

gcloud

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

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 プロキシを自動的にデプロイする Cloud Service Mesh 用のインスタンス テンプレートとマネージド インスタンス グループを作成します。マネージド インスタンス グループは、自動スケーリングを使用して新しいバックエンド VM を作成します。

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

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

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

利用可能な Envoy バージョンは、専用の Cloud Storage の場所でホストされている最新の Envoy バイナリのみです。この Envoy バージョンは、Compute Engine Debian、CentOS 7/8、RHEL 7/8 でサポートされています。自動修復とスケールアップ中に、マネージド インスタンス グループは最新バージョンの Envoy を VM にインストールします。場合によっては、以前に作成した VM インスタンスにデプロイした Envoy よりも新しいバージョンである可能性があります。その結果、マネージド インスタンス グループ内の VM 間で異なるバージョンがインストールされる可能性があります。一貫性のないバージョン間でも正しく機能します。Envoy のセキュリティ更新がある場合は、ローリング置換を使用してマネージド インスタンス グループをアップグレードすることをおすすめします。

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

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

インスタンス テンプレートのブートディスク イメージには、Debian 10/11、CentOS 7/8、または RHEL 7/8 を使用できます。

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

  gcloud compute instance-templates create td-vm-template-auto \
    --image-family=[ debian-10 | centos-7 | centos-8 | rhel-7 | rhel-8 ]  \
    --image-project=[ debian-cloud | centos-cloud |rhel-cloud ] \
    --service-proxy=enabled
 

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

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

コンソール

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

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

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

gcloud

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

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

Google Cloud ロード バランシング コンポーネントを使用した Cloud Service Mesh の構成

このセクションの手順では、Envoy プロキシが 2 つのバックエンド インスタンス間でアウトバウンド トラフィックをロード バランシングするように Cloud Service Mesh を構成する方法を示します。次のコンポーネントを構成します。

ヘルスチェックの作成

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

コンソール

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

gcloud

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

    gcloud compute health-checks create http td-vm-health-check
    

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

ヘルスチェック プローブに必要なファイアウォール ルールを作成するには、次の操作を行います。詳細については、ヘルスチェックのファイアウォール ルールをご覧ください。

コンソール

  1. Google Cloud コンソールの [ファイアウォール ポリシー] ページに移動します。
    [ファイアウォール ポリシー] ページに移動
  2. [ファイアウォール ルールを作成] をクリックします。
  3. ファイアウォール ルールの作成ページで、次の情報を入力します。
    • 名前: fw-allow-health-checks
    • ネットワーク: VPC ネットワークを選択します。
    • 優先度: 優先度の数値を入力するか、デフォルトの 1,000 を使用します。
    • トラフィックの方向: [内向き(上り)] を選択します。
    • 一致したときのアクション: [許可] を選択します。
    • ターゲット: [指定されたターゲットタグ] を選択し、[ターゲットタグ] テキスト ボックスに td-http-server を入力します。
    • ソースフィルタ: 正しい IP 範囲タイプを選択します。
    • ソース IP の範囲: 35.191.0.0/16,130.211.0.0/22
    • 送信先フィルタ: IP のタイプを選択します。
    • プロトコルとポート: [指定したプロトコルとポート] をクリックして、ポート 80tcp タイプをオンにします。

gcloud

  1. ヘルスチェック用のファイアウォール ルールを作成します。

    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
    

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

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

コンソール

  1. Google Cloud コンソールで [Cloud Service Mesh] ページに移動します。

    [Cloud Service Mesh] ページに移動

  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
    

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

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

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

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

コンソール

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

  1. Google Cloud コンソールで [Cloud Service Mesh] ページに移動します。

    [Cloud Service Mesh] ページに移動

  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
    

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

構成の確認

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

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

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

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

  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 サービスのバックエンドにトラフィックを送信するときに、デフォルトの負荷分散アルゴリズムであるラウンドロビン負荷分散を使用しているためです。

次のステップ