HTTP/3 はトランスポート層で TCP を QUIC プロトコルに置き換え、ヘッドオブラインブロッキングを解消し、接続レイテンシをゼロラウンドトリップ(0-RTT)まで低減します。また、Wi-Fi からモバイル回線への切り替えなどネットワーク環境の変化に対しても接続を維持できます。Service Mesh(ASM)ゲートウェイは HTTP/3 をサポートしているため、QUIC を介してサービスを公開することで、モバイル環境や遅延の影響を受けやすいワークロードにおけるサービスのパフォーマンスおよび安定性を向上させることができます。
| 機能 | HTTP/2(TCP) | HTTP/3(QUIC/UDP) |
|---|---|---|
| ハンドシェイクレイテンシ | TCP ハンドシェイク + 別途実行される TLS ハンドシェイク | QUIC に組み込まれた TLS 1.3 を用いた 0-RTT 接続確立 |
| 多重化 | 複数のストリームが 1 つの TCP 接続を共有;1 つのパケット損失によりすべてのストリームがブロックされる | 独立した QUIC ストリーム;1 つのストリームでのパケット損失は他のストリームをブロックしない |
| 接続移行 | クライアント IP アドレスが変更された場合(例:Wi-Fi からモバイル回線への切り替え)に接続が切断される | IP/ポートのタプルではなく接続 ID を用いるため、IP アドレスの変更にもかかわらず接続を維持可能 |
| セキュリティ | 一部の実装では TLS が任意 | すべての接続で TLS 1.3 の使用が必須 |
本ガイドでは、ASM イングレスゲートウェイにおける HTTP/3 の有効化、QUIC トラフィック向け UDP リスナーの追加、TLS の構成、および curl を用いた接続確認手順について説明します。
前提条件
Container Service for Kubernetes(ACK)クラスター(v1.24 以降)が追加済みの ASM インスタンス(v1.16 以降)。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
ACK クラスター内に Cloud Controller Manager(CCM)コンポーネントがインストール済みで、バージョンが 2.6.0 以降であること
イングレスゲートウェイがデプロイ済みであること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
HTTPBin サンプルアプリケーションがデプロイ済みであること。詳細については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
ASM インスタンス向けに
aliyun.com.certという名前の TLS 証明書が作成済みであること。詳細については、「ASM の証明書管理機能の利用」をご参照ください。
ステップ 1:ASM コンソールで HTTP/3 を有効化
-
ASM コンソールにログインします。左側ナビゲーションウィンドウで、 を選択します。
-
Mesh 管理 ページで、ASM インスタンスの名前をクリックします。左側ナビゲーションウィンドウで、 を選択します。
基本情報 ページの右上隅にある 設定項目 をクリックします。
設定更新パネルで、HTTP/3 の有効化 を選択します。
ステップ 2:イングレスゲートウェイに UDP リスナーを追加
QUIC は UDP 上で動作します。HTTP/3 トラフィックを受信するには、既存の TCP リスナーに加えて、イングレスゲートウェイに UDP リスナーを追加する必要があります。
IstioGateway リソースを編集して UDP ポートを追加します。以下の例では、ポート 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
# QUIC トラフィック向け UDP リスナーを追加。
# ASM は同一ポート上で TCP および UDP リスナーをサポートしているため、
# HTTPS リスナーと同一ポート(例:443)を使用できます。
- name: udp
port: 444
protocol: UDP
targetPort: 444
......ASM は同一ポート上で TCP および UDP リスナーをサポートしています。たとえば、ポート 443 で既に TCP 上の HTTPS サービスが提供されている場合でも、QUIC トラフィック向けにポート 443 の UDP リスナーを追加できます(競合しません)。
ステップ 3:Istio ゲートウェイの TLS 構成
QUIC では TLS 1.3 の使用が必須です。QUIC ポート向けに Istio ゲートウェイに TLS 証明書を構成するには、以下の Gateway リソースを適用します。
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: httpbin
namespace: default
spec:
selector:
istio: ingressgateway
servers:
# ポート 80 上の HTTP リスナー
- hosts:
- '*'
port:
name: test
number: 80
protocol: HTTP
# ポート 444 上の QUIC/HTTP3 リスナー(TLS 構成付き)。
# QUIC が TLS 終端を必要とするため、
# ゲートウェイが TLS を終端するよう protocol を HTTPS に設定します。
- hosts:
- '*'
port:
name: quic
number: 444
protocol: HTTPS
tls:
# 前提条件で作成した証明書を参照します。
credentialName: aliyun.com.cert
mode: SIMPLEこの構成を適用すると、ゲートウェイは自動的に HTTP 応答に Alt-Svc レスポンスヘッダー(例:alt-svc: h3=":444"; ma=86400)を付与します。ブラウザおよび HTTP クライアントはこの Alt-Svc ヘッダーを用いて HTTP/3 の可用性を検出し、後続のリクエストを QUIC へアップグレードします。これは、インターネット向けサービスが HTTP/3 をアドバタイズする標準的な方法です。クライアントが明示的に HTTP/3 向けに構成済みの内部サービスでは、このヘッダーは情報提供のみを目的としています。
ステップ 4:HTTP/3 接続の確認
curl の HTTP/3 対応状況の確認
ほとんどのデフォルト curl インストールでは HTTP/3 が有効になっていません。ご利用の curl バイナリが HTTP/3 をサポートしているか確認してください。
curl --version | grep http3出力に 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」をご参照ください。
テストリクエストの送信
<IP-address-of-ASM-gateway> をご利用の ASM イングレスゲートウェイの外部 IP アドレスに置き換えてください。
curl -k --http3-only \
-H Host:aliyun.com \
--resolve aliyun.com:444:<IP-address-of-ASM-gateway> \
https://aliyun.com:444/headers -v成功した応答では、using HTTP/3 および HTTP/3 200 ステータスが表示されます。
......
* 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 intactalt-svc: h3=":444"; ma=86400 ヘッダーは、ゲートウェイに HTTP/3 の可用性があることを示します。ブラウザおよび互換クライアントは、このヘッダーを使用して後続のリクエストで HTTP/3 を検出し、自動的にアップグレードします。
関連ドキュメント
Hypertext Transfer Protocol Version 2(HTTP/2) — HTTP/2 における TCP レイヤーの head-of-line ブロッキング
QUIC:UDP ベースの多重化・セキュアなトランスポート — QUIC トランスポート仕様および多重化メカニズム