在不稳定且多变的网络环境中(如移动网络),或在需要低延迟的场景下(如网络游戏或流媒体服务),您可以使用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监听。