HTTP/2 配置
Nantian Gateway 在前端(面向客户端)和后端(上游)连接上均支持 HTTP/2。HTTP/2 提供多路复用流、头部压缩和服务器推送功能——降低现代 Web 应用和 gRPC 服务的延迟。
前端 HTTP/2
Section titled “前端 HTTP/2”通过配置 Gateway 资源的监听器协议和 TLS 设置来启用前端的 HTTP/2。
基于 TLS 的 HTTP/2(h2)
Section titled “基于 TLS 的 HTTP/2(h2)”当监听器使用 protocol: HTTPS 并启用 TLS 终止时,HTTP/2 在 TLS 握手期间通过 ALPN 协商:
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: h2-gatewayspec: gatewayClassName: nantian-gw listeners: - name: https port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: my-tls-cert支持 HTTP/2 的客户端将自动协商。仅支持 HTTP/1.1 的客户端会无缝回退。
不使用 TLS 的 HTTP/2(h2c)
Section titled “不使用 TLS 的 HTTP/2(h2c)”对于由其他地方处理 TLS 的内部服务(如负载均衡器终止 TLS),使用 protocol: HTTP 并通过后端协议设置启用 H2C:
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: h2c-gatewayspec: gatewayClassName: nantian-gw listeners: - name: http port: 80 protocol: HTTP然后在 Service 上配置后端服务 appProtocol: kubernetes.io/h2c:
apiVersion: v1kind: Servicemetadata: name: grpc-backend annotations: networking.gateway.networking.k8s.io/appProtocol: kubernetes.io/h2cspec: ports: - port: 9090 targetPort: 9090后端 HTTP/2
Section titled “后端 HTTP/2”当后端服务的 appProtocol 声明为 kubernetes.io/h2c 时,数据面使用 HTTP/2 连接后端。通常用于 gRPC 服务(要求 HTTP/2)或受益于多路复用连接的内部服务。
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: grpc-routespec: parentRefs: - name: my-gateway rules: - backendRefs: - name: grpc-service port: 9090无需额外路由配置。数据面会自动检测 GRPCRoute 或 appProtocol: kubernetes.io/h2c,并将后端连接升级为 HTTP/2。
协议选择行为
Section titled “协议选择行为”| 监听器协议 | TLS | 客户端协议 | 后端协议 |
|---|---|---|---|
HTTPS | 终止 | h2(ALPN) | h2c 或 HTTP/1.1 |
HTTPS | 透传 | 客户端决定 | 客户端决定 |
HTTP | 无 | HTTP/1.1 | HTTP/1.1 或 h2c |
HTTP/2 多路复用可减少同一后端有大量并发请求场景下的连接开销。单个 TCP 连接可承载数百个并发流,消除了影响 HTTP/1.1 管线的队头阻塞问题。
然而,HTTP/2 的每条连接流量控制在出现丢包时可能在 TCP 层面产生队头阻塞。对于高吞吐量、高延迟的后端连接,建议对比 HTTP/2 和 HTTP/1.1(配合连接池)的性能,以确定最佳配置。
gRPC 调用失败并返回协议错误
Section titled “gRPC 调用失败并返回协议错误”检查后端 Service 是否声明了 appProtocol: kubernetes.io/h2c。没有此注解,数据面会尝试使用 HTTP/1.1 连接后端,gRPC 服务器会拒绝。
kubectl get svc grpc-service -o yaml | grep appProtocol前端未协商 HTTP/2
Section titled “前端未协商 HTTP/2”验证监听器使用 protocol: HTTPS 和 tls.mode: Terminate。HTTP/2 协商需要 TLS ALPN。如果 TLS 由外部负载均衡器终止,请在负载均衡器层配置 HTTP/2,并将后端协议设置为 h2c。
- gRPC 路由 — 按服务和方法路由 gRPC 流量
- TLS 配置 — TLS 终止和 mTLS 设置
- 流式路由和 TCP 路由 — 非 HTTP 协议路由