Asp.net-Core

SignalR 通過 K8S Ingress 連接

  • January 13, 2020

我正在嘗試公開託管在 Kubernetes (Azure) pod 中的 SignalR 集線器。基本上,身份驗證和握手步驟工作正常,但是當我觸發某些操作時,所有通過 k8s Ingress 連接的客戶端都不會收到消息。有沒有人遇到過這個問題,或者只是通過 Kubernetes - Ingress 共享了 SignalR 集線器?

入口.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

嘗試:

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 服務,它應該會消除許多令人頭疼的問題(也在上面的範例中)。

不熟悉 SignalR,但可能有幾件事。

  1. nginx Ingress 可能正在剝離 SignalR 需要的一些 http 標頭。您熟悉 SignalR 應該接收的 http 標頭嗎?
  2. 進行身份驗證後,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>

希望能幫助到你!

引用自:https://stackoverflow.com/questions/52413606