使用QUIC监听兼容HTTP/3协议提高网络通信性能

针对移动网络等网络环境复杂、带宽波动且时延要求较高的场景,或者对于需要低延迟数据交互的应用(如网络游戏、在线视频直播等),您可以使用QUIC协议,并在服务端开启QUIC监听。QUIC支持兼容客户端使用HTTP/3协议访问服务,从而有效提升网络通信的稳定性和实时性能。

工作原理

基于UDP的QUIC协议是HTTP/3的核心,它具有多路复用、0-RTT握手、高效拥塞控制算法、无缝链接迁移等多种改进。相比起使用TLS+TCP的HTTP/2,基于QUIC的HTTP/3能显著减少数据重传和通信延迟,从而提高网络通信性能。关于QUIC的更多信息,请参考QUIC官方文档

  • 创建QUIC监听后,ALB实例支持客户端使用HTTP/3协议访问服务。

  • 如果部分客户端需要使用HTTP/1.1或HTTP/2访问服务,QUIC还支持与HTTPS监听联合使用,以保证对多种HTTP协议的兼容性。在联合使用两种监听时,ALB实例的工作模式如下图所示。QUIC监听与HTTPS监听同时监听同一个端口,并且使用相同的一组转发规则。在接收客户端访问请求时,ALB实例会优先使用QUIC监听将请求转发至后端服务。而当客户端不支持HTTP/3协议时,ALB实例会通过HTTPS监听进行转发。

    image

前提条件

已创建ALBConfig资源。具体操作,请参见ALB Ingress快速入门

单独使用QUIC监听

步骤一:在ALBConfig中创建QUIC监听

  1. 执行以下命令编辑AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
  2. 创建QUIC监听。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb
    spec:
      config:
        #...
      listeners:
        - port: 443
          protocol: QUIC # QUIC监听
          certificates:
          - CertificateId: 756****-cn-hangzhou # 证书的CertIdentifier
            IsDefault: true 
    重要

    以上示例使用了ALBConfig指定证书的配置方法。QUIC监听同样支持使用自动发现证书或Secret证书。具体操作,请参见配置HTTPS证书以实现加密通信

步骤二:效果验证

  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协议,请使用支持HTTP/3的curl。

    curl --http3 -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com

    预期输出如下,则表明QUIC监听配置成功:

    old

联合使用QUIC监听与HTTPS监听

步骤一:创建HTTPS监听

  1. 执行以下命令编辑AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
  2. 创建HTTPS监听,并在HTTPS监听中添加quicConfig字段。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb
    spec:
      config:
        #...
      listeners:
        - port: 443
          protocol: QUIC # QUIC监听
          certificates:
          - CertificateId: 756****-cn-hangzhou # 证书的CertIdentifier
            IsDefault: true
        - port: 443
          protocol: HTTPS # HTTPS监听
          certificates:
          - CertificateId: 756****-cn-hangzhou # 证书的CertIdentifier
            IsDefault: true
          quicConfig:
            quicListenerId: "" # 目前置空,在下一步中会填入值
            quicUpgradeEnabled: false # 设为false
    重要

    以上示例使用了ALBConfig指定证书的配置方法。QUIC监听同样支持使用自动发现证书或Secret证书。

步骤二:在Ingress中添加注解

您需要在Ingress资源中添加注解,以保证Ingress同时作用于多个监听。

  1. 执行以下命令,编辑Ingress。

    kubectl edit ingress quic-ingress # quic-ingress替换为Ingress的名称
  2. 在Ingress中添加annotation

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: #...
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"QUIC": 443},{"HTTPS": 443}]' # 使用多个监听时需要添加annotation使ALB Ingress正常工作
    spec:
      #...

步骤三:关联监听

  1. 登录应用型负载均衡ALB控制台

  2. 实例页面,单击目标ALB实例ID。在监听页签,查找监听协议/端口为QUIC:443的监听,记录此监听的ID。

  3. 在ALBConfig中填入QUIC监听的ID。

    1. 执行以下命令编辑AlbConfig。

      kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
    2. quicListenerId字段中填入QUIC监听的ID,并将quicUpgradeEnabled字段的值修改为true

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb
      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协议,请使用支持HTTP/3的curl。

    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
    # 以下内容省略。

相关文档