gpt4 book ai didi

websocket - GKE Ingress 在使用 https 时丢弃 websocket 连接

转载 作者:行者123 更新时间:2023-12-04 13:44:21 25 4
gpt4 key购买 nike

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

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

当我使用带有 wss://的客户端连接时,连接成功但是
每隔几秒就会断开连接(无法获得一致的数字)。
尽管我认为这无关紧要,但我将 GCE 中相关后端服务的超时更改为 3600 秒,并尝试使用 clientIP 和 cookie 为其赋予 session 亲缘关系,但似乎都没有停止断开连接。
这是我的入口定义:
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”。
有什么建议?

最佳答案

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

要创建证书 key ,请创建一个 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]

在您的服务器部署中挂载 secret :
    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)

希望它可以帮助某人

关于websocket - GKE Ingress 在使用 https 时丢弃 websocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51628477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com