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?
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: