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

pdkcd3nj  于 2024-01-07  发布在  Kubernetes
关注(0)|答案(1)|浏览(214)

我在GKE中有一个pod,它有一个监听两个端口的容器。一个接受http请求,一个是gRPC端点。我在K8S服务上有这些注解:

  1. cloud.google.com/app-protocols: '{"grpc":"HTTP2"}'
  2. cloud.google.com/neg: '{"ingress": true, "exposed_ports": {"9520":{}}}'
  3. cloud.google.com/backend-config: '{"ports": {"grpc":"api-grpc-backend"}}'

字符串
据我所知,注解应该将gRPC端口指向自定义健康检查,并将GCP LB和gRPC后端之间的协议设置为HTTP 2。
我有这个自定义的后端健康检查,强制gRPC端点的健康检查侦听http端点上的健康:

  1. apiVersion: cloud.google.com/v1
  2. kind: BackendConfig
  3. metadata:
  4. name: api-grpc-backend
  5. spec:
  6. healthCheck:
  7. checkIntervalSec: 15
  8. port: 8000
  9. type: HTTP
  10. 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:

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

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

  1. spec:
  2. containers:
  3. - name: esp
  4. image: gcr.io/myrepo/healthchecker
  5. ports:
  6. - containerPort: 8081
  7. - name: grpcapp
  8. image: gcr.io/mygcr/myapp
  9. ports:
  10. - containerPort: 8080


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

展开查看全部

相关问题