gRPC 双向流式传输客户端有时会关闭 RPC 意外的 EOF 到 Nginx Ingress 后面的服务器

gRPC 双向流式传输客户端有时会关闭 RPC 意外的 EOF 到 Nginx Ingress 后面的服务器

我面临的问题是,双向流式传输中的 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

相关内容