Kubernetes集群中SignalR/WebSockets对接Traefik故障排查求助
问题:Kubernetes中SignalR使用Redis状态存储出现「No Connection with that ID」错误
我正尝试在Kubernetes集群中实现SignalR/WebSockets功能,本地环境下用Redis做应用横向扩展的状态存储完全正常,但部署到线上集群后就弹出「No Connection with that ID」错误。应用访问地址:https://server.topswagcode.com/Home/Chat。
已经试过启用WebSockets、配置会话粘性这些方案,都没解决问题。补充信息:
- 将实例缩容至1个后问题仍未解决,似乎Redis连接未按预期工作
- 移除Redis后单实例运行时,SignalR可正常工作
现有配置文件
Service配置
apiVersion: v1 kind: Service metadata: name: dotnet-service annotations: # Enable sticky sessions for Traefik traefik.ingress.kubernetes.io/affinity: "true" # Optional: Set the cookie name used for sticky sessions traefik.ingress.kubernetes.io/session-cookie-name: "sticky-sess-id" spec: selector: app: dotnet ports: - protocol: TCP port: 8080
Deployment配置
apiVersion: apps/v1 kind: Deployment metadata: name: dotnet-deployment spec: replicas: 3 selector: matchLabels: app: dotnet template: metadata: labels: app: dotnet spec: containers: - name: dotnet image: ###### ports: - containerPort: 8080 env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: connectionstring valueFrom: secretKeyRef: name: postgresssecret key: connectionstring
Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster-issuer: letsencrypt-production kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/affinity: "true" traefik.ingress.kubernetes.io/websocket: "true" traefik.ingress.kubernetes.io/router.entrypoints: websecure traefik.ingress.kubernetes.io/session-cookie-name: "stickyCookie" traefik.ingress.kubernetes.io/websocket-endpoints: "/chat" traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd labels: app: dotnet name: dotnet namespace: default spec: rules: - host: server.topswagcode.com # Change by your domain http: paths: - backend: service: name: dotnet-service port: number: 8080 path: / pathType: Prefix tls: - hosts: - server.topswagcode.com # Change by your domain secretName: server-topswagcode-com-tls
排查思路
Redis连接与配置验证
- 进入应用Pod内部,执行
redis-cli -h <redis-host> ping或telnet <redis-host> 6379,确认网络连通性 - 检查应用的Redis连接字符串是否正确,包括密码、端口、数据库索引、集群模式(若使用Redis集群)是否与线上环境匹配
- 查看Redis服务日志,排查是否存在连接拒绝、认证失败、内存不足导致键值被淘汰的异常记录
- 进入应用Pod内部,执行
SignalR Redis背板配置检查
- 确认应用中SignalR的Redis背板是否配置了唯一的频道前缀,避免与其他应用的SignalR实例冲突
- 检查Redis是否开启持久化(RDB/AOF),防止Redis重启后SignalR连接状态丢失
- 验证Redis内存使用率,若内存不足会自动清理键值,导致连接状态无法同步
Kubernetes配置修正
- 统一Service和Ingress的会话Cookie名称:当前Service使用
sticky-sess-id,Ingress使用stickyCookie,需改为相同名称,确保Traefik的粘性会话生效 - 核对Ingress的WebSocket端点配置:确认
traefik.ingress.kubernetes.io/websocket-endpoints的值与SignalR Hub的实际路径一致(默认SignalR路径为/hub,需匹配你的Chat Hub路径) - 检查Deployment的环境变量:当前配置仅注入了PostgreSQL连接串,确认Redis连接串是否已通过环境变量或Secret正确注入到Pod中
- 查看应用Pod的日志,搜索SignalR相关错误,比如Redis连接失败、背板初始化异常的日志信息
- 统一Service和Ingress的会话Cookie名称:当前Service使用
SignalR协议与调试
- 在浏览器开发者工具的Network面板中,观察SignalR的握手请求、WebSocket连接的状态,排查是否存在4xx/5xx错误
- 启用SignalR的Debug级别日志,查看连接建立、消息转发的详细过程,确认Redis背板是否正确同步连接状态
内容的提问来源于stack exchange,提问作者Kiksen
相关产品推荐
相关产品推荐

