用于websocket应用程序的nginx-ingress粘性会话

时间:2019-05-27 15:01:55

标签: websocket nginx-ingress azure-kubernetes sticky-session

我在K8s集群中有一个websocket .net应用程序。我需要使用nginx开源实现websocket的粘性会话。

我已经阅读了Nginx和kubernetes的文档。 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#session-affinity

它说我们可以将以下配置用于粘性会话:

nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "ingresscoookie"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800

但是这似乎不起作用。我在https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/affinity/cookie/ingress.yaml这里尝试了kubernetes提供的示例代码。

这对我有用,因此我认为基于cookie的会话亲和力似乎不适用于websocket。

在进一步挖掘文档时,它说我可以使用IP哈希 算法。所以我尝试使用下面的注释。

nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"

这也失败了。使用默认算法仍然可以平衡请求。

如何实现会话持久性?

1 个答案:

答案 0 :(得分:0)

我知道过时的帖子,但可能会对他人有所帮助。您是否删除/注释了亲和力和会话注释?

此代码段对我有用,但是如果您保留了其他注释(例如,我无法获得基于Cookie的相似性,那么就无法使用-并且我需要粘性会话,因为在本地创建了防伪令牌)到我的网络服务)。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-world-ingress
  namespace: nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.org/ssl-services: "hello-world-svc"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/upstream-hash-by: $remote_addr
spec:
  tls:
    - hosts:
      - nginx.mydomain.co.uk
      secretName: tls-certificate
  rules:
  - host: nginx.mydomain.co.uk
    http:
      paths:
      - path: /web1(/|$)(.*)      
        backend:
          serviceName: hello-world-svc
          servicePort: 80