我有一个flask应用程序,有多个路由,包括默认路由'/'。我在kubernetes上部署了此应用程序。而且我使用minikube作为独立集群。使用NodePort公开,然后使用ingress将外部请求映射到集群中运行的应用程序。我的ingress像这样:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kubernetes-test-svc
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: \"false\"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
backend:
serviceName: defualt-http-backend
servicePort: 80
rules:
- host: kubernetes-test.info
http:
paths:
- path: /*
backend:
serviceName: kubernetes-test-svc
servicePort: 80
而且我还配置了我的/etc/hosts
文件以将请求路由到该主机。看起来像这样...
192.168.99.100 kubernetes-test.info
问题是无论我调用入口的哪个endpoint始终将其重定向到默认路由'/'。我的flask应用看起来像这样...
@app.route('/')
def index():
return "Root route"
@app.route('/route1')
def route1():
return "Route 1"
@app.route('/route2')
def route2():
params = request.args
return make_response(jsonify({'Param1': params['one'], 'Param2': params['two']}))
因此,如果我向kubernetes-test.info/route1发出请求,它将显示文本"Root Route"而不是"Route 1"。
但是,如果我输入192.168.99.100/route1,则会显示"Route 1"。我不知道为什么会这样?为什么它可以与minikube ip一起使用,但不能与我指定的主机一起使用。
Service部署如下:
apiVersion: v1
kind: Service
metadata:
name: kubernetes-test-svc
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: kubernetes-test
更新你的ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kubernetes-test-svc annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: backend: serviceName: defualt-http-backend servicePort: 80 rules: - host: kubernetes-test.info http: paths: - path: / backend: serviceName: kubernetes-test-svc servicePort: 80
大神,能解释下为什么吗?
我删除了路径重写,这样就可直接在
/
之后访问domain和path。要在URL中进行rewrite时,可以用你的配置。例如
www.example.com/api
和你想删除api
和api-1
等。thanks~!我知道了。
你的答案