![gRPC 双向流式传输客户端有时会关闭 RPC 意外的 EOF 到 Nginx Ingress 后面的服务器](https://linux22.com/image/789992/gRPC%20%E5%8F%8C%E5%90%91%E6%B5%81%E5%BC%8F%E4%BC%A0%E8%BE%93%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%89%E6%97%B6%E4%BC%9A%E5%85%B3%E9%97%AD%20RPC%20%E6%84%8F%E5%A4%96%E7%9A%84%20EOF%20%E5%88%B0%20Nginx%20Ingress%20%E5%90%8E%E9%9D%A2%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我面临的问题是,双向流式传输中的 gRPC 客户端调用 AWS NLB、nginx 入口控制器后面的服务器有时投掷者关闭 rpc 错误:代码 = 内部描述 = 意外 EOF“。
这是我的设置:
- Golang pod gRPC 服务器 1 个副本(1)在 EKS 集群上运行(在新加坡)
- 服务器暴露给 AWS NLB 后面的 nginx 入口(nginx 控制器 pod 部署在3 个副本在3 个不同的按需节点并且仅限 AWS NLB以按需节点为目标- 不是现货节点)
- 客户 (2)也是用 Golang 编写的,运行在 3 个 Digital Ocean droplet 中,每个 droplet 有 1 个实例(在新加坡),通过指向 NLB 的域连接到服务器。
- 客户端也是一个 gRPC 服务器,它将数据推送到套接字服务器 (3)(在 Digital Ocean 中的同一个 VPC 中,使用 (2) - 一个私有连接 - 3 个 droplet - 每个 droplet 2 个实例)通过双向流式传输。
错误由 (2) 引发有时出现以下两个错误之一:
close rpc error: code = Internal desc = unexpected EOF
close rpc error: code = Internal desc = stream terminated by RST_STREAM with error code: INTERNAL_ERROR
nginx 中的日志:
[error] 25#25: *599548 recv() failed (104: Connection reset by peer) while sending to client
我还发现魔法错误只来自(2)当(3)有用户通过套接字连接连接到时,与(3)连接的. 其他 (2) 与 (3) 相连没有任何客户端连接没有抛出任何错误,但是当我将域指向(3)以将客户端移动给他们时,他们收到了错误。
我还尝试禁用 proxy_buffering 或在Nginx 配置图,但什么也没发生。这是我的 nginx 配置:
proxy_buffering off;
....
location ...
client_max_body_size 0;
proxy_connect_timeout 60s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
proxy_buffering off;
proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_max_temp_file_size 1024m;
proxy_request_buffering on;
proxy_http_version 1.1;
proxy_cookie_domain off;
proxy_cookie_path off;
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 3;
grpc_pass grpc://upstream_balancer;
proxy_redirect off;
有人遇到过这个错误或有任何想法吗?谢谢!
[更新] 我尝试使用 K8S 服务 NodePort 连接到服务器 (1),成功了。所以现在我可以确认问题出在 nginx ingress。我的 Nginx 配置有什么问题吗?
答案1
您是否尝试过更改 grpc_send_timeout、grpc_read_timeout? https://kubernetes.github.io/ingress-nginx/examples/grpc/#notes-on-using-responserequest-streams