WebSocket握手期间出错:带Ingress的Minikube上出现意外的响应代码:502



尝试在带有ingress的minikube上创建一个简单的websocket服务器。使用ws://192.168.99.119/连接时,出现以下错误。

到"ws://192.168.99.119/"的WebSocket连接失败:WebSocket握手期间出错:意外的响应代码:502

请帮我解决这个问题。以下提供了实施的详细情况。

Websocket服务器实现

import * as express from 'express';
import * as http from 'http';
import * as WebSocket from 'ws';
interface ExtWebSocket extends WebSocket {
id: string; // your custom property
isAlive: boolean
}
const PORT = parseInt(process.env.NODE_PORT) || 8010;
const app = express();
//initialize a simple http server
const server = http.createServer(app);
//initialize the WebSocket server instance
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws: ExtWebSocket) => {
//connection is up, let's add a simple simple event
ws.on('message', (message: string) => {
//log the received message and send it back to the client
console.log('received: %s', message);
const broadcastRegex = /^broadcast:/;
ws.isAlive = true;
ws.on('pong', () => {
ws.isAlive = true;
});
if (broadcastRegex.test(message)) {
message = message.replace(broadcastRegex, '');
//send back the message to the other clients
wss.clients
.forEach(client => {
if (client != ws) {
client.send(`Hello, broadcast message -> ${message}`);
}
});
} else {
ws.send(`Hello, you sent -> ${message}`);
}
});
//send immediatly a feedback to the incoming connection
ws.send('Hi there, I am a WebSocket server');
});
setInterval(() => {
wss.clients.forEach((ws: ExtWebSocket) => {
if (!ws.isAlive) return ws.terminate();
ws.isAlive = false;
ws.ping(null, false);
});
}, 10000);
//start our server
server.listen(PORT, () => {
console.log(`Server started on port ${JSON.stringify(server.address())}`);
});

Dockerfile


FROM node:alpine
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
CMD ["node","./dist/server.js"]
EXPOSE 8010

Websocket服务yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: socketserver
spec:
replicas: 1
selector:
matchLabels:
app: socketserver
template:
metadata:
labels:
app: socketserver
spec:
containers:
- name: socketserver
image: kireeti123/socketserver:1.0.2
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8010
name: wsport
---
apiVersion: v1
kind: Service
metadata:
name: socketserver-svc
spec:
selector:
app: socketserver
ports:
- port: 8010
targetPort: 80
---

Ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: demo-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/websocket-services: socketserver-svc
nginx.org/websocket-services: socketserver-svc
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: socketserver-svc
servicePort: 80

为什么targetPort设置为80,而Pod公开端口8010?这行不通。

切换Service定义中的端口号,使其看起来像下面的示例:

apiVersion: v1
kind: Service
metadata:
name: socketserver-svc
spec:
selector:
app: socketserver
ports:
- port: 80
targetPort: 8010

我希望它能有所帮助。

最新更新