最近我一直在使用Kubernetes开发一个玩具应用程序。该应用程序的一部分是需要支持WebSocket的Web服务器。目前,我正在使用端口转发来访问Web服务器,并且一切正常。
我想切换为使用Ingress和IngressController以避免使用端口转发。
这是我的Ingress
配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/secure-backends: "true"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
spec:
rules:
- http:
paths:
- path: /app
backend:
serviceName: web-svc
servicePort: 3030
- path: /ws
backend:
serviceName: web-svc
servicePort: 3030
现在可以通过$(minikube ip)/app
访问该应用程序,但是WebSocket请求全部失败,因为nginx返回200,而不是101。
我尝试添加nginx.org/websocket-services
批注,但这似乎也不起作用。
有人遇到过类似情况吗?
欢呼
答案 0 :(得分:4)
通过查看nginx ingress controller docs和nginx docs,您可能需要这样的内容作为Kubernetes Ingress
上的注释:
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
请注意,一旦添加了注释,您所有的Ingress
规则都将在nginx配置的location
块中包含该代码段。因此,如果您想忽略其他规则,则必须创建一个单独的Kubernetes Ingress
。
答案 1 :(得分:0)
这些对我有用。
似乎他们通过注释 (example in docs) 添加了支持:
nginx.org/websocket-services: "service1[,service2,...]"
我使用 telsocket 测试了我的连接,这是连接到 WS/WSS 套接字的小工具。
有各种不同的客户端,这也可能有助于找到连接的罪魁祸首。