使用Telepresence调用本地服务的Kubernetes中gRPC客户端的HTTP/2客户端序字符串丢失或损坏



我正试图为在Kubernetes集群内运行的Springboot应用程序的集成测试准备一个环境。我正在使用Telepresence,它拦截Kubernetes集群中的流量(gRPCAPI(,将其路由到我的IDE(IntelliJ(中本地运行的应用程序。Kubernetes中的Springboot应用程序正在侦听端口9090上的gRPC调用,并通过ClusterIP服务公开。我正在尝试拦截这个运行在Kubernetes中的应用程序的gRPC流量,并使用下面的Telepresence拦截命令将其路由到本地运行的应用程序,该应用程序在端口9095上侦听

telepresence intercept service-name --namespace=ns --port 9095:9090 --env-file C:UsersSC1063telepresenceenv_filesintercept-config.env

我的本地应用程序在接收gRPC调用时抛出以下异常

io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception: HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 1603010200010001fc0303ffd1d5efdfb5771b509014337a

根据Spring boot+GRPC Http2Exception的问题,我理解,来自运行在Kubernetes中的客户端应用程序的调用试图使用TLS来保护通信。然而,kubernetes中未被拦截的gRPC调用正在正常工作,没有任何问题。应用程序环境使用Istio进行服务网格。

在客户端日志中观察到错误

upstream connect error or disconnect/reset before headers. retried and the latest reset reason: connection failure, transport failure reason: TLS error: 268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER]

问题的根本原因是,客户端在向服务器发送请求之前应用了TLS,而服务器需要PLAINTEXT。Istio服务网格使用TLS保护外部出站流量(K8s集群外的流量(,除非DISABLED。创建Istio destinationrule CRD,特使代理使用该CRD在路由流量时禁用TLS

spec:
trafficPolicy:
tls:
mode: DISABLE

最新更新