GRPC on Google Cloud Run:上游连接错误或在标题之前断开/重置。重置原因:远程重置

编程入门 行业动态 更新时间:2024-10-22 10:45:13
本文介绍了GRPC on Google Cloud Run:上游连接错误或在标题之前断开/重置。重置原因:远程重置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

编辑

我描述的第一个错误似乎很容易重现。实际上,Google Run似乎无法在.NET5 GRPC服务器上运行任何GRPC查询(至少,它以前确实有效,但到今天,2月21日,似乎发生了一些变化)。复制:

  • 创建.NET5 GRPC服务器(也失败,返回.NET6):
  • dotnet new grpc -o TestGrpc
  • 更改Program.cs使其监听$PORT,通常为:
  • public static IHostBuilder CreateHostBuilder(string[] args) { var port = Environment.GetEnvironmentVariable("PORT") ?? "8080"; var url = string.Concat("0.0.0.0:", port); return Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>().UseUrls(url); }); }
  • 为服务器提供镜像的非常简单的Dockerfile(使用更标准的镜像也会失败,如here):
  • FROM mcr.microsoft/dotnet/sdk:5.0 COPY . ./ RUN dotnet restore ./TestGrpc.csproj RUN dotnet build ./TestGrpc.csproj -c Release CMD dotnet run --project ./TestGrpc.csproj
  • 生成并推送到Google Artifcats注册表。
  • 创建启用了HTTP/2的Cloud Run实例(Ketrel requires HTTP/2,因此我们需要设置 HTTP/2端到端,但我也没有测试,但它不是更好)。
  • 例如使用Grpcurl并尝试:
  • grpcurl {CLOUD_RUN_URL}:443 list

    您将收到与我的(更复杂的)项目相同的错误:

    Failed to list services: rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers. reset reason: remote reset

    在Google Cloud Run实例上,我只有日志:

    2022-02-21T16:44:32.528530Z POST 200 1.02 KB 41 ms grpcurl/v1.8.6 grpc-go/1.44.1-dev ***/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo

    (我真的不明白为什么是200……而且似乎永远不会到达实际的服务器实现,就像有某种中间件阻止查询到达实现一样……)

    我非常肯定,当我以这种方式开始我的项目(然后更改了Protos、服务等)时,这曾经是有效的。如果谁有线索,我将不胜感激:-)

    初始帖子(没有上面的解释那么精确,但如果它能给出线索,我就把它留在这里)

    我有一个在Docker(.NET5 GRPC应用程序)中运行的服务器。这台服务器在本地部署时运行得非常好。但最近,当我在Google Cloud Run上部署它时,出现了一个错误:upstream connect error or disconnect/reset before headers. reset reason: remote reset,而它以前运行得很好。我使用的任何客户端都不断出现此错误,例如使用Curl:

    curl -v {ENDPOINT}/{Proto-base}/{Method} --http2 * Trying ***... * TCP_NODELAY set * Connected to *** (***) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: CN=*.a.run.app * start date: Feb 7 02:07:06 2022 GMT * expire date: May 2 02:07:05 2022 GMT * subjectAltName: host "***" matched cert's "*.a.run.app" * issuer: C=US; O=Google Trust Services LLC; CN=GTS CA 1C3 * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x5564aad30860) > GET /{Proto}/{Method} HTTP/2 > Host: *** > user-agent: curl/7.68.0 > accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Connection state changed (MAX_CONCURRENT_STREAMS == 100)! < HTTP/2 503 < content-length: 85 < content-type: text/plain < date: Mon, 21 Feb 2022 13:51:31 GMT < server: Google Frontend < traceparent: 00-5a74487dafb5687961deeb17e0158ca9-5ab63cd23680e7d7-01 < x-cloud-trace-context: 5a74487dafb5687961deeb17e0158ca9/6536478782730069975;o=1 < alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" < * Connection #0 to host *** left intact upstream connect error or disconnect/reset before headers. reset reason: remote reset

    Grpcurl也是如此:

    grpcurl ***:443 list {Proto-base} Failed to list methods for service "***.Company": rpc error: code = Unavailable desc = upstream connect error or disconnect/reset before headers. reset reason: remote reset

    我找不到太多关于此错误的资源,因为我读到的大多数线程都处理另一种类型的reset reason(如协议或连接等)。但我完全不知道remote reset是什么意思,我做错了什么。

    查看Google Cloud Run中的日志,我可以看到服务器肯定被击中了,尽管我在没有触发的路径中添加了跟踪日志记录,因此它永远不会到达我的代码:

    2022-02-21T14:44:22.840580Z POST 200 1.01 KB 1 msgrpc-python/1.44.0 grpc-c/22.0.0 (linux; chttp2) ***/{Protos-base}/{Method}

    (如果我达到我的代码,它应该会在没有打印的地方打印一些您好)

    有人找到过这个吗?

    附言:有很多关于特使的东西,但我甚至不使用这个。我只有一个Cloud Run实例(带有HTTP/2-我尝试了没有,但由于协议问题它失败了)。

    推荐答案

    这是特使和Google Cloud Run的实际错误。如果你正在使用.NET6,有一个快速的解决方案,否则它会更麻烦一些。我将在这里复制Amanda Tarafa Mas在github issue I opened上从Google Cloud平台提供的答案:

    以下是可能的修复:

    • 使用.NET 6时,可以将KestrelServerOptions.AllowAlternateSchemes设置为True。
    • 如果在较低的.NET版本上,请考虑类似于grpc:从代理/负载平衡器传递的方案伪头导致ConnectionAbortedException Dotnet/aspnetcore#30532(注释)的代码。或者考虑升级到.NET 6。

    发生了什么:

    • Cloud Run依赖特使,特使自2021年4月15日起行为发生变化,请参见发布说明中的";preserve_Downlow_SCHEME";: www.envoyproxy.io/docs/envoy/latest/version_history/v1.18.0 特使最近删除了旧行为:www.envoyproxy.io/docs/envoy/latest/version_history/current#removed-config-or-runtime
    • 反过来,这又暴露了这个.NET问题:从代理/负载均衡器传递的grpc:方案伪头导致ConnectionAbortedException Dotnet/aspnetcore#30532,为其添加了Kestrel配置标志,但仅适用于.NET 6。 我正在考虑在某个地方记录这件事。@meteatamel您能否更新教程,使其使用Kestrel选项?

    对我来说,设置KestrelServerOptions.AllowAlternate足以使我的GRPC服务器再次工作。

    正如@Craig所说,您可以跟踪问题here并查看问题是否得到解决。

    更多推荐

    GRPC on Google Cloud Run:上游连接错误或在标题之前断开/重置。重置原因:远程重置

    本文发布于:2023-10-24 19:49:07,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1524840.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:错误   原因   标题   Google   GRPC

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!