Search code examples
asp.net-corekubernetessignalr-hubtraefik-ingress

Kubernetes + SignalR / Websockets with Traefik


Edit: I tried scaling down to 1 instance and it still didn't work. Seems the connection to redis is not working as inteded. Removing redis and running instance, signalr is up and running again.

I am trying to get SignalR / Websockets to work on my cluster. It works locally with Redis as scaleout for my apps. But when I run it online i get the following error: "No Connection with that ID". The app is online here: https://server.topswagcode.com/Home/Chat

I have tried lots of different stuff with enabling websockets, trying to apply stickysessions etc. But doesn't seem to work. Hope someone might have an idea.

my service, deployment and ingress looks like the following:

Service:

apiVersion: v1
kind: Service
metadata:
  name: dotnet-service
  annotations:
    # Enable sticky sessions for Traefik
    traefik.ingress.kubernetes.io/affinity: "true"
    # Optional: Set the cookie name used for sticky sessions
    traefik.ingress.kubernetes.io/session-cookie-name: "sticky-sess-id"
spec:
  selector:
    app: dotnet
  ports:
    - protocol: TCP
      port: 8080

Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dotnet-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dotnet
  template:
    metadata:
      labels:
        app: dotnet
    spec:
      containers:
      - name: dotnet
        image: ######
        ports:
        - containerPort: 8080
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: connectionstring
            valueFrom:
              secretKeyRef:
                name: postgresssecret
                key: connectionstring

Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-production
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/affinity: "true"
    traefik.ingress.kubernetes.io/websocket: "true"
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/session-cookie-name: "stickyCookie"
    traefik.ingress.kubernetes.io/websocket-endpoints: "/chat"
    traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
  labels:
    app: dotnet
  name: dotnet
  namespace: default
spec:
  rules:
  - host: server.topswagcode.com # Change by your domain
    http:
      paths:
      - backend:
          service:
            name: dotnet-service
            port: 
              number: 8080
        path: /
        pathType: Prefix  
  tls:
  - hosts:
    - server.topswagcode.com # Change by your domain
    secretName: server-topswagcode-com-tls

Solution

  • I got it up and running after adding:

    traefik.ingress.kubernetes.io/service.sticky.cookie: "true"
    traefik.ingress.kubernetes.io/service.sticky.cookie.name: cookie
    traefik.ingress.kubernetes.io/service.sticky.cookie.secure: "true"
    

    to the service yaml