AWS ALB Ingress对接Kubernetes gRPC服务出现HTTP1.x连接错误如何解决
错误原因
gRPC底层强制依赖HTTP/2协议传输,你收到的14 UNAVAILABLE: Trying to connect an http1.x server报错,本质是BloomRPC发出的HTTP/2格式的gRPC请求,收到了ALB返回的HTTP/1.x响应,具体触发原因有以下几点:
- AWS ALB默认HTTPS监听端口使用HTTP/1.1协议,你当前Ingress配置仅指定了监听50051 HTTPS端口,未显式声明该端口使用HTTP/2协议,ALB对外响应使用HTTP/1.1直接触发报错
- 健康检查配置不匹配:你当前使用HTTP协议请求根路径做健康检查,gRPC服务默认不会响应HTTP/1.x的根路径请求,会导致ALB判定后端节点不健康,返回异常HTTP/1.x错误响应
- 若你使用的K8s集群版本≥1.19,
networking.k8s.io/v1beta1版本的Ingress资源已被废弃,可能导致ALB相关注解不生效
修复方案
1. 修改Ingress监听配置,启用HTTP/2协议
替换ingress.yaml中的alb.ingress.kubernetes.io/listen-ports注解,显式指定50051端口使用HTTP/2协议:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 50051, "Protocol": "HTTP2"}]'
2. 调整健康检查配置适配gRPC服务
修改健康检查相关注解,使用gRPC标准健康检查路径,匹配gRPC响应状态码:
# 若后端gRPC服务已启用TLS则保持HTTPS,未启用则改为HTTP alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS alb.ingress.kubernetes.io/healthcheck-path: /grpc.health.v1.Health/Check alb.ingress.kubernetes.io/healthcheck-success-codes: "0,12,200"
如果你的gRPC服务暂时没有实现健康检查接口,可以临时将成功状态码范围放宽为200-499做验证,后续再补全健康检查逻辑。
3. 适配K8s版本更新Ingress配置(可选,针对1.19+版本集群)
将Ingress的apiVersion升级为正式版,调整spec格式适配新版规范:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{.Values.name}}-ingress namespace: {{.Values.namespace}} annotations: # 保留原有其他ALB相关注解,删除kubernetes.io/ingress.class: alb注解 ... spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: {{.Values.name}}-svc port: number: 50051
4. 验证后端服务协议匹配
检查你的gRPC服务是否启用了TLS:
- 若后端gRPC服务未启用TLS,将Ingress注解
alb.ingress.kubernetes.io/backend-protocol: HTTPS改为alb.ingress.kubernetes.io/backend-protocol: HTTP - 确认BloomRPC访问时已经信任ALB使用的证书,或开启了跳过TLS验证选项
内容的提问来源于stack exchange,提问作者sd-gallowaystorm
相关产品推荐
相关产品推荐

