SignalR 通过 K8S Ingress 连接
Posted
技术标签:
【中文标题】SignalR 通过 K8S Ingress 连接【英文标题】:SignalR connection via K8S Ingress 【发布时间】:2019-02-24 02:03:18 【问题描述】:我正在尝试公开托管在 Kubernetes (Azure) pod 中的 SignalR 集线器。基本上,身份验证和握手步骤工作正常,但是当我触发某些操作时,所有通过 k8s Ingress 连接的客户端都不会收到消息。有没有人遇到过这个问题,或者只是通过 Kubernetes - Ingress 共享了 SignalR 集线器?
ingress.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: endpoints
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.org/websocket-services: "myservice"
spec:
rules:
- host: api.[MY-DOMAIN].com
http:
paths:
- backend:
serviceName: myservice
servicePort: 80
path: /myservice
【问题讨论】:
【参考方案1】:试试:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/session-cookie-hash: sha1
nginx.ingress.kubernetes.io/session-cookie-name: REALTIMESERVERID
我不久前写了一个示例项目,如果你想要一个工作示例:DenisBiondic/RealTimeMicroservices
附带说明一下,考虑使用 Azure SignalR 服务,它应该会消除许多令人头疼的问题(也在上面的示例中)。
【讨论】:
【参考方案2】:不熟悉 SignalR,但可能有几件事。
-
nginx Ingress 可能正在剥离 SignalR 需要的一些 http 标头。您是否熟悉 SignalR 应该接收的 http 标头?
身份验证后,SignalR 集线器是否有可能尝试使用 TLS?我看到你在没有 TLS 的端口 80 上运行它。您必须配置如下内容:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: endpoints
annotations:
kubernetes.io/ingress.class: addon-http-application-routing
ingress.kubernetes.io/ssl-redirect: "false" <== you may need to remove
nginx.ingress.kubernetes.io/ssl-redirect: "false" <== you may need to remove
nginx.org/websocket-services: "myservice"
spec:
rules:
- host: api.[MY-DOMAIN].com
http:
paths:
- backend:
serviceName: myservice
servicePort: 80
path: /myservice
tls:
- secretName: <your-tls-certs>
希望对你有帮助!
【讨论】:
以上是关于SignalR 通过 K8S Ingress 连接的主要内容,如果未能解决你的问题,请参考以下文章
企业运维实战--k8s学习笔记 通过Ingress-nginx实现k8s七层负载均衡Ingress加密认证以及地址重写