kubernetes - Pod注入到istio的sidecar后,websocket连接会异常中断
问题描述
后端使用 Springboot 提供 WebSocket 连接,并将最大空闲时间设置为 3 分钟。该程序在本地运行良好。空闲 3 分钟后,连接将按计划断开。部署在 Kubernetes 中也可以通过节点端口服务正常访问。
但是当我将 sidecar 注入这个后端 pod 时,出现了问题。连接无法正常工作,经常中断,并且完全不规则。有时前端和后端正在发送消息时,突然中断。有时它会在大约 2 分钟空闲后中断。有时连接只能持续几十秒。
当连接中断时,后端会抛出 java.io.EOFException,前端会收到 on close 事件。
只要将sidecar注入到pod中就会出现这种现象(即使我使用节点端口服务访问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上找到的那样
从 1.0 版开始,Istio 默认启用对 websockets 的支持:https ://godoc.org/istio.io/api/networking/v1alpha3#HTTPRoute
OP在那里提供了另一个
websocketUpgrade 前段时间被删除,不再需要。
所以它应该可以在不将其添加到虚拟服务的情况下工作。
然而
如github问题所示并由OP确认您仍然必须添加它。
我发现只需要添加“websocketUpgrade:true”的conf。
因此,如果您有同样的问题,您应该尝试将 weboscketUpgrade 添加到您的虚拟服务 yaml。
如果这不起作用,github上有另一个想法如何解决这个问题。
推荐阅读
- c# - RaspBerry PI 信标蓝牙 C#
- python - 如何使用 nbconvert+pandoc 在 pdf 中呈现 pd.DataFrame 表
- linux - 如何在 bash 中移动/分组特定文件夹?
- ios - iOS 应用程序未收到 UDP 广播数据报
- reactjs - 如何在组件道具界面中键入 mapDispatchToProps
- react-native - React Native:如何在 react native v5(不是 v4)中将多个 stackNavigator 包含到一个 DrawerNavigator 中
- reactjs - CDataTable (Core UI React) prop onPageChange 触发 2 次
- image - 网站更新清除所有客户端设备上的缓存,以便更新图像和内容
- r - 一个矩阵的行名和列名到另一个矩阵
- angular - 如何使用角度中的elementRef在一个分区中搜索选定的复选框