首页 文章

使用https时,GKE Ingress丢弃websocket连接

提问于
浏览
1

我有一个Ingress(默认的GKE),它在我的服务之前处理所有的SSL . 我的一项服务是WebSocket服务(python autobahn) . 当我使用LoadBalancer公开服务而没有通过抛出入口时,使用ws://我们工作的一切都很好 . 相反,当我使用NodePort公开它并通过入口时,即使没有客户端连接,我也经常看到连接丢失 . 这是autobahnlogs:

WARNING:autobahn.asyncio.websocket.WebSocketServerProtocol:dropping connection to peer tcp:10.156.0.58:36868 with abort=False: None

当我使用带有wss://的客户端进行连接时,连接成功但每隔几秒就会发生断开连接(无法获得一致的数字) . 虽然我认为它不相关我将GCE中相关后端服务的超时时间更改为3600秒,并且还尝试使用clientIP和cookie为其提供会话关联,但似乎都没有停止丢弃连接 . 这是我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ .Values.ingressName }}-ingress
  annotations:
      kubernetes.io/ingress.global-static-ip-name: {{ .Values.staticIpName }}-static-ip
  labels:
    oriient-app: "rest-api"
    oriient-system: "IPS"
spec:
  tls:
  - secretName: sslcerts
  rules:
  - host: {{ .Values.restApiHost }}
    http:
      paths:
      - backend:
          serviceName: rest-api-internal-service
          servicePort: 80
  - host: {{ .Values.dashboardHost }}
    http:
      paths:
      - backend:
          serviceName: dashboard-internal-service
          servicePort: 80
  - host: {{ .Values.monitorHost }}
    http:
      paths:
      - backend:
          serviceName: monitor-internal-service
          servicePort: 80
  - host: {{ .Values.ipsHost }}
    http:
      paths:
      - backend:
          serviceName: server-internal-ws-service
          servicePort: 80

ws服务是“server-internal-ws-service” . 有什么建议?

1 回答

  • 1

    我没有解决这个问题,但是我确实通过使用LoadBalancer服务暴露了我的wss并且我自己实现了WebSocket的安全层 . 我将证书(私钥和全链公钥 - pem格式)保存为秘密并将其作为卷安装,然后在python中使用SSLContex并将其传递给asyncio循环创建服务器 .

    要创建证书,请创建一个yaml:

    apiVersion: v1
    kind: Secret
    type: tls
    metadata:
      name: sslcerts
    data:
      # this is base64 of your pem fullchain and private key
      tls.crt: XXX 
      tls.key: YYY
    

    然后

    kubectl apply -f [path to the yaml above]
    

    在您的服务器部署中安装秘密:

    apiVersion: apps/v1beta2
        kind: Deployment
        metadata:
          labels:
            ...
          name: server
        spec:
          replicas: {{ .Values.replicas }}
          selector:
            matchLabels:
              ...
          template:
            metadata:
              labels:
                ...
            spec:
              volumes:
              - name: wss-ssl-certificate
                secret:
                  secretName: sslcerts
           containers:
            - image: ...
            imagePullPolicy: Always
            name: server
            volumeMounts:
              - name: wss-ssl-certificate
                mountPath: /etc/wss
    

    并在python代码中:

    sslcontext = ssl.SSLContext()
     sslcontext.load_cert_chain(/etc/wss/tls.crt, /etc/wss/tls.key)
     wssIpsClientsFactory = WebSocketServerFactory()
     ...        
     loop = asyncio.get_event_loop()
     coro = loop.create_server(wssIpsClientsFactory, '0.0.0.0', 9000, ssl=sslcontext)
     server = loop.run_until_complete(coro)
    

    希望它可以帮助某人

相关问题