Google Kubernetes中Nginx Ingress的WebSocket粘性会话问题
Google Kubernetes环境下WebSocket粘性会话问题排查与解决
问题核心结论
Ingress与部署不在同一命名空间是导致配置失效的关键原因之一:Nginx Ingress的会话亲和注解依赖于正确关联后端Service,若Ingress和目标Service分属不同命名空间,且未在Ingress配置中明确指定Service的命名空间,Ingress无法正确绑定到后端服务,会话亲和规则根本不会生效,自然不会生成粘性Cookie。此外,WebSocket场景还需额外配置Ingress的WebSocket支持规则。
具体解决步骤
1. 修正Ingress与Service的跨命名空间关联
在Ingress配置中明确指定后端Service的命名空间,确保Ingress能正确找到目标服务。同时添加WebSocket必需的支持注解:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-ws-ingress namespace: ingress-ns # 你的Ingress所在命名空间 annotations: # 会话亲和核心配置 nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "ws-sticky-cookie" nginx.ingress.kubernetes.io/session-cookie-expires: "172800" nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" # WebSocket支持必需配置 nginx.ingress.kubernetes.io/websocket-services: "service-ns/your-ws-service" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" spec: rules: - host: your-domain.com http: paths: - path: /ws pathType: Prefix backend: service: name: your-ws-service namespace: service-ns # 明确指定后端Service的命名空间 port: number: 80
2. 优化Service的会话亲和配置
给后端Service补充会话亲和规则,与Ingress配置形成双重保障:
apiVersion: v1 kind: Service metadata: name: your-ws-service namespace: service-ns # 与Pod/部署同命名空间 spec: selector: app: your-ws-app ports: - port: 80 targetPort: 8080 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 172800
3. 验证配置生效
- 重新应用配置文件:
kubectl apply -f ingress.yaml -f service.yaml - 检查Ingress控制器日志,确认无服务关联错误:
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller - 打开浏览器开发者工具,在
Application -> Cookies中查看是否生成指定名称的粘性Cookie - 发起WebSocket连接,通过Pod日志验证请求是否固定到同一实例
额外注意事项
- 若使用GKE原生Ingress(而非开源Nginx Ingress),需改用GKE专属配置:通过
cloud.google.com/backend-config注解关联BackendConfig资源,在BackendConfig中开启会话亲和 - 确保Nginx Ingress Controller版本不低于v0.29.0,旧版本对跨命名空间Service支持不完善
内容的提问来源于stack exchange,提问作者rtstorm
相关产品推荐
相关产品推荐

