我有一个Ingress(默认为GKE),正在处理我的服务之前的所有SSL。我的服务之一是WebSocket服务(python autobahn)。当我使用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为其赋予会话亲和力,但似乎没有一个能够阻止断开的连接。 这是我的入口定义:
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”。 有什么建议吗?
答案 0 :(得分: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)
希望它对某人有帮助