Kubernetes入口路径规则最长匹配首先不起作用

drkbr07n  于 2023-05-16  发布在  Kubernetes
关注(0)|答案(1)|浏览(124)

我有一个部署,它有一个单一的入口定义,它使用路径来引导对后端上的两个服务/Pod的请求

  • 一个pod用于API
  • 一个pod用于用户界面

只有当URL包含/api/<anything>时,web地址才应该转到API,否则其他所有内容都应该转到ui。
我的入口设置如下所示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp
  namespace: "myapp"
  labels:
    app.kubernetes.io/name: myapp
spec:
  ingressClassName: nginx
  rules:
    - host: myapp.dev
      http:
        paths:
          - path: /api/
            pathType: Prefix
            backend:
              service:
                name: myapp-api
                port:
                  name: http
          - path: /
            pathType: Prefix
            backend:
              service:
                name: mayapp-ui
                port:
                  name: http

如果我使用https://myapp.dev/api/endpoint进行测试,请求将循环发送到两个后端pod(我可以在ui pod的日志中看到请求)。
我的印象是,由于/api/endpoint在路径中,它应该总是匹配最长的规则,并且只发送到API pod?
我是否误解了路径匹配的工作原理?
非常感谢

zbdgwd5y

zbdgwd5y1#

你的道路不是独一无二的。
您应该在annotations下添加rewrite-target

metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"
  namespace: default

并编辑路径名称以Map案例:

paths:
  - path: /(.*)
    pathType: Prefix
    backend:
      service:
        name: mayapp-ui
        port:
          name: http
  - path: /(api(?:/|$).*)
    pathType: Prefix
    backend:
      service:
        name: myapp-api
        port:
          name: http

相关问题