在不穩定且多變的網路環境中(如移動網路),或在需要低延遲的情境下(如網路遊戲或流媒體服務),您可以使用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監聽
前提條件
已參照配置HTTPS認證以實現加密通訊配置HTTPS認證。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
步驟一:在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認證以實現加密通訊。
步驟二:在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: #...
步驟三:關聯監聽
在執行個體頁面,單擊目標ALB執行個體ID。在監聽頁簽,尋找監聽協議/連接埠為QUIC:443的監聽,記錄此監聽的ID。
在AlbConfig中填入QUIC監聽的ID。
執行以下命令編輯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監聽listener ID。 quicUpgradeEnabled: true # 修改為true - port: 443 protocol: QUIC # QUIC監聽 certificates: - CertificateId: 756****-cn-hangzhou IsDefault: true
確認監聽已關聯
在執行個體頁面,單擊目標執行個體ID,然後在執行個體詳情頁面,單擊監聽頁簽,最後在監聽列表,單擊目標HTTPS監聽名稱,在監聽詳情頁簽查看已關聯的QUIC監聽。
步驟四:效果驗證
使用HTTP/3協議通過ALB Ingress訪問服務,驗證配置的效果。
執行以下命令,查看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
預期輸出如下,則表明兩種監聽關聯成功,相容多種HTTP協議:
old old
(可選)步驟五:解除關聯
執行以下命令編輯AlbConfig。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
將
quicListenerId
欄位置空,並將quicUpgradeEnabled
欄位的值修改為false,然後儲存並退出。# 以上內容省略。 port: 443 protocol: HTTPS quicConfig: quicListenerId: "" # 將QUIC監聽listener ID置空。 quicUpgradeEnabled: false # 修改為false requestTimeout: 0 # 以下內容省略。
單獨使用QUIC監聽
前提條件
已建立AlbConfig資源。具體操作,請參見ALB Ingress快速入門。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
步驟一:在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認證以實現加密通訊。
步驟二:建立樣本資源
建立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
執行以下命令建立。
kubectl apply -f https-quickstart.yaml
步驟三:在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: #...
步驟四:效果驗證
執行以下命令,查看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
預期輸出如下,則表明QUIC監聽配置成功:
old
相關文檔
如果您的Web服務經常面臨惡意入侵或需要更高的安全防護,您可以使用ALB WAF增強版執行個體,請參見使用ALB WAF增強版執行個體保護服務。
更多的監聽配置,請參見通過AlbConfig配置ALB監聽。