首页 > 解决方案 > 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

标签: kuberneteswebsocketistio

解决方案


这里的问题是 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上有另一个想法如何解决这个问题。


推荐阅读