一年多来,我一直在GCP Cloud Run上成功运行gRPC服务。突然,它停止了工作,并用。。。
StatusCode="Unavailable", Detail="upstream connect error or disconnect/reset before headers. reset reason: remote reset"
没有新的修订或部署。它突然开始做出这样的反应。没有代理,没有VPC,没有网关,没有入口控制器,我只是使用Cloud Run提供的URL,指定了443端口。这是最简单的部署方式。
我尝试过禁用端到端HTTP/2(以前有效(,用新名称创建一个全新的服务实例,更改运行时环境生成,所有这些都没有让我更接近解决方案。我还没有迁移到使用ESPv2,所以这也不应该是一个问题。
可能是什么原因造成的?
好吧,经过大量调查和社区中一些非常有用的链接,发现在GCP Cloud Run for Envoy的掩护下出现了一个突破性错误。删除了一些标头,导致某些gRPC调用无法正确路由。由于我使用的是.NET6,我可以在Kestrel配置中使用以下添加。。。
webBuilder.ConfigureKestrel(options =>
{
...
options.AllowAlternateSchemes = true;
});
按照谷歌的建议来解决这个问题。他们应该在发布当天修复潜在的错误。谢谢大家。
我之前遇到过与您描述的完全相同的问题-花了数小时调试/重新部署等。我验证了GRPC服务器成功返回,net core对http2明文和tls协商/降级的处理陷入了一个兔子洞(因为cloudrun终止了tls,.net core GRPC似乎讨厌未加密的http2有效载荷(——这让我几乎一无所获。
最后,我第二天回来了——重新部署了一些旧的修订(以前坏了(,一切都奏效了。
我的假设是,事情的阴云密布。。。但不确定。
(显然不是一个好的答案,但没有评论的声誉(。
打开新连接时,Cloud Run会检查第一个请求中是否有content-type=application/grpc h2标头。一旦Cloud Run与gRPC匹配,它就会将所有连接发送到gRPC服务器。
有时,如ServerFault案例中所建议的那样,禁用云端到端运行http/2(您提到您已经尝试过了(可以解决问题。
您收到的错误似乎主要表明ESPv2无法访问服务的后端。
作为一种变通方法,我建议您使用以下方法来减轻错误。
-
使用此处建议的正确后端地址配置ESPv2。
-
如果已经配置了ESPv2,请通过--backend_dns_lookup_family_flag强制其使用IPv4地址。您可以在本文档的"DNS查找"部分查看更多详细信息。
-
将您的请求配置为gRPC请求。
另外,看看这个GitHub链接。
#NotAnAnswer
以下是事件详细信息的链接
https://status.cloud.google.com/incidents/qfgJm8m4WPn2Ej2Z7vc2
它开始于2月10日!
我不确定你是否遇到了和我一样的问题,但这个错误往往发生在2021年4月15日左右的.NET GRPC或HTTP/2服务器上。
以下是我在stackoverflow上就自己的问题写的答案:https://stackoverflow.com/a/71249250/4829094.你会发现支持谷歌云平台的答案和修复路线图。