Kubernetes部署后Socket.io连接返回404,本地运行正常如何排查?
问题根因
你遇到的问题核心是3个配置缺失:
- Nginx Ingress未配置WebSocket代理支持
- Ingress路径前缀未重写,导致Socket.IO请求路径与服务端监听路径不匹配
- 多副本部署未配置会话亲和,导致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地址方法
- 首先获取Pod名称:
kubectl get pods -l app=my-service - 进入Pod终端:
kubectl exec -it <替换为实际Pod名称> -- bash - 执行以下任意操作查询:
- 查看环境变量:
printenv | grep -i rabbit,一般部署时会把RabbitMQ地址注入为环境变量 - 查看服务配置文件:直接读取服务加载的配置文件内容,查找RabbitMQ连接URI
- K8s集群内部可直接通过RabbitMQ的Service名称访问,如果你RabbitMQ的Service名为
rabbitmq,命名空间为默认default,内部连接地址格式为amqp://<用户名>:<密码>@rabbitmq:5672/<vhost>
- 查看环境变量:
内容的提问来源于stack exchange,提问作者Thomas Colbert
相关产品推荐
相关产品推荐

