Kubernetes Pod注入istio侧车后,websocket连接将异常中断
后端使用Springboot提供WebSocket连接,并将最大空闲时间设置为3分钟。该程序在本地运行良好。空闲3分钟后,连接将按计划断开。在Kubernetes中部署时,节点端口服务也可以正常访问它 但当我将sidecar注入这个后端pod时,出现了一个问题。连接工作不正常,经常中断,并且完全不正常。有时,当前端和后端发送消息时,它会突然中断。有时,在闲置约2分钟后会中断。有时连接只能持续几十秒 当连接中断时,后端将抛出java.io.EOFException,前端将接收on close事件 只要将侧车注入pod,就会出现这种现象(即使我使用节点端口服务访问pod)。另外,我做了一个测试,我使用Nginx将请求传输到istio-ingresgateway的31380端口,并按照如下方式配置网关vs和dr。但结果是一样的Kubernetes Pod注入istio侧车后,websocket连接将异常中断,kubernetes,websocket,istio,Kubernetes,Websocket,Istio,后端使用Springboot提供WebSocket连接,并将最大空闲时间设置为3分钟。该程序在本地运行良好。空闲3分钟后,连接将按计划断开。在Kubernetes中部署时,节点端口服务也可以正常访问它 但当我将sidecar注入这个后端pod时,出现了一个问题。连接工作不正常,经常中断,并且完全不正常。有时,当前端和后端发送消息时,它会突然中断。有时,在闲置约2分钟后会中断。有时连接只能持续几十秒 当连接中断时,后端将抛出java.io.EOFException,前端将接收on close事件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: msapi
version: product
name: msapi
namespace: test
spec:
replicas: 1
selector:
matchLabels:
run: msapi
template:
metadata:
labels:
run: msapi
spec:
containers:
- env:
- name: JAVA_OPTS
valueFrom:
configMapKeyRef:
key: jvm.options
name: test-config
image: test/msapi:1.0.0
imagePullPolicy: Always
name: msapi
ports:
- containerPort: 9000
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: msapi
namespace: test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 9000
selector:
run: msapi
type: ClusterIP
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ingress-test
namespace: test
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*.ingress.xxx.com'
port:
name: http
number: 80
protocol: HTTP
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: msapi
namespace: test
spec:
gateways:
- ingress-test
hosts:
- msapi.ingress.xxx.com
http:
- match:
- headers:
cookie:
regex: ^(.*?; ?)?(version=pre)(;.*)?$
route:
- destination:
host: msapi
subset: pre
- route:
- destination:
host: msapi
subset: product
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: msapi
namespace: test
spec:
host: msapi
subsets:
- labels:
version: product
name: product
- labels:
version: pre
name: pre
这里的问题是websocketUpgrade,一行但很重要 正如我在github上看到的那样 默认情况下,1.0版的Istio中启用了对WebSocket的支持: OP提供了另一个 websocketUpgrade在一段时间前被删除,不再需要 因此,它应该在不将其添加到虚拟服务的情况下工作 但是 如图所示并经OP确认,您仍然需要添加它 我发现只需要添加“websocketUpgrade:true”的conf 所以,如果您有相同的问题,您应该尝试将weboscketUpgrade添加到您的虚拟服务yaml中
如果这不起作用,还有另一个解决方法 你们有什么K8s和istio版本?您有哪些平台/基础设施?您可以安装并尝试运行istioctlxanalyze-k,看看它是否能在istiomesh中发现任何问题。您可以尝试使用MTL并进行检查,以确保这不是策略问题。k8s版本为1.13,istio版本为1.2.4。k8s构建在私有云上。我是否需要将istio升级到1.4.0不,istioctl是命令行工具,它独立于istio。上面提供了关于如何安装的链接,只有两行。如果发现了什么,请告诉我,你能尝试一下mtls的其他建议吗?如果问题仍然存在,请告诉我?istio在github上的响应误导了我很多,istio的撰稿人说websocketUpgrade在一段时间前被删除,不再需要了。当然你可以回答。谢谢你的帮助。