You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于AWS ALB Ingress在K8s部署gRPC服务无法访问问题求助

你遇到的无法访问问题直接原因是ALB目标组健康检查判定所有后端实例不健康,导致ALB没有可用的后端节点转发流量,所以客户端返回UNAVAILABLE错误。

问题根因分析

  1. 健康检查配置不匹配
    你在Ingress注解中同时配置了alb.ingress.kubernetes.io/healthcheck-protocol: HTTP和alb.ingress.kubernetes.io/success-codes: '12',二者逻辑完全冲突:
  • HTTP协议的健康检查返回的是标准HTTP状态码,你服务返回的200属于正常HTTP成功码
  • 状态码12是gRPC协议的OK状态码,仅在使用gRPC协议做健康检查时生效
    二者不匹配导致健康检查始终失败,所有后端被标记为不健康。
  1. Ingress缺失TLS配置
    你配置了ALB监听HTTPS 443端口,但是Ingress配置中没有关联对应域名的TLS证书,HTTPS握手环节会直接失败,即使健康检查正常也无法正常访问gRPC服务(gRPC依赖HTTP/2协议,ALB侧要求必须基于TLS传输)。

  2. Ingress API版本过旧
    你使用的networking.k8s.io/v1beta1版本Ingress在K8s 1.19及以上版本已经废弃,可能存在兼容性问题。

修复步骤

第一步:修正健康检查配置,二选一即可:

方案A(适配未实现gRPC健康检查的服务)

将健康检查成功码修改为HTTP协议对应值,修改Ingress注解:

alb.ingress.kubernetes.io/success-codes: '200'

方案B(适配已实现gRPC标准健康检查协议的服务)

修改健康检查协议为gRPC:

alb.ingress.kubernetes.io/healthcheck-protocol: GRPC
alb.ingress.kubernetes.io/healthcheck-port: 50051
# success-codes保持'12'不变即可

你可以在容器内执行grpc_health_probe -addr=localhost:50051确认服务是否实现了gRPC健康检查接口。

第二步:补全TLS配置

在Ingress的spec字段中添加TLS配置,关联你在AWS ACM中申请的、覆盖sample-grpc-service.my-domain.com的证书:

spec:
  tls:
  - hosts:
    - sample-grpc-service.my-domain.com
    # 填写ACM证书对应的ARN或者集群内的TLS Secret名称
    secretName: <your-cert-secret-name>

第三步:确认安全组规则

确认EKS工作节点的安全组入站规则,允许ALB的安全组访问50051端口。

第四步:升级Ingress API版本(可选但建议)

将Ingress的API版本升级为networking.k8s.io/v1,适配新版K8s的API规范。

第五步:客户端验证

修复后使用grpcurl工具验证连通性:

# 公认可信证书的情况
grpcurl sample-grpc-service.my-domain.com:443 list
# 自签证书的情况,添加-insecure参数跳过校验
grpcurl -insecure sample-grpc-service.my-domain.com:443 list

内容的提问来源于stack exchange,提问作者Guy Grin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:24:05