Kubernetes 中的 GRPC 服务正在运行,但在我们使用 istio 时因 GRPC 协议错误而失败

GRPC service inside Kubernetes is working but fails with an GRPC protocol error when we use istio

我有一个服务器到服务器调用,我使用 GRPC(使用 .net core 5)它正在本地工作和测试。

在那之后,我将所有服务移动到 Kubernetes Pod(Docker 桌面)并通过流程进行了测试(使用 swagger post-call)并且它也在那里工作。

现在为了监控,我添加了 ISTIO 并将标签添加到我的命名空间“istio-injection=enabled” 重新启动了我所有的 pods,现在每个 pod 中都有 2 个容器。

我测试了基本服务(再次大摇大摆)并且它正在运行。在测试 GRPC 调用时。来电方的呼叫失败说

Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="upstream connect error or disconnect/reset before headers.reset reason: protocol error")

我检查了 GRPC 服务器端的日志,它对这个调用一无所知,服务只是 运行。然后我有点认为错误来自调用方,而它不能或无法调用 GRPC 服务器。

错误详情:

Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="upstream connect error or disconnect/reset before headers. reset reason: protocol error") 
at Basket.API.GrpcServices.DiscountGrpcService.GetDiscount(String productName) in /src/Services/Basket/Basket.API/GrpcServices/DiscountGrpcService.cs:line 21 
at Basket.API.Controllers.BasketController.UpdateBasket(ShoppingCart basket) in /src/Services/Basket/Basket.API/Controllers/BasketController.cs:line 47 at lambda_method7(Closure , Object ) 
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Obje

再次,我删除了 Istio 并进行了测试,它又开始工作了(没有改变任何东西)我加回了 istio,它又开始失败了。所有其他服务都在使用 istio 但不是这个调用(这只是我有的 GRPC 调用)。

我在 https://istiobyexample.dev/grpc/ 找到了一个解决方案,其中描述了丢失的物品。

istio 建议使用名称和版本标签作为标签,但更重要的是,在使用 GRPC 时,公开 GRPC 的服务需要具有端口名称 GRPC。

我补充说重新启动了服务,它开始按预期工作。 同样,这不是我解决的问题。所有功劳归功于 link https://istiobyexample.dev/grpc/ 和下面张贴的图片。