Cloud Service Mesh に IPv6 デュアルスタックを構成する

このページでは、Traffic Director(TD)プロキシベースのロードバランサを使用して Cloud Service Mesh で IPv6 トラフィックをロード バランシングする方法、IPv4 ベースのデプロイからデュアルスタック(IPv4 と IPv6)デプロイに移行する方法、デュアルスタックから IPv4 に移行する方法について説明します。

デュアルスタックのデプロイでは、サービス バックエンドに IPv4 と IPv6 のどちらを送信するかを指定できます。プロキシまたは gRPC クライアントは、優先順位に沿って各データパスをテストし、優先順位とサポートされているものに一致するデータパスを選択します。

デュアルスタック機能は、C++ と Python では gRPC 1.66.1 以降、Node では 1.12 以降、Go では 1.71 以降でサポートされています。Java は現時点ではサポートされていません。

デュアルスタックがサポートされていないバージョンの gRPC(Go と他の言語の 1.66 より前のバージョン)では、TD から送信された順序で、各エンドポイントの最初のアドレスのみが使用されます。

始める前に

このガイドは、以下を完了されていることを前提としています。

IPv6 バックエンド サービスを設定する

このセクションでは、次の構成を行います。

  • 2 つのバックエンド グループ(インスタンス グループ、マネージド インスタンス グループ、ネットワーク エンドポイント グループのいずれか)を、同じリージョン内の 2 つの異なるゾーンに 1 つずつ配置します。
  • 各バックエンド グループに 2 つの VM インスタンス。
  • インスタンスの正常性をチェックするヘルスチェック
  • ヘルスチェックがバックエンドに到達できるようにするファイアウォール ルール。
  • バックエンド サービス
  • 構成された 2 つのバックエンド グループを含むバックエンド サービス。

バックエンドのサブネットを設定する

次のコマンドは、IPv4 と IPv6 の両方の内部アドレス範囲を割り当て、サブネット上の VM にどちらのアドレスタイプでも割り当てることができます。

カスタムモードのサブネットのみがサポートされます。自動モードはサポートされていません。VPC ネットワーク全体をカスタムモードに切り替えて、IPv6 バックエンド(MIG または NEG)を入力できます。

  1. デュアルスタック ネットワークを作成します。

    gcloud compute networks create NETWORK \
        --subnet-mode=custom \
        --enable-ula-internal-ipv6
    
  2. バックエンド VM 用のデュアルスタック サブネットを作成します。

    gcloud compute networks subnets create SUBNET \
        --network=NETWORK \
        --range=PRIMARY_IPv4_RANGE \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=IPv6_ACCESS_TYPE \
        --region=REGION
    

    次のように置き換えます。

    • SUBNET: 新しいサブネットの名前。
    • NETWORK: 新しいサブネットが追加される VPC ネットワークの名前。
    • PRIMARY_IPv4_RANGE: 新しいサブネットのプライマリ IPv4 範囲(CIDR 表記)。詳細については、IPv4 サブネットの範囲をご覧ください。
    • IPv6_ACCESS_TYPE: IPv6 アクセスタイプ。EXTERNAL または INTERNAL のいずれかです。
    • REGION: 新しいサブネットが作成される Google Cloud リージョン。

バックエンドを設定する

マネージド インスタンス グループ(MIG)非マネージド インスタンス グループ、またはネットワーク エンドポイント グループ(NEG)のいずれかを使用できます。

MIG

  1. dual-stack-gateway-template を使用してマネージド インスタンス グループを作成します。

    gcloud alpha compute instance-templates create dual-stack-gateway-template \
    --region=REGION \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=dual-stack-http-server \
    --network=NETWORK \
    --subnet=SUBNET \
    --stack-type=IPV4_IPV6 \
    --service-proxy=enabled,scope=gateway-proxy
    
  2. ゲートウェイ プロキシのマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create dual-stack-ZONE-gateway-mig \
    --zone=ZONE \
    --size=1 \
    --template=dual-stack-gateway-template
    
  3. バックエンド マネージド インスタンス グループを作成します。

    gcloud compute instance-templates create dual-stack-backend-template \
      --region=REGION \
      --image-family=debian-12 \
      --image-project=debian-cloud \
      --tags=dual-stack-http-server \
      --network=NETWORK \
      --subnet=SUBNET \
      --stack-type=IPV4_IPV6 \
      --metadata=startup-script="#! /bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype <html><body><h1>'\`dual-stack-server\`'</h1></body></html>' | sudo tee /var/www/html/index.html"
    
    gcloud compute instance-groups managed create dual-stack-ZONE-backend-mig \
    --zone=ZONE \
    --size=1 \
    --template=dual-stack-backend-template
    
  4. マネージド インスタンス グループに名前付きポートを追加する

    gcloud compute instance-groups set-named-ports us-ig-1 \
      --named-ports http:80 \
      --zone ZONE \
    
    gcloud compute instance-groups set-named-ports us-ig-2 \
      --named-ports http:80 \
      --zone ZONE
    

    ロード バランシングと自動修復には、それぞれ別のヘルスチェックを使用します。ロード バランシングのヘルスチェックは、VM がユーザー トラフィックを受信しているかどうか、必要に応じてトラフィックを迅速にリダイレクトするかどうかを判断するため、通常はより積極的に構成されます。

    自動修復のヘルスチェックでは、障害が発生している VM が Compute Engine によってプロアクティブに置き換えられるので、このヘルスチェックはロード バランシングのヘルスチェックより慎重に実施しなければなりません。デュアルスタック VM の自動修復は、IPv4 ヘルスチェックに基づいて行われます。

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

    gcloud compute health-checks create http dualstack-health-check-http \
    
  6. ファイアウォール ルールでヘルスチェックが許可されていることを確認します。

    IPv4

    gcloud compute firewall-rules create dual-stack-allow-ipv4-health-check \
    --network=NETWORK \
    --action=ALLOW \
    --direction=INGRESS \
    --source-ranges=35.191.0.0/16,130.211.0.0/22 \
    --target-tags=dual-stack-http-server \
    --rules=tcp:22,80
    

    IPv6

    gcloud compute firewall-rules create dual-stack-allow-ipv6-health-check \
    --network=NETWORK \
    --action=ALLOW \
    --direction=INGRESS \
    --source-ranges=::/0 \
    --target-tags=dual-stack-http-server \
    --rules=tcp:22,80
    
  7. MIG の自動修復ポリシーを構成して、ヘルスチェックを適用します。

    gcloud compute instance-groups managed update us-mig-1 \
      --health-check dualstack-health-check-http \
      --initial-delay 300 \
      --zone us-central1-a
    

初期遅延設定を行うと、VM が起動中の場合、自動修復が遅延され、VM が早期に再作成されることを防ぎます。初期遅延タイマーは、VM の currentAction フィールドが VERIFYING に変わると開始されます。

非マネージド インスタンス グループ

  1. インスタンス グループを構成します。

    gcloud compute instance-groups unmanaged create us-ig-1 \
    --zone us-central1-a \
    
    gcloud compute instance-groups unmanaged create us-ig-2 \
    --zone us-central1-b
    
  2. 各インスタンス グループに 2 つのデュアルスタック VM インスタンスを作成します。

    gcloud compute instances create inst-us-central1-1 \
    --image-family debian-12 \
    --image-project debian-cloud \
    --tags network-lb \
    --zone us-central1-a \
    --network-interface [--network=NETWORK | --subnet=SUBNET] \
    --stack-type=IPV4_IPV6 \
    
    gcloud compute instances create inst-us-central1-2 \
    --image-family debian-12 \
    --image-project debian-cloud \
    --tags network-lb \
    --zone us-central1-a \
    --network-interface [--network=NETWORK | --subnet=SUBNET] \
    --stack-type=IPV4_IPV6 \
    
    gcloud compute instances create inst-us-central1-3 \
    --image-family debian-12 \
    --image-project debian-cloud \
    --tags network-lb \
    --zone us-central1-b \
    --network-interface [--network=NETWORK | --subnet=SUBNET] \
    --stack-type=IPV4_IPV6 \
    
    gcloud compute instances create inst-us-central1-4 \
    --image-family debian-12 \
    --image-project debian-cloud \
    --tags network-lb \
    --zone us-central1-b \
    --network-interface [--network=NETWORK | --subnet=SUBNET] \
    --stack-type=IPV4_IPV6
    

    IPv6 アドレスは自動的に割り当てられます。

  3. VM をインスタンス グループに追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig-1 \
    --instances inst-us-central1-1,inst-us-central1-2 \
    --zone us-central1-a \
    
    gcloud compute instance-groups unmanaged add-instances us-ig-2 \
    --instances inst-us-central1-3,inst-us-central1-4 \
    --zone us-central1-b
    

NEG

  1. --network-endpoint-type が GCE_VM_IP_PORT のバックエンドを追加します。

    gcloud compute network-endpoint-groups create us-neg-lb-1 \
      --network=NETWORK SUBNET \
      --zone=us-central1-a --network-endpoint-type=GCE_VM_IP_PORT \
    
    gcloud compute network-endpoint-groups create us-neg-lb-2 \
      --network=NETWORK SUBNET \
      --zone=us-central1-b  --network-endpoint-type=GCE_VM_IP_PORT
    
  2. ネットワーク エンドポイント グループにエンドポイントを追加します。

    gcloud compute network-endpoint-groups update us-neg-lb-1 \--zone=us-central1-a \
    --add-endpoint 'instance=inst-us-central1-1,ip=IPV4_ADRS_1, ipv6=IPV6_ADRS_1,port=80' \
    --add-endpoint 'instance=inst-us-central1-2,ip=IPV4_ADRS_2, ipv6=IPV6_ADRS_2,port=80' \
    
    gcloud compute network-endpoint-groups update us-neg-lb-2 --zone=us-central1-b \
    --add-endpoint 'instance=inst-us-central1-3,ip=IPV4_ADRS_3, ipv6=IPV6_ADRS_3,port=80' \
    --add-endpoint 'instance=inst-us-central1-4,ip=IPV4_ADRS_4,ipv6=IPV6_ADRS_4,port=80'
    

ヘルスチェックを構成する

  1. バックエンド サービスのヘルスチェックを作成します。

      gcloud compute health-checks create http[s] my-health-check 
    --global
    --request-path '/'
    --port SERVICE_PORT

    SERVICE_PORT は、1~65535 のポート番号に置き換えます。

  2. ヘルスチェックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create allow-scan-probe \
        --action allow \
        --description "allow-scan-probe" \
        --rules tcp:SERVICE_PORT \
        --source-ranges 2600:2d00:1:b029::/64 \
        --priority 10 \
        --network=NETWORK
    

2600:2d00:1:b029::/64 の範囲は、VM の状態をプローブするヘルスチェッカーの送信元 IP アドレスに使用されます。2600:2d00:1:b029::/64 は、IPv6 ヘルスチェッカーの送信元 IP アドレスとして使用され、ネットワーク ロード バランシングのバックエンド VM のヘルスをプローブします。

Backends を使用してバックエンド サービスを作成して更新する

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

    gcloud compute backend-services create my-backend-service \
    --ip-address-selection-policy PREFER_IPV6  \
    --global \
    --health-checks my-health-check \
    --load-balancing-scheme=INTERNAL_SELF_MANAGED \
    --timeout=5m
    
  2. バックエンド サービスにバックエンドを追加します。

    gcloud compute backend-services add-backend my-backend-service \
    --instance-group us-ig-1 \
    --instance-group-zone us-central1-a \
    --global \
    
    gcloud compute backend-services add-backend my-backend-service \
    --instance-group us-ig-2 \
    --instance-group-zone us-central1-b \
    --global
    

Cloud Service Mesh サービスを設定する

このセクションでは、Traffic Director で IPv6 サービスを構成する方法について説明します。このサービスは、Service Mesh 構成の一部である場合もあれば、Envoy を実行する VM などの Service Gateway の構成に使用される場合もあります。

PREFER_IPV6 を含むバックエンド サービスが構成されたので、AppNet ゲートウェイ リソースを作成できます。

ゲートウェイ リソースを作成する

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

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

    gcloud network-services gateways import dual-stack-gateway \
      --source=dual-stack-gateway.yaml \
      --location=global
    

HTTPRoute を使用してルーティングを設定する

  1. dual-stack-http_route.yaml という名前のファイルで、HTTPRoute 仕様を作成します。

    cat <<EOF | tee dual-stack-http-route.yaml
    name: dual-stack-http-route
    hostnames:
    - dual-stack-server
    gateways:
    - projects/PROJECT_ID/locations/global/gateways/dual-stack-gateway
    rules:
    - action:
        destinations:
        - serviceName: "projects/PROJECT_ID/locations/global/backendServices/dual-stack-backend-service"
    EOF
    
  2. dual-stack-http-route.yaml の仕様を使用して HTTPRoute リソースを作成します。

    gcloud network-services http-routes import dual-stack-http-route \
      --source=dual-stack-http-route.yaml \
      --location=global
    
  3. エンドツーエンドの接続性を確認するには、ゲートウェイ MIG から VM に SSH 接続し、次のコマンドを実行します。

    curl -H 'Host: dual-stack-server' http://[::]
    

    出力は次のようになります。

    <!doctype <html><body><h1>'`dual-stack-server`'</h1></body></html>
    

IPv4 からデュアルスタックに移行する

IPv4 からデュアルスタックに移行するには、次の前提条件を満たす必要があります。

  • 既存の単一スタック VM インスタンス グループ us-ig-1us-ig-2 と、既存の VM を含む IPV4_ONLY スタック
  • us-ig-1us-ig-2 を指す単一の IPv4 バックエンド サービス my-ipv4-backend-service
  • IPV4_ONLY VM サブネット
  • IPv4 バージョン アドレスで構成されたゲートウェイ リソース

サブネットをデュアルスタックにアップグレードする

バックエンドの既存のサブネットを更新して IPv6 をサポートします。

gcloud compute networks subnets update SUBNET \
  --stack-type IPV4_IPV6 \
  --ipv6-access-type=IPv6_ACCESS_TYPE \

次のように置き換えます。

  • SUBNET: 新しいサブネットの名前。
  • IPv6_ACCESS_TYPE: IPv6 アクセスタイプ。EXTERNAL または INTERNAL のいずれかです。

各 VM をデュアルスタックにアップグレードする

gcloud compute instances network-interfaces update EXISTING_VM_NAME \
  --stack-type=IPV4_IPV6 \
  --zone=us-central1

EXISTING_VM_NAME は、既存の VM の名前に置き換えます。

各インスタンス グループに新しいデュアルスタック VM を追加する

  1. 新しい VM インスタンスを作成します。

    gcloud compute instances create my-new-vm-1 \
      --image-family debian-12 \
      --tags network-lb \
      --zone us-central1-a \
      --network-interface [--network=NETWORK | --subnet=SUBNET] \
      --stack-type=IPV4_IPV6 \
    
    gcloud compute instances create my-new-vm-2 \
      --image-family debian-12 \
      --tags network-lb \
      --zone us-central1-b \
      --network-interface [--network=NETWORK | --subnet=SUBNET] \
      --stack-type=IPV4_IPV6
    
  2. 新しいインスタンスをインスタンス グループに追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig-1 \
      --instances my-new-vm-1 \
      --zone us-central1-a \
    
    gcloud compute instance-groups unmanaged add-instances us-ig-2 \
      --instances my-new-vm-2 \
      --zone us-central1-b
    
  3. IPv6 バックエンド サービスを作成します。

    gcloud compute backend-services create dual-stack-backend-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --protocol=HTTP \
      --health-checks=dual-stack-health-check-http \
      --ip-address-selection-policy=PREFER_IPV6
    
  4. 更新した Instance-Group を新しく作成したデュアルスタック バックエンド サービスに追加します。

    gcloud compute backend-services add-backend dual-stack-backend-service \
      --instance-group=us-ig-1 \
      --instance-group-zone=ZONE \
      --global
    
    gcloud compute backend-services add-backend dual-stack-backend-service \
      --instance-group=us-ig-2 \
      --instance-group-zone=ZONE \
      --global
    

デュアルスタックから IPv4 に移行する

デュアルスタックから IPv4 に移行するには、次の前提条件を満たす必要があります。

  • 既存の VM を含む IPV4_IPV6 スタックを持つ既存のデュアルスタック VM インスタンス グループ us-ig-1us-ig-2
  • us-ig-1us-ig-2 を指す単一の IPv6 バックエンド サービス my-ipv6-backend-service
  • IPV4_IPV6 VM サブネット
  • ゲートウェイ リソース

各 VM を IPv4 にダウングレードする

gcloud compute instances network-interfaces update EXISTING_VM_NAME \
  --stack-type=IPV4_ONLY \
  --zone=us-central1

各インスタンス グループに新しい IPv4 スタック VM を追加する

  1. 新しい VM インスタンスを作成します。

    gcloud compute instances create my-new-vm-1 \
      --image-family debian-12 \
      --tags network-lb \
      --zone us-central1-a \
      --network-interface [--network=NETWORK | --subnet=SUBNET] \
      --stack-type=IPV4_ONLY \
    
    gcloud compute instances create my-new-vm-2 \
      --image-family debian-12 \
      --tags network-lb \
      --zone us-central1-b \
      --network-interface [--network=NETWORK | --subnet=SUBNET] \
      --stack-type=IPV4_ONLY
    
  2. 新しいインスタンスをインスタンス グループに追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig-1 \
      --instances my-new-vm-1 \
      --zone us-central1-a \
    
    gcloud compute instance-groups unmanaged add-instances us-ig-2 \
      --instances my-new-vm-2 \
      --zone us-central1-b
    
  3. IPv4 バックエンド サービスを作成します。

    gcloud compute backend-services create my-ipv4-backend-service \
      –ip-address-selection-policy IPV4_ONLY \
      --global \
      --health-checks my-health-check \
      --load-balancing-scheme INTERNAL_SELF_MANAGED \
      --timeout=5m
    
  4. 更新した Instance-Groups を新しく作成した IPv4 バックエンド サービスに追加します。

    gcloud compute backend-services add-backend my-ipv4-backend-service \
      --instance-group us-ig1 \
      --instance-group-zone us-central1-a \
      --global \
    
    gcloud compute backend-services add-backend my-ipv4-backend-service \
      --instance-group us-ig2 \
      --instance-group-zone us-central1-b \
      --global
    

    これで、IPv4 バックエンド サービスと IPv6 バックエンド サービスの両方がトラフィックを処理できるようになりました。URL マップを更新して、クライアント トラフィックの一部を新しい IPv4 バックエンド サービスに転送します。