kubernetes - Kubernetes 集群中的 Websocket 连接与 nginx-ingress
问题描述
我正在尝试在运行在 Kubernetes 集群中的服务器上建立一个简单的 websocket 连接。
Websocket 连接能够在我的本地测试机器上建立,但是在我使用 nginx-ingress 部署到 GKE 后,我无法将客户端连接到服务器。
入口 yaml 文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
spec:
rules:
- host: my-socket.com
http:
paths:
- path: /
backend:
serviceName: socket-cluster-ip-service
servicePort: 3000
- host: www.my-socket.com
http:
paths:
- path: /
backend:
serviceName: socket-cluster-ip-service
servicePort: 3000
服务 yaml 文件:
apiVersion: v1
kind: Service
metadata:
name: socket-cluster-ip-service
spec:
type: ClusterIP
selector:
component: socket
ports:
- port: 3000
targetPort: 3000
部署yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: socket-deployment
spec:
replicas: 1
selector:
matchLabels:
component: socket
template:
metadata:
labels:
component: socket
spec:
containers:
- name: socket
image: gcr.io/my-socket/socket
ports:
- containerPort: 3000
快递服务器代码:
...
var server = http.createServer(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server: server });
wss.on('connection', function connection(ws) {
console.log("new connection", ws)
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
...
客户端代码:
var ws = new WebSocket('ws://www.my-socket.com/');
ws.onopen = () => {
// connection opened
ws.send('something'); // send a message
};
ws.onmessage = (e) => {
// a message was received
console.log(e.data);
};
ws.onerror = (e) => {
// an error occurred
console.log(e.message);
};
ws.onclose = (e) => {
// connection closed
console.log(e.code, e.reason);
};
我不断从客户端收到错误消息“无效的 Sec-WebSocket-Accept 响应”。但我认为这只是客户端无法与服务器建立websocket连接的事实。
我使用的服务器端库是ws
根据其他帖子和官方 ingress-nginx 文档的建议,我已在我的入口 yaml 文件中添加了以下注释,但它仍然无法正常工作:
nginx.org/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/websocket-services : "socket-cluster-ip-service"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
解决方案
对我来说,它就像一个魅力!
我
在我的私有 kubernetes 集群上使用kong-docker-kubernetes-ingress-controller.bintray.io/kong-ingress-controller:0.9.0 。
因此,您的问题可能与 GCE 有关。
另请检查您的 TLS 配置。
在您的帖子中,您提到ws://...
了而不是wss://
,这表明您甚至不使用 TLS。这可能会被您的浏览器(例如 Chrome)拒绝。
推荐阅读
- python - Python spavro - 使用多个 avro 模式的联合解析 avro 模式
- python - 从 lambda 函数中访问 AWS API?
- python - 具有多个元素的数组的真值不明确如何修复
- node.js - 如何确定需求来源?
- pandas - 熊猫获得总价值
- amazon-web-services - VPC 服务可用区是否需要匹配 VPC 终端节点区?
- javascript - jQuery .is(':checked') 返回错误值
- mysql - 内连接子查询 Django ORM 等效
- node.js - ReferenceError:未定义 FullCalendar
- python - 为什么没有从字典列表值中删除项目