无法使用 Minikube + ingress + Django 路由流量
Cannot route traffic with Minikube + ingress + Django
在我的本地开发设置中,我使用 Django 作为网络服务器 (a-la python manage.py runserver 8000
),我能够 kubectl port-forward <django_pod> 8000
我的流量到我的本地开发机器,所以我可以通过浏览至 http://localhost:8000/testpage
与我的站点进行交互。我已将 ALLOWED_HOSTS
配置为包含 localhost
以启用此功能。
但是,我想避免使用 port-forward
并通过 Kubernetes 入口控制器和服务走 运行 我的流量的更合适的路线。 在同一个 Minikube 集群上,我将入口配置为将某些流量 URL 指向一个非常基本的 nginx
pod,以确认我的入口+服务+pod 网络正常工作。 所有其他网址应该路由到我的 Django 应用程序。唯一的区别是 nginx 流量都在端口 80 上。
在我的入口控制器日志中,我可以看到为我的 Django 应用程序发送到 k8s 服务的流量:
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
当我查看 Django 日志时,我没有看到任何流量。
我的入口 servicePort
是 8000
,django-service
端口是 8000
(我只是让它默认为 ClusterIP
),pod 的spec.containers.ports.containerPort
是 8000
,并且进程已设置为侦听端口 8000
,正如我之前提到的。
当我检查 kubectl get endpoints
时,它正确地显示端点已连接到端口 8000(并且当我重新启动它们时它正确地更改为新的 pods' IP)。
我使用以下指南尝试调试:
- https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
- https://medium.com/@ManagedKube/kubernetes-troubleshooting-ingress-and-services-traffic-flows-547ea867b120
我猜这可能是 ALLOWED_HOSTS
的问题,但我在列表中添加了一个 *
通配符,但它仍然不起作用。
我的设置有什么问题?
您需要通过 运行ning python manage.py runserver 0.0.0.0:<port>
指示服务器监听所有接口。
Django 的 运行 服务器默认监听本地环回接口 (localhost/127.0.0.1) 所以,如果你 运行 python manage.py runserver 8000
,你只能从服务器 运行ning.
所在的机器到达端口 8000 上的服务器
关于这个有很多文档,但这里只是几个例子:
- About IP 0.0.0.0 in Django
- http://www.holeintheceiling.com/blog/2012/06/21/django-and-runserver-0-0-0-0/
在我的本地开发设置中,我使用 Django 作为网络服务器 (a-la python manage.py runserver 8000
),我能够 kubectl port-forward <django_pod> 8000
我的流量到我的本地开发机器,所以我可以通过浏览至 http://localhost:8000/testpage
与我的站点进行交互。我已将 ALLOWED_HOSTS
配置为包含 localhost
以启用此功能。
但是,我想避免使用 port-forward
并通过 Kubernetes 入口控制器和服务走 运行 我的流量的更合适的路线。 在同一个 Minikube 集群上,我将入口配置为将某些流量 URL 指向一个非常基本的 nginx
pod,以确认我的入口+服务+pod 网络正常工作。 所有其他网址应该路由到我的 Django 应用程序。唯一的区别是 nginx 流量都在端口 80 上。
在我的入口控制器日志中,我可以看到为我的 Django 应用程序发送到 k8s 服务的流量:
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
当我查看 Django 日志时,我没有看到任何流量。
我的入口 servicePort
是 8000
,django-service
端口是 8000
(我只是让它默认为 ClusterIP
),pod 的spec.containers.ports.containerPort
是 8000
,并且进程已设置为侦听端口 8000
,正如我之前提到的。
当我检查 kubectl get endpoints
时,它正确地显示端点已连接到端口 8000(并且当我重新启动它们时它正确地更改为新的 pods' IP)。
我使用以下指南尝试调试:
- https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
- https://medium.com/@ManagedKube/kubernetes-troubleshooting-ingress-and-services-traffic-flows-547ea867b120
我猜这可能是 ALLOWED_HOSTS
的问题,但我在列表中添加了一个 *
通配符,但它仍然不起作用。
我的设置有什么问题?
您需要通过 运行ning python manage.py runserver 0.0.0.0:<port>
指示服务器监听所有接口。
Django 的 运行 服务器默认监听本地环回接口 (localhost/127.0.0.1) 所以,如果你 运行 python manage.py runserver 8000
,你只能从服务器 运行ning.
关于这个有很多文档,但这里只是几个例子:
- About IP 0.0.0.0 in Django
- http://www.holeintheceiling.com/blog/2012/06/21/django-and-runserver-0-0-0-0/