minikube环境下NGINX Ingress访问WebSocket服务连接失败问题求助
我的问题和相关技术帖高度相似,我在minikube环境中尝试通过NGINX Ingress访问Socket服务,不确定v1.22.2版本的Kubernetes集群是否还需要配置官方文档中提到的特殊注解,我已参照多篇Stack Overflow的帖子和解决方案添加对应配置,均未生效。
直接端口转发服务时访问正常,但通过Ingress访问时报错如下:
WebSocket connection to 'ws://textchess.com/socket.io/?EIO=4&transport=websocket' failed:
我已在本地driver\etc\host文件中将minikube IP映射为textchess.com,以下是我的相关代码及配置:
index.js
const express = require("express"); const { createServer } = require("http"); const { Server } = require("socket.io"); const app = express(); const httpServer = createServer(app); const io = new Server(httpServer, { cors: { origin: "*", methods: ["GET", "POST"], }, }); io.on("connection", (socket) => { console.log("connection established"); socket.on("client_emit", (arg) => { socket.emit("server_emit", arg); }); }); httpServer.listen(3000);
Deployment/ClusterIP服务配置
apiVersion: apps/v1 kind: Deployment metadata: name: socket-deployment labels: app: socket spec: replicas: 1 selector: matchLabels: app: socket template: metadata: labels: app: socket spec: containers: - name: socket image: socket --- # clusterIP service apiVersion: v1 kind: Service metadata: name: socket-srvc spec: type: ClusterIP selector: app: socket ports: - name: socket-port protocol: TCP port: 3000 targetPort: 3000
Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/use-regex: "true" nginx.org/websocket-services: "socket-srvc" spec: rules: - host: textchess.com http: paths: - path: /test pathType: Prefix backend: service: name: socket-srvc port: number: 3000 - path: /socket.io/.* pathType: Prefix backend: service: name: socket-srvc port: number: 3000 ingressClassName: nginx --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: nginx spec: controller: k8s.io/ingress-nginx
客户端代码
<script> // const socket = io("http://localhost:3000", { transports: ["websocket"] }); const socket = io("http://textchess.com:/test", { reconnection: true, transports: ["websocket"], }); socket.on("server_emit", (args) => { console.log(args); }); document.getElementById("event_emitter").onclick = function changeContent() { var d = new Date(); var time = d.toLocaleTimeString(); socket.emit("client_emit", time); }; </script>
内容的提问来源于stack exchange,提问作者Kaustav Ganguli
相关产品推荐
相关产品推荐

