基于AWS ALB Ingress在K8s部署gRPC服务无法访问问题求助
你遇到的无法访问问题直接原因是ALB目标组健康检查判定所有后端实例不健康,导致ALB没有可用的后端节点转发流量,所以客户端返回UNAVAILABLE错误。
问题根因分析
- 健康检查配置不匹配
你在Ingress注解中同时配置了alb.ingress.kubernetes.io/healthcheck-protocol: HTTP和alb.ingress.kubernetes.io/success-codes: '12',二者逻辑完全冲突:
- HTTP协议的健康检查返回的是标准HTTP状态码,你服务返回的200属于正常HTTP成功码
- 状态码12是gRPC协议的
OK状态码,仅在使用gRPC协议做健康检查时生效
二者不匹配导致健康检查始终失败,所有后端被标记为不健康。
Ingress缺失TLS配置
你配置了ALB监听HTTPS 443端口,但是Ingress配置中没有关联对应域名的TLS证书,HTTPS握手环节会直接失败,即使健康检查正常也无法正常访问gRPC服务(gRPC依赖HTTP/2协议,ALB侧要求必须基于TLS传输)。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
相关产品推荐
相关产品推荐

