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请求的目标Serviceproxy-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
相关产品推荐
相关产品推荐

