无法连接到在Kubernetes上运行的Docker容器中的套接字



我正在尝试连接到容器内部并部署在Kubernetes上的socket。在本地一切工作正常,但当部署时,它抛出连接错误。我尝试了不同的选择,但都没有成功。

客户机代码

const ENDPOINT = "https://traveling.dev/api/chat";  // this will go to the endpoint of service where socket is running
const chatSocket = io(ENDPOINT, {
rejectUnauthorized: false,
forceNew: true,
secure: false,
});
chatSocket.on("connect_error", (err) => {
console.log(err);
console.log(`connect_error due to ${err.message}`);
});
console.log("CS", chatSocket);

服务器代码
const app = express();
app.set("trust proxy", true);
app.use(cors());
const server = http.createServer(app);
const io = new Server(server, {
cors: {
origin: "*",
methods: ["*"],
allowedHeaders: ["*"],
},
});

io.on("connection", (socket) => {
console.log("Socket succesfully connected with id: " + socket.id);
});
const start = async () => {   
server.listen(3000, () => {
console.log("Started");
});
};
start();

事情是代码是无关紧要的,因为在本地它都工作得很好,但我张贴了它。在将其容器化并放在Kubernetes上时,什么会导致这种情况?

控制台日志显示服务器错误

Error: server error
at Socket.onPacket (socket.js:397)
at XHR.push../node_modules/component-emitter/index.js.Emitter.emit (index.js:145)
at XHR.onPacket (transport.js:107)
at callback (polling.js:98)
at Array.forEach (<anonymous>)
at XHR.onData (polling.js:102)
at Request.push../node_modules/component-emitter/index.js.Emitter.emit (index.js:145)
at Request.onData (polling-xhr.js:232)
at Request.onLoad (polling-xhr.js:283)
at XMLHttpRequest.xhr.onreadystatechange (polling-xhr.js:187)

有没有人对什么可能导致这个问题和如何解决它有任何建议?此外,如果您有任何关于如何获得有关错误的更多信息的想法,将不胜感激。

这是创建Service和Pod的YAML文件。

apiVersion: apps/v1
kind: Deployment
metadata:
name: chat-depl
spec:
replicas: 1
selector:
matchLabels:
app: chat
template:
metadata:
labels:
app: chat
spec:
containers:
- name: chat
image: us.gcr.io/forward-emitter-321609/chat-service 
---
apiVersion: v1
kind: Service
metadata:
name: chat-srv
spec:
selector:
app: chat
ports:
- name: chat
protocol: TCP
port: 3000
targetPort: 3000

我在GKE上使用nginx的负载均衡器,IP地址映射到traveling.dev

我的入口路由服务配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Access-Control-Allow-Origin: $http_origin";
spec:
rules:
- host: traveling.dev
http:
paths:
- path: /api/chat/?(.*)
backend:
serviceName: chat-srv
servicePort: 3000
- path: /?(.*)
backend:
serviceName: client-srv
servicePort: 3000

谢谢!

Nginx Ingress默认支持WebSocket代理,但您需要对其进行配置。为此,您需要添加注释自定义配置片段。

你可以参考这个已经回答的stackoverflow问题。

Nginx入口控制器websocket支持

最新更新