全部產品
Search
文件中心

:使用QUIC監聽相容HTTP/3協議提高網路通訊效能

更新時間:Jun 19, 2024

在不穩定且多變的網路環境中(如移動網路),或在需要低延遲的情境下(如網路遊戲或流媒體服務),您可以使用QUIC監聽相容HTTP/3協議以提高網路通訊效能。

工作原理

基於UDP的QUIC協議是HTTP/3的核心,具有多工、0-RTT握手、高效擁塞控制演算法、無縫連結遷移等多種改進。相較於使用TLS+TCP的HTTP/2,基於QUIC的HTTP/3能顯著減少資料重傳和通訊延遲,從而提高網路通訊效能。關於QUIC的更多資訊,請參考QUIC官方文檔

QUIC監聽可以單獨使用,也支援與HTTPS監聽聯合使用,這兩種使用方法的區別如下:

  • 單獨使用QUIC監聽:在建立QUIC監聽後,ALB執行個體支援用戶端使用HTTP/3協議訪問服務。但是不支援更早的HTTP協議(如HTTP/2)。

  • 聯合使用QUIC與HTTPS監聽:如果部分用戶端需要使用HTTP/1.1或HTTP/2訪問服務,聯合使用兩種監聽可以保證對多種HTTP協議的相容。在聯合使用兩種監聽時,ALB執行個體的工作模式如下圖所示。QUIC監聽與HTTPS監聽同時監聽同一個連接埠,並且使用相同的一組轉寄規則。在接收用戶端訪問請求時,ALB執行個體會優先使用QUIC監聽將請求轉寄至後端服務。而當用戶端不支援HTTP/3協議時,ALB執行個體會通過HTTPS監聽進行轉寄。

配置QUIC監聽

聯合使用QUIC監聽與HTTPS監聽

前提條件

步驟一:在AlbConfig中建立QUIC監聽

  1. 執行以下命令編輯AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
  2. 建立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認證以實現加密通訊

步驟二:在Ingress中添加註解

您需要在Ingress資源中添加註解,以保證Ingress同時適用於多個監聽。

  1. 執行以下命令,編輯Ingress。

    kubectl edit ingress <INGRESS_NAME> # <INGRESS_NAME>替換為Ingress的名稱
  2. 在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:
      #...

步驟三:關聯監聽

  1. 登入應用型負載平衡ALB控制台

  2. 執行個體頁面,單擊目標ALB執行個體ID。在監聽頁簽,尋找監聽協議/連接埠為QUIC:443的監聽,記錄此監聽的ID。

  3. 在AlbConfig中填入QUIC監聽的ID。

    1. 執行以下命令編輯AlbConfig。

      kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
    2. 在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監聽listener ID。
              quicUpgradeEnabled: true # 修改為true
          - port: 443
            protocol: QUIC # QUIC監聽
            certificates:
            - CertificateId: 756****-cn-hangzhou
              IsDefault: true 
  4. 確認監聽已關聯

    1. 登入應用型負載平衡ALB控制台

    2. 執行個體頁面,單擊目標執行個體ID,然後在執行個體詳情頁面,單擊監聽頁簽,最後在監聽列表,單擊目標HTTPS監聽名稱,在監聽詳情頁簽查看已關聯的QUIC監聽。

步驟四:效果驗證

使用HTTP/3協議通過ALB Ingress訪問服務,驗證配置的效果。

  1. 執行以下命令,查看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

    記錄下HOSTSADDRESS部分的值,以便後續步驟使用。

  2. 執行以下命令,分別使用HTTP/3與傳統的HTTPS訪問服務。其中的demo.alb.ingress.topalb-********.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

    預期輸出如下,則表明兩種監聽關聯成功,相容多種HTTP協議:

    old
    old

(可選)步驟五:解除關聯

  1. 執行以下命令編輯AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
  2. quicListenerId欄位置空,並將quicUpgradeEnabled欄位的值修改為false,然後儲存並退出。

    # 以上內容省略。
        port: 443
        protocol: HTTPS
        quicConfig:
          quicListenerId: "" # 將QUIC監聽listener ID置空。
          quicUpgradeEnabled: false # 修改為false
        requestTimeout: 0
    # 以下內容省略。

單獨使用QUIC監聽

前提條件

步驟一:在AlbConfig中建立QUIC監聽

  1. 執行以下命令編輯AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
  2. 建立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認證以實現加密通訊

步驟二:建立樣本資源

  1. 建立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 # 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
  2. 執行以下命令建立。

    kubectl apply -f https-quickstart.yaml

步驟三:在Ingress中添加註解

您需要在Ingress資源中添加註解,以保證Ingress適用於QUIC監聽。

  1. 執行以下命令,編輯Ingress。

    kubectl edit ingress https-ingress
  2. 在Ingress中的annotations欄位新增內容。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: #...
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"QUIC": 443}]' # 使Ingress適用於QUIC監聽
    spec:
      #...

步驟四:效果驗證

  1. 執行以下命令,查看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

    記錄下HOSTSADDRESS部分的值,以便後續步驟使用。

  2. 執行以下命令,分別使用HTTP/3與傳統的HTTPS訪問服務。其中的demo.alb.ingress.topalb-********.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

相關文檔