Kubernetes集群迁移后Nginx-Ingress WebSocket配置问题咨询
Kubernetes Nginx-Ingress 配置WebSocket解决方案
核心结论
通过Helm安装的官方ingress-nginx/ingress-nginx完全支持WebSocket,你的问题出在混用了不同Ingress控制器的注释——当前配置同时使用了官方nginx-ingress的nginx.ingress.kubernetes.io/*注释和NGINX官方控制器的nginx.org/*注释,导致WebSocket相关配置不生效。
问题分析
你用helm install ingress-nginx ingress-nginx/ingress-nginx安装的是kubernetes社区维护的ingress-nginx控制器,而nginx.org/websocket-services、nginx.org/lb-method这类注释属于NGINX官方发布的独立Ingress控制器,两者注释体系不兼容,所以你的WebSocket配置等于未生效。
修正后的Ingress配置
替换成以下配置,移除无效注释,补充正确的WebSocket支持配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: production-server annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "route" nginx.ingress.kubernetes.io/session-cookie-expires: "172800" nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # 替代原nginx.org/lb-method,实现ip_hash负载均衡 nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" # 调整长连接超时时间,WebSocket需要更长超时避免连接被断开 nginx.ingress.kubernetes.io/proxy-connect-timeout: "10s" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600s" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600s" # 官方nginx-ingress的WebSocket服务指定注释 nginx.ingress.kubernetes.io/websocket-services: "production-server" spec: rules: - host: test.example.com http: paths: - path: / pathType: Prefix backend: service: name: production-server port: number: 8000 tls: - secretName: production-cert hosts: - test.example.com
关键修改点说明
- 移除所有
nginx.org/*注释:这类注释对当前安装的控制器无效,直接删除即可 - 替换负载均衡策略注释:如果需要
ip_hash效果,用nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"替代原注释 - 延长代理超时时间:WebSocket是长连接,原10s超时会导致连接被主动断开,调整为3600s(1小时)或根据业务需求设置更长时间
- 使用正确的WebSocket注释:
nginx.ingress.kubernetes.io/websocket-services指定处理WebSocket请求的后端服务,确保Ingress正确转发握手请求
应用修正后的配置:
kubectl apply -f 你的Ingress配置文件名.yaml
内容的提问来源于stack exchange,提问作者MrTux01
相关产品推荐
相关产品推荐

