kubernetes的ingress仅调用索引路由,而不调用其他路由

sandy 发表于: 2019-11-18   最后更新时间: 2019-11-18  

我有一个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


您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: Kubernetes Cronjobs可以重用现有部署中的环境变量吗?
下一条: 容器死后,Helm Chart定义了postStart hook,是否在容器的每个启动都会调用postStart?

  • 更新你的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和你想删除apiapi-1等。