首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用https时GKE插入删除websocket连接

使用https时GKE插入删除websocket连接
EN

Stack Overflow用户
提问于 2018-08-01 08:17:21
回答 1查看 1.1K关注 0票数 4

我有一个输入(默认的GKE ),它在我的服务之前处理所有的SSL。我的服务之一是WebSocket服务(python )。当我使用LoadBalancer公开服务而不是传递时,使用ws://我们可以正常工作。相反,当我使用NodePort公开它并通过入口时,我经常看到连接在下降,即使没有客户端连接。下面是高速公路日志:

代码语言:javascript
复制
WARNING:autobahn.asyncio.websocket.WebSocketServerProtocol:dropping connection to peer tcp:10.156.0.58:36868 with abort=False: None

当我使用wss://客户端连接时,连接是成功的,但断开连接每隔几秒钟发生一次(无法获得一致的数字)。虽然我不认为这是相关的,但我将GCE中相关后端服务的超时更改为3600秒,并尝试使用clientIP和cookie赋予它会话亲和力,但似乎没有一个可以阻止掉的连接。这是我的入口定义:

代码语言:javascript
复制
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服务是“服务器-内部-ws-服务”。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 14:00:02

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

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

代码语言:javascript
复制
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

然后

代码语言:javascript
复制
kubectl apply -f [path to the yaml above]

在服务器部署中挂载秘密:

代码语言:javascript
复制
    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代码中:

代码语言:javascript
复制
 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)

希望它能帮到别人

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51628477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档