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

K8s Ingress配置问题:Socket.io与WebSocket无法建立连接求助

K8s Ingress下Socket.io与原生WebSocket连接问题解决指南

核心问题分析

当前Ingress配置缺少WebSocket协议升级的关键配置,同时Socket.io的多端点特性需要适配路径转发规则,导致连接无法建立。


具体解决步骤

1. 添加WebSocket代理支持的Ingress注解

Nginx Ingress默认不会自动处理WebSocket的Upgrade请求,必须添加以下注解开启协议转发:

nginx.ingress.kubernetes.io/upgrade-insecure-requests: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";

这组配置让Nginx正确识别WebSocket升级请求,并将连接转发到后端服务。

2. 适配Socket.io的路径转发规则

Socket.io会通过/socket.io/开头的子路径完成握手和通信,当前的/ct(/|$)(.*)规则可覆盖这类请求,但需确保客户端连接时指定正确前缀:

  • 客户端连接示例:
    const socket = io('http://demo.local.home/ct');
    
    此时客户端向/ct/socket.io/发请求,Ingress通过重写规则映射到后端服务的/socket.io/端点,匹配服务端监听配置。

3. 原生WebSocket的路径适配

Notification服务的原生WebSocket只需确保客户端连接路径匹配Ingress规则:

  • 客户端连接示例:
    const ws = new WebSocket('ws://demo.local.home/nt');
    
    配合第一步的Upgrade注解,Nginx会正确转发WebSocket连接请求。

4. 优化长连接超时配置

WebSocket是长连接,建议延长超时时间避免连接被主动断开:

nginx.ingress.kubernetes.io/proxy-read-timeout: '86400'
nginx.ingress.kubernetes.io/proxy-send-timeout: '86400'

5. 修改后的完整Ingress配置

kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/proxy-body-size: 64m
    nginx.ingress.kubernetes.io/proxy-read-timeout: '86400'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '86400'
    nginx.ingress.kubernetes.io/proxy-connect-timeout: '3600'
    nginx.ingress.kubernetes.io/upgrade-insecure-requests: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
spec:
  rules:
    - host: demo.local.home
      http:
        paths:
          - path: /ct(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: ct-svc
                port:
                  number: 8110
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ct-svc
                port:
                  number: 8210
          - path: /nt(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: ntf-svc
                port:
                  number: 8111
          - path: /demo
            pathType: Prefix
            backend:
              service:
                name: dm-svc
                port:
                  number: 8290

验证方法

  1. 应用修改后的Ingress配置:kubectl apply -f your-ingress-file.yaml
  2. 重启Ingress控制器(如需要):kubectl rollout restart deployment nginx-ingress-controller -n ingress-nginx
  3. 使用客户端代码测试连接,查看服务端日志是否输出连接成功信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:55:54