Ingress ゲートウェイの Traffic Director の設定

このガイドでは、Ingress ゲートウェイを使用して Traffic Director を構成する方法について説明します。

この構成では、ネットワーク ロードバランサがインターネットからのトラフィックを Ingress ゲートウェイ経由でサービス メッシュに転送します。Gateway リソースは、サービス メッシュへのゲートウェイとして機能する Envoy プロキシを管理します。ゲートウェイは、中間プロキシまたは Ingress とも呼ばれます。Ingress ゲートウェイとして機能するようにデプロイされた Envoy プロキシは、ワークロードのサイドカーではなく、スタンドアロン プロキシです。このモードでは、Envoy は IP アドレスとポートの明確に定義されたリストをリッスンし、構成したルーティング ルールに従ってトラフィックを転送します。このような Envoy クライアントの構成には、新しい Gateway API リソースを使用します。

Envoy プロキシ、ネットワーク ロードバランサ、ゲートウェイ リソースを含む Ingress ゲートウェイ
Envoy プロキシ、ネットワーク ロードバランサ、Gateway リソースを含む Ingress ゲートウェイ(クリックして拡大)

Gateway プロキシ宛てのトラフィックが Envoy をホストする VM に転送されるようにルーティングを設定します。Ingress サービスは、外部 HTTP(S) ロードバランサまたは内部 TCP/UDP ロードバランサとペア設定できますが、このような構成はデモ設定には含まれません。

このガイドでは、ゲートウェイ間の通信と、サービス間通信および Mesh のリソースについては説明しません。

前提条件

次のガイドの前提条件を満たしていることを確認してください。

ファイアウォール ルールの設定

このセクションでは、2 つのファイアウォール ルールを構成します。1 つのルールでは、Virtual Private Cloud ネットワークへのヘルスチェック プローブを許可します。もう 1 つのルールは、任意の送信元からネットワークへのトラフィックを許可します。

  1. ヘルスチェックを許可するようにファイアウォール ルールを構成します。

    gcloud compute firewall-rules create allow-gateway-health-checks \
      --network=${VPC_NAME} \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp \
      --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \
      --target-tags=gateway-proxy
    
  2. 任意の送信元からのトラフィックを許可するようにファイアウォール ルールを構成します。ポートと送信元 IP アドレス範囲のコマンドを編集します。

    gcloud compute firewall-rules create allow-gateway-ingress-traffic \
      --network=${VPC_NAME} \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp:80,tcp:443 \
      --source-ranges="0.0.0.0/0" \
      --target-tags=gateway-proxy
    

Identity and Access Management の権限を構成する

このセクションでは、ゲートウェイ プロキシのサービス アカウントを指定して、適切な IAM ロールを割り当てます。

  1. ゲートウェイ プロキシのサービス アカウント ID を作成します。

    gcloud iam service-accounts create gateway-proxy
    
  2. サービス アカウント ID に必要な IAM ロールを割り当てます。

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="serviceAccount:gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/trafficdirector.client"
    
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="serviceAccount:gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

Gateway リソースを構成する

このセクションでは、ゲートウェイ リソースを構成します。

  1. gateway80.yaml という名前のファイルで、HTTP トラフィック用の Gateway 仕様を作成します。

    cat <<EOF | tee gateway80.yaml
    name: gateway80
    scope: gateway-proxy
    ports:
    - 80
    type: OPEN_MESH
    EOF
    
  2. gateway80.yaml 仕様から Gateway リソースを作成します。

    gcloud alpha network-services gateways import gateway80 \
        --source=gateway80.yaml \
        --location=global
    

Envoy プロキシを使用したマネージド インスタンス グループを作成する

このセクションでは、Ingress ゲートウェイに関連付けられた Envoy プロキシを作成します。

  1. 自動的にデプロイされた Envoy サービス プロキシを実行する VM のインスタンス テンプレートを作成します。Envoy のスコープは gateway-proxy です。サービスを提供するポートを --service-proxy のパラメータとして渡さないでください。

    gcloud beta compute instance-templates create gateway-proxy \
      --machine-type=n1-standard-1 \
      --boot-disk-size=10GB \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=gateway-proxy \
      --network-interface=network=${VPC_NAME},no-address \
      --service-account="gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \
      --service-proxy=enabled,scope=gateway-proxy \
    
  2. インスタンス テンプレートからリージョン マネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create gateway-proxies-${REGION} \
      --region=${REGION} \
      --size=2 \
      --template=gateway-proxy \
      --target-distribution-shape=EVEN
    
  3. 名前付きポートを設定して、ネットワーク ロードバランサの TCP ヘルスチェックを有効にします。

    gcloud compute instance-groups managed set-named-ports \
      gateway-proxies-${REGION} \
      --region=${REGION} \
      --named-ports=healthz:80
    
  4. インスタンス グループの自動スケーリングを有効にします。

    gcloud compute instance-groups managed set-autoscaling \
      gateway-proxies-${REGION} \
      --region=${REGION} \
      --cool-down-period=60 \
      --min-num-replicas=3 \
      --max-num-replicas=10 \
      --mode=on \
      --target-cpu-utilization=0.6
    

リージョン ネットワーク負荷分散を設定する

このセクションでは、ネットワーク ロードバランサ、バックエンド サービス、転送ルール、ヘルスチェックを作成します。

  1. ネットワーク ロードバランサを作成する。

    gcloud compute addresses create xnlb-${REGION} \
      --region=${REGION}
    
  2. ネットワーク ロードバランサ用に予約されている IP アドレスを取得します。

    export IP_ADDRESS=$(gcloud compute addresses describe xnlb-${REGION} \
      --region=${REGION} --format='value(address)')
    
  3. ゲートウェイ プロキシのヘルスチェックを作成します。

    gcloud compute health-checks create tcp xnlb-${REGION} \
      --region=${REGION} \
      --port-name=healthz
    
  4. ゲートウェイ プロキシのバックエンド サービスを作成します。

    gcloud compute backend-services create xnlb-${REGION} \
      --health-checks=xnlb-${REGION} \
      --health-checks-region=${REGION} \
      --load-balancing-scheme=EXTERNAL \
      --protocol=TCP \
      --region=${REGION} \
      --port-name=healthz
    
  5. マネージド インスタンス グループをバックエンドとして追加します。

    gcloud compute backend-services add-backend xnlb-${REGION} \
      --instance-group=gateway-proxies-${REGION} \
      --instance-group-region=${REGION} \
      --region=${REGION}
    
  6. ゲートウェイ プロキシを指す転送ルールを作成します。

    gcloud compute forwarding-rules create xnlb-${REGION} \
      --region=${REGION} \
      --load-balancing-scheme=EXTERNAL \
      --address=${IP_ADDRESS} \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=xnlb-${REGION} \
      --backend-service-region=${REGION}
    

HTTP サーバーを構成する

このセクションでは、サービス メッシュにテストサービスを作成します。

  1. netcat ユーティリティを使用して、ポート 10000 でテストサービスを含むインスタンス テンプレートを作成します。

    gcloud compute instance-templates create tcp-td-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=allow-health-checks \
      --image-family=debian-9 \
      --image-project=debian-cloud \
      --metadata=startup-script="#! /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"
    
  2. 作成したテンプレートに基づいて、マネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create tcp-td-mig-us-east1 \
      --zone=us-east1-a \
      --size=1 \
      --template=tcp-td-vm-template
    
  3. HTTP ヘルスチェックを作成します。

    gcloud compute health-checks create http helloworld-health-check
    
  4. ネットワーク内のインスタンスへの受信ヘルスチェック接続を許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create tcp-vm-allow-health-checks \
       --network default \
       --action allow \
       --direction INGRESS \
       --source-ranges 35.191.0.0/16,209.85.152.0/22,209.85.204.0/22 \
       --target-tags allow-health-checks \
       --rules tcp:80
    
  5. INTERNAL_SELF_MANAGED の負荷分散方式でグローバル バックエンド サービスを作成し、ヘルスチェックをアタッチします。

    gcloud compute backend-services create tcp-helloworld-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --protocol=HTTP \
        --health-checks helloworld-health-check
    
  6. マネージド インスタンス グループをバックエンド サービスに追加します。

    gcloud compute backend-services add-backend tcp-helloworld-service \
      --instance-group td-mig-us-east1 \
      --instance-group-zone us-east1-a \
      --global
    

HTTPRoute でルーティングを設定する

これで、Traffic Director の Gateway リソースとサービスの構成が完了しました。次に、ホスト名をバックエンド サービスに関連付ける HTTPRoute リソースを使用して接続します。HTTPRouteGateway も参照します。

  1. http_route.yaml という名前のファイルで、HTTPRoute 仕様を作成します。この仕様では、先ほど作成した Gateway リソースである gateway80 を参照し、バックエンド サービス http-helloworld-service を指しています。

    name: helloworld-http-route
    hostnames:
    - helloworld-gce
    gateways:
    - projects/$PROJECT_NUMBER/locations/global/gateways/gateway80
    rules:
    - action:
      destinations:
       - serviceName: "projects/$PROJECT_NUMBER/locations/global/backendServices/http-helloworld-service"
    
  2. http_route.yaml の仕様を使用して HTTPRoute リソースを作成します。

    gcloud alpha network-services http-routes import helloworld-http-route \
        --source=http_route.yaml \
        --location=global
    
  3. ネットワーク ロードバランサと Traffic Director Gateway を介して、外部クライアントからサービスにアクセスできることを確認します。

    curl -H "Host: helloworld-gce" ${IP_ADDRESS}