Клиент двунаправленной потоковой передачи 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