首页 > 解决方案 > SignalR Websocket 通过 K8S 入口

问题描述

我有一个简单的 SignalR 客户端服务器设置,其中我的服务器由运行在 kubernetes 集群中的 Web 应用程序组成,通过入口控制器公开服务,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    # Enable PROXY protocol
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
  name: coreapilocal-ingress
spec:
  rules:
  - host: coreapilocal.localhost
    http:
      paths:
      - backend:
          serviceName: coreapilocal-service
          servicePort: 80
        path: /
      - backend:
          serviceName: coreapilocal-service
          servicePort: 80
        path: /*

以及试图通过入口调用 SignalR Server 方法的 HTML 客户端?但是由于某种原因,这个调用是否被忽略了?

我在某处读到 Http 被入口剥夺了?从而无法识别呼叫?有什么办法可以避免这种情况吗?或者解决这个问题?

我在上面尝试了我在 SE 中找到的不同帖子,但这在我的情况下似乎不起作用..

标签: kubernetessignalrnginx-ingress

解决方案


要使 SignalR 正常工作(以及通常用于 WebSockets),您应该启用粘性会话

将注解添加nginx.ingress.kubernetes.io/affinity: "cookie"到入口工作负载定义中:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    # Enable PROXY protocol
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
    nginx.ingress.kubernetes.io/affinity: "cookie"
  name: coreapilocal-ingress
spec:
  rules:
  - host: coreapilocal.localhost
    http:
      paths:
      - backend:
          serviceName: coreapilocal-service
          servicePort: 80
        path: /
      - backend:
          serviceName: coreapilocal-service
          servicePort: 80
        path: /*

推荐阅读