跳转到内容

HTTP/2 配置

Nantian Gateway 在前端(面向客户端)和后端(上游)连接上均支持 HTTP/2。HTTP/2 提供多路复用流、头部压缩和服务器推送功能——降低现代 Web 应用和 gRPC 服务的延迟。

通过配置 Gateway 资源的监听器协议和 TLS 设置来启用前端的 HTTP/2。

当监听器使用 protocol: HTTPS 并启用 TLS 终止时,HTTP/2 在 TLS 握手期间通过 ALPN 协商:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: h2-gateway
spec:
gatewayClassName: nantian-gw
listeners:
- name: https
port: 443
protocol: HTTPS
tls:
mode: Terminate
certificateRefs:
- name: my-tls-cert

支持 HTTP/2 的客户端将自动协商。仅支持 HTTP/1.1 的客户端会无缝回退。

对于由其他地方处理 TLS 的内部服务(如负载均衡器终止 TLS),使用 protocol: HTTP 并通过后端协议设置启用 H2C:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: h2c-gateway
spec:
gatewayClassName: nantian-gw
listeners:
- name: http
port: 80
protocol: HTTP

然后在 Service 上配置后端服务 appProtocol: kubernetes.io/h2c

apiVersion: v1
kind: Service
metadata:
name: grpc-backend
annotations:
networking.gateway.networking.k8s.io/appProtocol: kubernetes.io/h2c
spec:
ports:
- port: 9090
targetPort: 9090

当后端服务的 appProtocol 声明为 kubernetes.io/h2c 时,数据面使用 HTTP/2 连接后端。通常用于 gRPC 服务(要求 HTTP/2)或受益于多路复用连接的内部服务。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: grpc-route
spec:
parentRefs:
- name: my-gateway
rules:
- backendRefs:
- name: grpc-service
port: 9090

无需额外路由配置。数据面会自动检测 GRPCRouteappProtocol: kubernetes.io/h2c,并将后端连接升级为 HTTP/2。

监听器协议TLS客户端协议后端协议
HTTPS终止h2(ALPN)h2c 或 HTTP/1.1
HTTPS透传客户端决定客户端决定
HTTPHTTP/1.1HTTP/1.1 或 h2c

HTTP/2 多路复用可减少同一后端有大量并发请求场景下的连接开销。单个 TCP 连接可承载数百个并发流,消除了影响 HTTP/1.1 管线的队头阻塞问题。

然而,HTTP/2 的每条连接流量控制在出现丢包时可能在 TCP 层面产生队头阻塞。对于高吞吐量、高延迟的后端连接,建议对比 HTTP/2 和 HTTP/1.1(配合连接池)的性能,以确定最佳配置。

检查后端 Service 是否声明了 appProtocol: kubernetes.io/h2c。没有此注解,数据面会尝试使用 HTTP/1.1 连接后端,gRPC 服务器会拒绝。

Terminal window
kubectl get svc grpc-service -o yaml | grep appProtocol

验证监听器使用 protocol: HTTPStls.mode: Terminate。HTTP/2 协商需要 TLS ALPN。如果 TLS 由外部负载均衡器终止,请在负载均衡器层配置 HTTP/2,并将后端协议设置为 h2c。