すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASMイングレスゲートウェイへのHTTP/3を使用したアクセス

最終更新日:Jan 13, 2025

HTTP/3は、HTTPプロトコルの3番目のメジャーバージョンです。 HTTP/1.1およびHTTP/2とは異なり、HTTP/3はトランスポート層で従来のTCPプロトコルを使用せず、UDPベースのQuick UDP Internet Connections(QUIC)プロトコルを採用しています。 この変更により、HTTP/3は低レイテンシ、より堅牢なエラーリカバリ、およびより効率的な接続多重化を実現できます。 このトピックでは、ASMゲートウェイでHTTP/3ベースのサービスを構成する方法について説明します。

背景情報

HTTP/3は、トランスポートメカニズムとしてUDP over QUICを使用するため、HTTP/2と比較して次の利点があります。

  • ハンドシェイクレイテンシの短縮: HTTP/3は、QUICプロトコルの0-RTT機能を使用して接続確立を完了します。 (RTTはラウンドトリップタイムの略です。)さらに、TLSはQUICに統合されており、同時暗号化とハンドシェイクをサポートしているため、接続確立中のレイテンシが大幅に短縮されます。

  • 新しい多重化メカニズム: HTTP/2は、TCP層でのヘッドオブラインブロッキングに悩まされています。 HTTP/3はQUICを使用して、同じ接続で複数の独立したストリームを多重化し、データストリームは相互に独立しています。 1つのデータストリームのパケットが失われた場合でも、他のデータストリームの送信はブロックされません。 このように、単一のデータフローのブロッキングは、接続全体の伝送パフォーマンスに影響を与えなくなります。

  • 接続移行: HTTP/3は、Wi-Fiネットワークからモバイルネットワークへの切り替えなど、ネットワーク環境が変化した場合でも、異なるIPアドレス間の接続の移行をサポートします。 これにより、接続の継続性と安定性が確保されます。

  • セキュリティ: HTTP/3では、暗号化伝送にTLS 1.3の使用が義務付けられているため、より高いセキュリティとプライバシー保護が保証されます。

ASMゲートウェイはHTTP/3をサポートしています。 HTTP/3を使用して、ASMゲートウェイで公開されているサービスにアクセスし、サービスのパフォーマンスと安定性を向上させることができます。

前提条件

  • コンテナサービスKubernetes(ACK)クラスターがASMインスタンスに追加され、ASMインスタンスのバージョンが1.16以降であること。 詳細については、「ASMインスタンスへのクラスターの追加」をご参照ください。

  • イングレスゲートウェイがデプロイされていること。 詳細については、「イングレスゲートウェイの作成」をご参照ください。

  • HTTPBinアプリケーションがデプロイされていること。 詳細については、「HTTPBinアプリケーションのデプロイ」をご参照ください。

  • ACKクラスターのバージョンが1.24以降であること。 Cloud Controller Manager(CCM)コンポーネントのバージョンが2.6.0以降であること。

  • aliyun.com.certという名前の証明書がASMインスタンスに作成されていること。 詳細については、「ASMの証明書管理機能の使用」をご参照ください。

手順 1: HTTP/3を有効にする

  1. ASMコンソール にログインします。 左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションペインで、[ASMインスタンス] > [基本情報] を選択します。

  3. [基本情報] ページの右上隅にある [設定] をクリックします。 [設定の更新] パネルで、[HTTP/3を有効にする] を選択します。

手順 2: ASMイングレスゲートウェイでUDPリスナーを有効にする

QUICプロトコルはUDPに基づいています。 したがって、ASMイングレスゲートウェイでUDPリスナーを有効にする必要があります。

この例では、ASMイングレスゲートウェイのYAML構成を変更して、ASMイングレスゲートウェイのポート 444 でUDPリスナーを有効にすることができます。

apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  labels:
    asm-gateway-type: ingress
  name: ingressgateway
  namespace: istio-system
spec:
  ......
  ports:
    - name: http-0
      port: 80
      protocol: HTTP
      targetPort: 80
    -name: udp # ポート 444 で UDP リスナーを有効にします。
      port: 444
      protocol: UDP
      targetPort: 444
  ......
説明

ASMゲートウェイは、同じポートでTCPリスナーとUDPリスナーの両方をサポートしています。 たとえば、HTTPSサービスを公開するために使用されるポート 443 にUDPリスナーを追加できます。 2つのリスナーは互いに競合しません。

手順 3: Istioゲートウェイを構成する

QUICはTLS通信を強制します。 したがって、Istioゲートウェイの証明書を構成する必要があります。 次のYAMLファイルを使用して、Istioゲートウェイの構成を更新します。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: httpbin
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - '*'
      port:
        name: test
        number: 80
        protocol: HTTP
    - hosts:
      - '*'
      port:
        name: quic
        number: 444
        protocol: HTTPS
      tls:
        credentialName: aliyun.com.cert
        mode: SIMPLE

手順 4: HTTP/3を使用してASMゲートウェイにアクセスするテストを実行する

curlは一般的なHTTPテストツールです。 ただし、curlコマンドはデフォルトではHTTP/3をサポートしていません。 次のコマンドを実行して、curlがHTTP/3をサポートしているかどうかを確認できます。

curl --version | grep http3

次のような出力が表示された場合、現在の環境のcurlコマンドはHTTP/3をサポートしています。

curl 8.9.0-DEV (aarch64-apple-darwin23.5.0) libcurl/8.9.0-DEV quictls/3.1.4 zlib/1.2.12 libidn2/2.3.7 nghttp2/1.59.0 ngtcp2/1.2.0 nghttp3/1.1.0

出力が表示されない場合、現在の環境のcurlコマンドはHTTP/3をサポートしていません。 HTTP/3をサポートするバージョンのcurlを再構築できます。 詳細については、「Build with quictls」をご参照ください。

ビルドが完了したら、次のコマンドを実行してHTTP/3がサポートされているかどうかをテストできます。

curl -k --http3-only -H Host:aliyun.com --resolve aliyun.com:444 :${ASM ゲートウェイの IP アドレス} https://aliyun.com:444/headers -v

期待される出力:

......
* Connected to aliyun.com (xxx.xx.xx.x) port 444
* using HTTP/3
* [HTTP/3] [0] OPENED stream for https://aliyun.com:444/headers
* [HTTP/3] [0] [:method: GET]
* [HTTP/3] [0] [:scheme: https]
* [HTTP/3] [0] [:authority: aliyun.com]
* [HTTP/3] [0] [:path: /headers]
* [HTTP/3] [0] [user-agent: curl/8.9.0-DEV]
* [HTTP/3] [0] [accept: */*]
> GET /headers HTTP/3
> Host:aliyun.com
> User-Agent: curl/8.9.0-DEV
> Accept: */*
>
* Request completely sent off
* old SSL session ID is stale, removing
< HTTP/3 200
< server: istio-envoy
< date: Wed, 26 Jun 2024 07:40:07 GMT
< content-type: application/json
< content-length: 460
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 1
< alt-svc: h3=":444"; ma=86400
<
{
  "headers": {
    "Accept": "*/*",
    "Host": "aliyun.com",
    "Transfer-Encoding": "chunked",
    "User-Agent": "curl/8.9.0-DEV",
    "X-Envoy-Attempt-Count": "1",
    "X-Envoy-External-Address": "xx.xx.xx.xx",
    "X-Forwarded-Client-Cert": "xxxxxxx"
  }
}
* Connection #0 to host aliyun.com left intact

関連情報

  • HTTP/2のTCP層でのヘッドオブラインブロッキングが軽減できるだけで完全に回避できない理由の詳細については、「Hypertext Transfer Protocol Version 2 (HTTP/2)」をご参照ください。

  • HTTP/3は、ヘッドオブラインブロッキングの問題を根本的に解決する新しい多重化メカニズムを導入しています。 公式ドキュメントでは、ヘッドオブラインブロッキングを回避することで接続パフォーマンスを向上させる方法についても言及しています。 詳細については、「QUIC: A UDP-Based Multiplexed and Secure Transport」をご参照ください。