后端使用Springboot提供websocket连接,并将最大空闲时间设置为3分钟。该程序在本地运行良好。空闲3分钟后,连接将按计划断开。部署在kubernetes中时,nodeport服务也可以正常访问它。
但是当我将sidecar注入此后端吊舱时,出现了问题。连接无法正常工作,经常断开并且是完全不规则的,有时在前端和后端发送消息时,它突然被中断,有时在空闲大约2分钟后被中断,有时连接只能持续数十次秒。
当连接中断时,后端将抛出java.io.EOFException,而前端将收到onclose事件。
只要将sidecar注入pod中,就会发生这种现象(即使我使用nodeport服务访问pod)。我也做了一个测试,我使用nginx将请求传输到istio-ingressgateway的端口31380,并进行了配置网关vs和dr如下。但是结果是相同的。
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 there上找到
默认情况下,Istio从版本1.0起启用对Websocket的支持:https://godoc.org/istio.io/api/networking/v1alpha3#HTTPRoute
OP提供了另外一个there
websocketUpgrade在一段时间前已被删除,不再需要。
因此它应该可以正常运行而无需将其添加到虚拟服务中。
HOWEVER
如github issue上显示并由OP确认,您仍然必须添加它。
我发现只需要添加“ websocketUpgrade:true”的conf。
因此,如果您遇到相同的问题,则应尝试将weboscketUpgrade添加到虚拟服务Yaml。
如果不起作用,github上还有另一个解决方法。