Клиент двунаправленной потоковой передачи gRPC иногда закрывает неожиданный EOF rpc на сервере за Nginx Ingress

Я столкнулся с проблемой, заключающейся в том, что клиент gRPC при вызове двунаправленной потоковой передачи на сервер за AWS NLB, входной контроллер nginx иногда выдает er « ошибка закрытия rpc: код = Internaldesc = неожиданный EOF ».

Вот моя установка:

  • Реплика сервера 1 Golang pod gRPC (1) , работающая в кластере EKS (в Сингапуре).
  • Сервер открыт для входа nginx за AWS NLB (модули контроллеров nginx развертываются с 3 репликами на 3 разных узлах по требованию , а AWS NLB нацелен только на узлы по требованию , а не на спотовые узлы)
  • Клиент (2) также написан на Golang и работает в трех дроплетах Digital Ocean с 1 экземпляром на каждую каплю (в Сингапуре), подключенных к серверу через домен, указывающий на NLB.
  • Клиент также является сервером gRPC, который передает данные на Socket-сервер (3) (в том же VPC в Digital Ocean с (2) — частное соединение — 3 капли — 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 Configmap, но ничего не вышло. Вот моя конфигурация 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;

Кто-нибудь сталкивался с этой ошибкой или имеет какие-либо идеи? Спасибо!

[Обновление] Я попытался подключиться к серверу (1) с помощью службы K8S NodePort, и это сработало. Итак, теперь я могу подтвердить, что проблема связана с проникновением nginx. Что-то не так с моей конфигурацией Nginx?

1 ответ

Вы пытались изменить grpc_send_timeout, grpc_read_timeout?https://kubernetes.github.io/ingress-nginx/examples/grpc/#notes-on-using-responserequest-streams

Другие вопросы по тегам