无法连接到基本 Google 云 运行 服务:上游连接错误或 disconnect/reset 在 headers 之前。复位原因:远程复位错误

Unable to connect to basic Google Cloud Run service: upstream connect error or disconnect/reset before headers. reset reason: remote reset error

我已经成功 运行 GCP Cloud 运行 上的 gRPC 服务一年多了。突然,它停止工作并响应每个请求...

StatusCode="Unavailable", Detail="upstream connect error or disconnect/reset before headers. reset reason: remote reset"

没有新的修订或部署。它突然开始以这种方式响应。没有代理,没有 VPC,没有网关,没有入口控制器,我只是使用 Cloud 运行 提供的 URL 指定端口 443。这是最简单的部署。

我试过禁用端到端 HTTP/2(以前有效),用新名称创建一个全新的服务实例,更改运行时环境代数,所有这些都没有让我更接近解析度。我还没有迁移到使用 ESPv2,所以这也不应该是一个问题。

可能是什么原因造成的?

我之前遇到过与您描述的完全相同的问题 - 花费了数小时 debugging/redeploying 等。我验证了 GRPC 服务器成功返回,并关闭了 .net 核心的 rabbit-hole处理 http2 明文和 tls negotiation/downgrading(因为 cloudrun 终止了 TLS,而 .net core GRPC 似乎讨厌未加密的 HTTP2 有效负载)——这让我几乎无处可去,什么也没修复。

最后,我第二天回来了 - 重新部署了一些旧的修订版(之前已经损坏)并且一切正常。

我的假设是在 cloudrun 方面发生了一些事情...但不确定。

(显然不是一个好的答案,但没有评论的声誉)。

当一个新连接打开时,Cloud 运行 检查它是否在第一个请求中有 content-type=application/grpc h2 header。 Cloud 运行 匹配 gRPC 后,它会将所有连接发送到 gRPC 服务器。

有时,禁用云 运行 http/2 end-to-end(您提到您已经尝试过)可以解决 ServerFault case 中建议的问题。

您收到的大部分错误似乎表明 ESPv2 无法到达服务的后端。

作为解决方法,我建议您使用以下方法来减轻错误。

  1. 按照建议使用正确的后端地址配置 ESPv2 here

  2. 如果 ESPv2 已经配置,强制它通过 --backend_dns_lookup_family_flag. You can check more details under the “DNS lookup” section in this documentation.

    使用 IPv4 地址
  3. 将您的请求配置为 gRPC 请求。

另外,看看这个GitHub Link

#NotAnAnswer

这里是link事件详情

https://status.cloud.google.com/incidents/qfgJm8m4WPn2Ej2Z7vc2

2月10日开始!

我不确定您是否遇到了与我相同的问题,但此错误往往自 2021 年 4 月 15 日(左右)起在 .NET GRPC 或 HTTP/2 服务器上发生.

这是我在 Whosebug 上针对我自己的问题写的答案:。您会发现那里支持 Google 云平台答案和修复路线图。

好吧,经过大量调查并使用来自社区的一些非常有用的链接,结果发现 Envoy 的 GCP Cloud 运行 内部存在一个破坏性错误。一些 headers 被删除,这导致一些 gRPC 调用没有被正确路由。因为我使用的是 .NET 6,所以我能够在我的 Kestrel 配置中使用以下添加...

webBuilder.ConfigureKestrel(options =>
{
    ...
    options.AllowAlternateSchemes = true;
});

...根据 Google 的建议解决问题。他们应该在发布当天修复潜在的错误。谢谢大家