我在 GKE 中有一个 pod,其中有一个监听两个端口的容器。一种接受 http 请求,另一种是 gRPC 端点。我在K8S服务上有这些注释:
cloud.google.com/app-protocols: '{"grpc":"HTTP2"}'
cloud.google.com/neg: '{"ingress": true, "exposed_ports": {"9520":{}}}'
cloud.google.com/backend-config: '{"ports": {"grpc":"api-grpc-backend"}}'
据我所知,注释应该将 gRPC 端口指向自定义运行状况检查,并将 GCP LB 和 gRPC 后端之间的协议设置为 HTTP2。
我有这个自定义后端运行状况检查,以强制 gRPC 端点的运行状况检查改为侦听 http 端点上的运行状况:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: api-grpc-backend
spec:
healthCheck:
checkIntervalSec: 15
port: 8000
type: HTTP
requestPath: /health
gRPC 后端正在通过健康检查,并且后端在 GCP 中显示健康:
但是,尝试使用 grpcurl 到达端点会返回
unexpected HTTP status code received from server: 502 (Bad Gateway); transport: received unexpected content-type "text/html; charset=UTF-8"
。
我做错了什么?
您可能想看一下这个文档,其中显示不支持 gRPC 协议在健康检查中的限制,而支持类似 HTTP 的健康检查。
文档提供了此设置的 yaml 配置,并描述了使用 InstanceGroup 后端或 NetworkEndpointGroup (NEG) 后端时配置中的细微差别。