You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes部署后Socket.io连接返回404,本地运行正常如何排查?

问题根因

你遇到的问题核心是3个配置缺失:

  1. Nginx Ingress未配置WebSocket代理支持
  2. Ingress路径前缀未重写,导致Socket.IO请求路径与服务端监听路径不匹配
  3. 多副本部署未配置会话亲和,导致Socket.IO的长连接会话被打散到不同实例

解决方案

1. 修正Ingress配置

新增WebSocket相关注解和路径重写注解,完整Ingress配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-service-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"
    nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, OPTIONS, DELETE, PATCH
    # 新增WebSocket支持配置
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/upgrade: "websocket"
    nginx.ingress.kubernetes.io/connection-proxy-header: "upgrade"
    # 新增路径重写:把/project前缀去掉再转发到后端服务
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
    - hosts:
        - my.host.com
      secretName: my-service-tls
  rules:
    - host: "my.host.com"
      http:
        paths:
          # 路径修改为捕获所有/project后的内容
          - pathType: Prefix
            path: "/project/(.*)"
            backend:
              service:
                name: my-service
                port:
                  number: 80

2. 配置Service会话亲和

修改Service配置,开启客户端IP会话亲和,保证同一个用户的请求始终打到同一个Pod:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 8088
  selector:
    app: my-service
  # 新增会话亲和配置
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600

如果是生产环境长期使用,建议搭配socket.io-redis适配器实现跨实例的消息同步,不需要依赖会话亲和。

3. 前端连接配置

HTTPS站点必须使用wss协议,连接配置如下即可:

const io = require("socket.io-client");
const socket = io("wss://my.host.com", { path: "/project/socket.io" });

Kubernetes Pod内查询RabbitMQ地址方法

  1. 首先获取Pod名称:kubectl get pods -l app=my-service
  2. 进入Pod终端:kubectl exec -it <替换为实际Pod名称> -- bash
  3. 执行以下任意操作查询:
    • 查看环境变量:printenv | grep -i rabbit,一般部署时会把RabbitMQ地址注入为环境变量
    • 查看服务配置文件:直接读取服务加载的配置文件内容,查找RabbitMQ连接URI
    • K8s集群内部可直接通过RabbitMQ的Service名称访问,如果你RabbitMQ的Service名为rabbitmq,命名空间为默认default,内部连接地址格式为amqp://<用户名>:<密码>@rabbitmq:5672/<vhost>

内容的提问来源于stack exchange,提问作者Thomas Colbert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:54:00