Nginx Kubernetes导演时我需要包括端口吗?

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:

我有一个应用程序在K8s中运行。它前面有3个微服务和nginx。 每个重定向首先通过nginx,并按照指定的方式进行代理。 我的flask应用程序在重定向时遇到问题,而没有端口号。我通过minikube在本地运行k8s。每当我重定向到另一个页面时,url不包含端口号,这会给我带来一个错误

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}")