将Pod注入istio的边车后,websocket连接将被异常中断

问题描述 投票:2回答:1

后端使用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
kubernetes websocket istio
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.