Jupyterhub behind ingress controller

I am trying to host a jupyterhub on kubernetes .

I have deployed the helm chart and set the ingress resource . when i visit the site loads properly as well
the websocket connection fails.

i read on the nginx ingress controller docs that websocket is supported out of the box.
I read that we need to make the ingress controller to speak TCP .

I am using a classic ELB with nginx ingress controller.

I would like to know if i missing any concept on networking here .Thanks :pray:

Things i tried:

  • exposed the svc as loadbalancer , works without error
  • tried using this svc as part of ingress resource - websocket error
  • tried seting the svc to clusterIP and again same error
  • tried setting headers to max timeout for 3600 (string) . again websocket error

on loadbalancer i see 2 rules. http 80 and https 443(with ACM certificate).

Based on this it sounds like the problem is in your ingress controller or Load balancer, rather than Z2JH.

Which ingress controller are you using? Confusingly there are two different K8s Nginx ingress controllers, (“nginx ingress” and “ingress-nginx”), with different configurations.

Hi @manics Thank you so much for commenting.

I am using kubernetes/ingress-nginx installed as helm chart.
version = “4.1.0”
chart = “ingress-nginx”

I tried to understand the docs. (specially theIMPORTANT section) Miscellaneous - NGINX Ingress Controller . it says If the NGINX ingress controller is exposed with a service type=LoadBalancer make sure the protocol between the loadbalancer and NGINX is TCP.

now i want to understand what this means. i see 2 rules in the classic loadbalancer(yes we are still on classic elb). http 80, and https 443.

i tried to change it to TCP 80 also. didn’t work
i tried to port-forward the service and everything runs fine.
i tried setting the following annotations as well (ofc didnt’ work)

backend-protocol: TCP
proxy-read-timeout: “3600”
proxy-send-timeout: “3600”
websocket-services: jupyterhub-bit-proxy-public (the prefix is not added here , discourse thinks it as URL) and i am not allowed to more than 2 links in single comment :frowning:

I am missing a networking concept here i believe. don’t know exactly what .

Since Z2JH is working fine with a LoadBalancer it might be easiest to stick with that?

Otherwise have you tried using Installing the AWS Load Balancer Controller add-on - Amazon EKS to handle your ingress instead?

I found my issue. it was stupid classic ELB all the time.
websocket is not supported by classic ELB Network Traffic Distribution – Elastic Load Balancing – Amazon Web Services