Kubernetes Pod注入istio侧车后,websocket连接将异常中断

Kubernetes Pod注入istio侧车后,websocket连接将异常中断,kubernetes,websocket,istio,Kubernetes,Websocket,Istio,后端使用Springboot提供WebSocket连接,并将最大空闲时间设置为3分钟。该程序在本地运行良好。空闲3分钟后,连接将按计划断开。在Kubernetes中部署时,节点端口服务也可以正常访问它 但当我将sidecar注入这个后端pod时,出现了一个问题。连接工作不正常,经常中断,并且完全不正常。有时,当前端和后端发送消息时,它会突然中断。有时,在闲置约2分钟后会中断。有时连接只能持续几十秒 当连接中断时,后端将抛出java.io.EOFException,前端将接收on close事件

后端使用Springboot提供WebSocket连接,并将最大空闲时间设置为3分钟。该程序在本地运行良好。空闲3分钟后,连接将按计划断开。在Kubernetes中部署时,节点端口服务也可以正常访问它

但当我将sidecar注入这个后端pod时,出现了一个问题。连接工作不正常,经常中断,并且完全不正常。有时,当前端和后端发送消息时,它会突然中断。有时,在闲置约2分钟后会中断。有时连接只能持续几十秒

当连接中断时,后端将抛出java.io.EOFException,前端将接收on close事件

只要将侧车注入pod,就会出现这种现象(即使我使用节点端口服务访问pod)。另外,我做了一个测试,我使用Nginx将请求传输到istio-ingresgateway的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中启用了对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在一段时间前被删除,不再需要了。当然你可以回答。谢谢你的帮助。