【发布时间】:2020-03-01 00:52:33
【问题描述】:
我的 react 应用程序与 nodejs socket.io 应用程序聊天时遇到问题。
但是,我已缩小范围并认为这是入口配置错误。端口转发 socket.io nodejs pod 并通过 127.0.0.1:3020 与 react 连接工作正常。
Socket.io 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: websockettest-deployment
spec:
replicas: 1
selector:
matchLabels:
component: websockettest
template:
metadata:
labels:
component: websockettest
spec:
containers:
- name: websockettest
image: websockettest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3020
Socket IO 服务配置
apiVersion: v1
kind: Service
metadata:
name: websockettest-cluster-ip-service
spec:
type: ClusterIP
selector:
component: websockettest
ports:
- port: 3020
targetPort: 3020
入口配置
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.org/websocket-services: websockettest-cluster-ip-service
spec:
rules:
- http:
paths:
- path: /websockettest/?(.*)
backend:
serviceName: websockettest-cluster-ip-service
servicePort: 3020
Nodejs Socket.io
const http = require('http');
const express = require('express');
var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);
io.set("transports", ["websocket"]);
io.on('connection', function (socket) {
console.log('connected socket!');
socket.on('greet', function (data) {
console.log(data);
socket.emit('respond', { hello: 'Hello' });
});
socket.on('disconnect', function () {
console.log('Socket disconnected');
});
});
const port = process.env.PORT || 3020;
server.listen(port, () => {
console.log(`Server is up on port ${port}`);
});
React Socket.io-client
// Various Attempts:
// websockettest
// websockettest-cluster-ip-service
// http://192.168.64.11:3020
// :3020/websockettest
// 127.0.0.1:3020 - port forwarding works
const socket = io('192.168.64.11/websockettest', {
'reconnection': false,
transports: ['websocket']
});
【问题讨论】:
-
io('192.168.64.11/websockettest', {是错误的。它应该是io(':3020/websockettest/', {注意端口和斜杠(因为你的正则表达式) -
如果你想要80端口那么你需要将
port: 3020更改为port: 80,然后基本上忘记3020客户端因为它转发到80 -
您好,感谢您的回复。我在 ingress + 服务中将端口更新为 80,并交换为 io(':80/websockettest/')。不幸的是,没有运气。
标签: node.js reactjs kubernetes socket.io kubernetes-ingress