Cannot route traffic with Minikube + ingress + Django

11/22/2019

In my local development setup, I'm using Django as the webserver (a-la python manage.py runserver 8000) and I'm able to kubectl port-forward <django_pod> 8000 my traffic to my local dev machine so I can interact with my site by browsing to http://localhost:8000/testpage. I've configured my ALLOWED_HOSTS to include localhost to enable this.

However, I'd like to avoid using port-forward and go the more proper route of running my traffic through the Kubernetes ingress controller and service. On the same Minikube cluster, I have ingress configured to point certain traffic urls to a very rudimentary nginx pod to confirm that my ingress+service+pod networking is working properly. All other urls should route to my Django app. The only difference is the nginx traffic is all on port 80.

In my ingress controller logs, I can see the traffic being sent to the k8s service for my Django app: 192.168.64.1 - [192.168.64.1] - - [22/Nov/2019:03:50:52 +0000] "GET /testpage HTTP/2.0" 502 565 "-" "browser" 24 0.002 [default-django-service-8000] [] 172.17.0.5:8000, 172.17.0.5:8000, 172.17.0.5:8000 0, 0, 0 0.000, 0.000, 0.000 502, 502, 502 aa2682896e4d7a2052617f7d12b1a02b

When I look at the Django logs, I don't see any traffic hitting it.

My ingress servicePort is 8000, the django-service port is 8000 (I've just let it default to ClusterIP), the pod's spec.containers.ports.containerPort is 8000, and the process has been set to listen on port 8000 as I mentioned before.

When I check kubectl get endpoints, it correctly shows me an endpoint is connected on port 8000 (and it correctly changes to the new pods' IPs when I restart them).

I've used the following guides to try to debug:

My guess is it might be a problem with ALLOWED_HOSTS but I added a * wildcard to the list and it's still not working.

What is wrong with my setup?

-- s g
django
kubernetes-ingress
kubernetes-service
minikube

1 Answer

11/27/2019

You need to instruct the server to listen on all interfaces by running python manage.py runserver 0.0.0.0:<port>.

Django's runserver listens on the local loopback interface (localhost/127.0.0.1) by default so, if you run python manage.py runserver 8000, you can can only reach the server on port 8000 from the machine on which the server is running.

There is a lot of documentation around this, but here are just a couple examples:

-- s g
Source: StackOverflow