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

Kubernetes中Pod无法建立WebSocket连接问题求助

问题排查与解决方案

1. 立即修复Ingress主机名不匹配问题

你的Ingress规则中,游戏服务器对应的host字段写的是match.languageattack.com,但你明确说明游戏服务器的CNAME是match.test.com,这会导致Ingress无法正确路由该域名的请求,是连接失败的核心原因之一。

修改后的Ingress配置(已添加WebSocket支持注解):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: lang-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    # 开启WebSocket长连接支持
    nginx.ingress.kubernetes.io/websocket-services: "game-backend-service"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-set-header: "Upgrade $http_upgrade"
    nginx.ingress.kubernetes.io/proxy-set-header: "Connection \"upgrade\""
spec:
  tls:
  - hosts:
      - matchmaking.test.com
      - match.test.com
    secretName: lang-tls-production
  rules:
    - host: matchmaking.test.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: admin-backend-service
                port:
                  number: 80
    # 修正此处host为match.test.com
    - host: match.test.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: game-backend-service
                port:
                  number: 80

2. 启用Nginx Ingress的WebSocket支持

Nginx Ingress默认不会自动处理WebSocket的升级请求,必须添加专属注解:

  • websocket-services:指定处理WebSocket请求的目标Service
  • proxy-read-timeout/proxy-send-timeout:延长长连接超时时间,避免被Nginx主动断开
  • proxy-set-header:传递WebSocket升级所需的HTTP头,确保协议转换正常

3. 优先使用集群内部Service访问(推荐)

匹配服务器和游戏服务器都在K8s集群内,没必要走外部Ingress域名,直接用集群内部Service DNS访问更高效,还能规避外部解析、SSL证书等问题:

  • 将匹配服务器的连接地址替换为:ws://game-backend-service:80/socket(集群内部通信无需SSL,安全可控)
  • 若必须用SSL,可配置集群内部TLS Ingress或Service Mesh,避免依赖外部证书

4. 检查游戏服务器的Service配置

确认game-backend-service的targetPort是否正确指向游戏服务器Pod中WebSocket监听的端口,示例配置:

apiVersion: v1
kind: Service
metadata:
  name: game-backend-service
spec:
  ports:
    - port: 80
      targetPort: 8080  # 此处需与游戏服务器Pod的监听端口一致
  selector:
    app: game-backend  # 确保selector匹配游戏服务器Pod的标签

5. 排查SSL证书信任问题(若坚持用wss)

如果一定要通过外部wss域名访问,需确认匹配服务器的Java环境信任Let's Encrypt根证书:

  • Java默认信任库cacerts可能未包含该证书,需手动导入
  • 测试阶段可临时禁用证书验证(仅用于排查,生产环境禁止):在Java WebSocket或Netty的SSL配置中跳过证书校验

测试方法

进入匹配服务器Pod,用curl验证WebSocket连接:

curl -i -N -H "Connection: Upgrade" \
     -H "Upgrade: websocket" \
     -H "Host: match.test.com" \
     -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
     -H "Sec-WebSocket-Version: 13" \
     https://match.test.com/socket

若返回101 Switching Protocols,说明WebSocket连接正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:05:24