モバイルネットワークなどの不安定なネットワーク環境、またはオンラインゲームやストリーミングメディアサービスなど低遅延が求められるシナリオでは、HTTP/3 対応の QUIC リスナーを活用して、ネットワーク通信のパフォーマンスを向上させます。
仕組み
UDP を基盤とする QUIC プロトコルは、HTTP/3 の基盤です。多重化、0-RTT ハンドシェイク、効率的な輻輳制御アルゴリズム、シームレスな接続移行といった改善点を提供します。TCP 上の TLS に依存する HTTP/2 と比較して、QUIC を基盤とする HTTP/3 は、データの再送および通信遅延を大幅に削減し、ネットワークパフォーマンスを向上させます。QUIC の詳細については、「公式 QUIC ドキュメント」をご参照ください。
QUIC リスナーは、HTTPS リスナーと併用することも、単独で使用することもできます。それぞれの違いは以下のとおりです:
-
QUIC リスナーを単独で使用する場合:QUIC リスナーを作成後、Application Load Balancer (ALB) インスタンスはクライアントからの HTTP/3 プロトコルによるサービスアクセスを許可しますが、HTTP/2 などの従来の HTTP プロトコルはサポートされません。
-
QUIC リスナーと HTTPS リスナーを併用する場合:一部のクライアントが HTTP/1.1 や HTTP/2 を用いてサービスにアクセスする必要がある場合は、両方のリスナーを併用することで、複数の HTTP プロトコルとの互換性を確保できます。両方のリスナーを併用する場合、ALB インスタンスの動作は以下の図のとおりです。QUIC リスナーと HTTPS リスナーは同一ポートを監視し、同一の転送ルールセットを使用します。ALB インスタンスがクライアントリクエストを受信すると、まず QUIC リスナーを優先してバックエンドサービスへリクエストを転送します。クライアントが HTTP/3 をサポートしていない場合は、HTTPS リスナー経由でリクエストを転送します。
QUIC リスナーの構成
QUIC リスナーと HTTPS リスナーを併用する
前提条件
-
HTTPS 証明書を構成します。詳細については、「暗号化通信のための HTTPS 証明書の構成」をご参照ください。
-
kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1:AlbConfig で QUIC リスナーを作成する
-
以下のコマンドを実行して AlbConfig を編集します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> を AlbConfig の名前に置き換えます。 -
QUIC リスナーを作成し、HTTPS リスナーに
quicConfigフィールドを追加します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: #... spec: config: #... listeners: - port: 443 protocol: HTTPS certificates: - CertificateId: 756****-cn-hangzhou # 証明書の CertIdentifier IsDefault: true quicConfig: quicListenerId: "" # ここは現時点では空欄のままにしてください。次のステップで値を入力します。 quicUpgradeEnabled: false # この値を false に設定します。 - port: 443 protocol: QUIC # QUIC リスナー certificates: - CertificateId: 756****-cn-hangzhou # HTTPS リスナーと同じ証明書を使用します。 IsDefault: true重要上記の例では、AlbConfig 内での証明書の指定方法を示しています。QUIC リスナーは、自動検出証明書および Secret 証明書もサポートします。詳細については、「暗号化通信のための HTTPS 証明書の構成」をご参照ください。
ステップ 2:Ingress にアノテーションを追加する
Ingress リソースにアノテーションを追加し、Ingress が複数のリスナーに適用されるようにします。
-
以下のコマンドを実行して Ingress を編集します。
kubectl edit ingress <INGRESS_NAME> # <INGRESS_NAME> をご利用の Ingress の名前に置き換えます。 -
Ingress の
annotationsフィールドに、以下の内容を追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: #... annotations: alb.ingress.kubernetes.io/listen-ports: '[{"QUIC": 443},{"HTTPS": 443}]' # Ingress を QUIC リスナーおよび HTTPS リスナーの両方に適用します。 spec: #...
ステップ 3:リスナーを関連付ける
-
ALB コンソール にログインします。
-
インスタンス ページで、対象 ALB インスタンスの ID をクリックします。リスナー タブで、リスナープロトコル/ポート が「QUIC:443」であるリスナーを見つけ、その ID を記録します。
-
QUIC リスナー ID を AlbConfig に追加します。
-
以下のコマンドを実行して AlbConfig を編集します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> を AlbConfig の名前に置き換えます。 -
HTTPS リスナーの
quicListenerIdフィールドに QUIC リスナー ID を入力し、quicUpgradeEnabledフィールドの値をtrueに変更します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: #... spec: config: #... listeners: - port: 443 protocol: HTTPS certificates: - CertificateId: 756****-cn-hangzhou IsDefault: true quicConfig: quicListenerId: lsn-tnz740dr8p5h65**** # 具体的な QUIC リスナー ID。 quicUpgradeEnabled: true # この値を true に変更します。 - port: 443 protocol: QUIC # QUIC リスナー certificates: - CertificateId: 756****-cn-hangzhou IsDefault: true
-
-
リスナーが正しく関連付けられていることを確認します。
-
ALB コンソール にログインします。
-
インスタンス ページで、対象インスタンスの ID をクリックします。次に、インスタンスの詳細ページで リスナー タブをクリックします。最後に、リスナー一覧から対象の HTTPS リスナー名をクリックし、リスナーの詳細 タブで関連付けられた QUIC リスナーを確認します。
-
ステップ 4:結果の検証
ALB Ingress を通じて HTTP/3 プロトコルでサービスにアクセスし、構成を検証します。
以下のコマンドを実行して Ingress 情報を表示します。
kubectl get ingress期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE https-ingress https-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80, 443 83m次のステップで使用するため、
HOSTS列およびADDRESS列の値を記録します。-
以下のコマンドを実行して、HTTP/3 および従来の HTTPS を使用してサービスにアクセスします。前のステップで記録した値を、
demo.alb.ingress.topおよびalb-********.alb.aliyuncs.comにそれぞれ置き換えます。説明一部のバージョンの
curlは、デフォルトで HTTP/3 をサポートしていません。お使いの curl のバージョンが HTTP/3 をサポートしていることを確認してください。curl --http3 -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com以下の出力が返された場合、2 つのリスナーが正しく関連付けられており、複数の HTTP プロトコルとの互換性が確保されています。
old old
(任意)ステップ 5:リスナーの関連付けを解除する
-
以下のコマンドを実行して AlbConfig を編集します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> を AlbConfig の名前に置き換えます。 -
quicListenerIdフィールドを空欄にし、quicUpgradeEnabledフィールドの値を false に変更して保存・終了します。# ... (省略) port: 443 protocol: HTTPS quicConfig: quicListenerId: "" # QUIC リスナー ID を空欄に設定します。 quicUpgradeEnabled: false # この値を false に変更します。 requestTimeout: 0 # ... (省略)
QUIC リスナーを単独で使用する
前提条件
-
AlbConfig リソースを作成します。詳細については、「ALB Ingress を使用してサービスを公開する」をご参照ください。
-
kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1:AlbConfig で QUIC リスナーを作成する
-
以下のコマンドを実行して AlbConfig を編集します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> を AlbConfig の名前に置き換えます。 -
QUIC リスナーを作成します。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: #... spec: config: #... listeners: - port: 443 protocol: QUIC # QUIC リスナー certificates: - CertificateId: 756****-cn-hangzhou # 証明書の CertIdentifier IsDefault: true重要上記の例では、AlbConfig 内での証明書の指定方法を示しています。QUIC リスナーは、自動検出証明書および Secret 証明書もサポートします。詳細については、「暗号化通信のための HTTPS 証明書の構成」をご参照ください。
ステップ 2:サンプルリソースを作成する
-
ファイル名を `https-quickstart.yaml` として作成し、以下の内容をコピーして保存します。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: https-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb # これをご利用の AlbConfig リソースの名前に変更します。 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # 証明書に関連付けられたドメイン名に置き換えます。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix --- apiVersion: apps/v1 kind: Deployment metadata: name: https-deploy spec: replicas: 1 selector: matchLabels: app: https-deploy template: metadata: labels: app: https-deploy spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest imagePullPolicy: IfNotPresent name: https-deploy ports: - containerPort: 80 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: https-svc spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 80 selector: app: https-deploy sessionAffinity: None type: ClusterIP -
以下のコマンドを実行してリソースを作成します。
kubectl apply -f https-quickstart.yaml
ステップ 3:Ingress にアノテーションを追加する
Ingress リソースにアノテーションを追加し、Ingress が QUIC リスナーに適用されるようにします。
-
以下のコマンドを実行して Ingress を編集します。
kubectl edit ingress https-ingress -
Ingress の
annotationsフィールドに、以下の内容を追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: #... annotations: alb.ingress.kubernetes.io/listen-ports: '[{"QUIC": 443}]' # Ingress を QUIC リスナーに適用します。 spec: #...
ステップ 4:検証
以下のコマンドを実行して Ingress 情報を表示します。
kubectl get ingress期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE https-ingress https-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80, 443 83m次のステップで使用するため、
HOSTS列およびADDRESS列の値を記録します。-
以下のコマンドを実行して、HTTP/3 を使用してサービスにアクセスします。前のステップで記録した値を、
demo.alb.ingress.topおよびalb-********.alb.aliyuncs.comにそれぞれ置き換えます。説明一部のバージョンの
curlは、デフォルトで HTTP/3 をサポートしていません。お使いの curl のバージョンが HTTP/3 をサポートしていることを確認してください。curl --http3 -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com以下の出力が返された場合、QUIC リスナーの構成が正常に完了しています。
old
参考資料
-
Web サービスが頻繁に悪意ある攻撃を受ける、または強化されたセキュリティ保護が必要な場合は、ALB Web Application Firewall (WAF) インスタンスのエンハンスドエディションをご利用ください。詳細については、「エンハンスドエディションの ALB WAF インスタンスを用いたサービス保護」をご参照ください。
-
その他のリスナー構成については、「AlbConfig を使用した ALB リスナーの構成」をご参照ください。