Nginx Kubernetes导演时我需要包括端口吗?
我有一个应用程序在K8s中运行。它前面有3个微服务和nginx。 每个重定向首先通过nginx,并按照指定的方式进行代理。 我的flask应用程序在重定向时遇到问题,而没有端口号。我通过minikube在本地运行k8s。每当我重定向到另一个页面时,url不包含端口号,这会给我带来一个错误Nginx Kubernetes导演时我需要包括端口吗?,nginx,flask,kubernetes,Nginx,Flask,Kubernetes,我有一个应用程序在K8s中运行。它前面有3个微服务和nginx。 每个重定向首先通过nginx,并按照指定的方式进行代理。 我的flask应用程序在重定向时遇到问题,而没有端口号。我通过minikube在本地运行k8s。每当我重定向到另一个页面时,url不包含端口号,这会给我带来一个错误 if usernamedata == None: print("Could not log in") else: if passworddata == password:
if usernamedata == None:
print("Could not log in")
else:
if passworddata == password:
print("Logged in")
return redirect("/user/{0}".format(username))
Nginx是唯一公开的服务,其url为
http://192.168.99.107:31699
在flask中重定向时,我被重定向到http://192.168.99.107/user/David
,这会导致连接被拒绝。
如果我添加端口号并使其http://192.168.99.107:31699/user/David
它工作正常。
重定向时是否需要指定端口号?如果服务关闭并重新创建怎么办?
另外,这是我对nginx的服务定义:
kind: Service
apiVersion: v1
metadata:
name: nginx
labels:
svc: nginx
spec:
selector:
app: nginx-app
type: LoadBalancer
ports:
- port: 80
如何使flask应用程序内的重定向工作?如果服务关闭并重新创建,并且您希望为服务保留相同的高端口号,则需要指定
节点端口
,并将服务类型更改为节点端口
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
svc: nginx
spec:
type: NodePort # type is set to NodePort
ports:
- port: 80 # Service's internal cluster IP
targetPort: 80 # target port of the backing pods
nodePort: 31699 # service will be only available via this port for each cluster node if recreated
selector:
app: nginx-app
在Python代码中(如果服务在Pod之前启动):
您是否在minikube中正确设置了负载平衡器?
$minikube服务nginx--url
返回什么?它返回http://192.168.99.107:31699
高端口号由Kubernetes动态(随机)设置,因为您没有明确指定它。请参阅下面关于如何设置它的答案。那么在flask中,我还需要显式指定端口吗?是的,您的选项:硬编码、通过环境变量传递、向下API或查询内部DNS。那么在返回重定向(“/user/{0}”。format(username))
中,我在哪里添加端口呢?在开头添加它会使我重定向到http://192.168.99.107/31699/user/david
对不起,我不知道我是否理解你的问题。是否可以执行重定向(“http://192.168.99.107:31699/user/{0}.格式(用户名))
?您还可以尝试通过DNS名称而不是IP地址重定向,即http://nginx?重定向(“http://192.168.99.107:31699/user/{0}.format(username))
有效,但对我来说不是理想的解决方案。谢谢你的帮助,我现在就不做了,等我更好地理解k8s的时候再试试。
import os
...
service_host = os.environ.get("NGINX_SERVICE_HOST")
service_port = os.environ.get("NGINX_SERVICE_PORT")
...
redirect(f"http://{service_host}:{service_port}/user/{username}")