我正试图为在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