kubernetes 为什么我在GCP GKE中的gRPC pod会导致502?

pdkcd3nj  于 5个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(75)

我在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后端之间的协议设置为HTTP 2。
我有这个自定义的后端健康检查,强制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"
我做错了什么?

dxxyhpgq

dxxyhpgq1#

你可能想看看这个documentation,它显示了gRPC协议在健康检查中的限制不受支持,而支持类似HTTP的健康检查。这种情况有两个选项。
在单独的端口上运行代理,将HTTP运行状况检查请求转换为gRPC,然后将转换后的请求转发到提供gRPC运行状况检查的应用程序端口。在使用HTTP的单独端口上运行专用的运行状况检查器。此运行状况检查器直接响应运行状况检查请求,而不是对它们进行拦截。
对于代理运行状况检查的http:

$ grpc_health_proxy --http-listen-addr localhost:8080 \
                    --http-listen-path /healthz \
                    --grpcaddr localhost:50051 \
                    --service-name echo.EchoServer --logtostderr=1 -v 1

字符串
对于非代理运行状况检查

spec:
 containers:
 - name: esp
   image: gcr.io/myrepo/healthchecker
   ports:
   - containerPort: 8081
 - name: grpcapp
   image: gcr.io/mygcr/myapp
   ports:
   - containerPort: 8080


该文档提供了此设置的yaml配置,并描述了使用InstanceGroup后端或NetworkEndpointGroup(NEG)后端时配置中的细微差别。

相关问题