Kubernetes入口精确性的优先级不高于前缀

64jmpszr  于 2022-12-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(112)

在Kubernetes中,我们需要一个新的服务来处理根路径,但仍然需要捕获当前前端上的所有其他内容。
当前前端入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: current-frontend
  labels:
    app: current-frontend
    tier: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
    - hosts:
      - my.domain.com
      secretName: tls-secret
  rules:
    - host: my.domain.com
      http:
        paths:
          - backend:
              service:
                name: current-frontend
                port:
                  number: 80
            path: /
            pathType: Prefix

新服务入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: new-service
  labels:
    app: new-service
    tier: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - my.domain.com
    secretName: tls-secret
  rules:
  - host: my.domain.com
    http:
      paths:
      - backend:
          service:
            name: new-service
            port:
              number: 80
        path: /someendpoint
        pathType: ImplementationSpecific
      - backend:
          service:
            name: new-service
            port:
              number: 80
        path: /
        pathType: Exact

根据Kuberntes Ingress的文档,它应该优先考虑Exact而不是Prefix
如果两个路径仍然相等匹配,则具有精确路径类型的路径将优先于前缀路径类型。
https://kubernetes.io/docs/concepts/services-networking/ingress/#multiple-matches
问题是,除了www.example.com之外,其他所有东西my.domain.com/someendpoint进入了当前的前端,而预期的是my.domain.com/将进入新服务。
我如何实现这一目标?

解决方案

我得到了它的工作,即使它不接缝是最佳的解决方案(根据文档)
我按照Hemanth Kumar的回答,将Current Frontend更改为使用Regex,用(.+)代替(.*),因为我希望斜杠后面至少有一个字符,以便命中它。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: current-frontend
  labels:
    app: current-frontend
    tier: frontend
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    kubernetes.io/ingress.class: nginx
spec:
  tls:
    - hosts:
      - my.domain.com
      secretName: tls-secret
  rules:
    - host: my.domain.com
      http:
        paths:
          - backend:
              service:
                name: current-frontend
                port:
                  number: 80
            path: /(.+)
            pathType: Prefix

同时,我需要将新服务更改为使用前缀,而不是确切的,因为它不工作,事件,如果没有其他服务击中。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: new-service
  labels:
    app: new-service
    tier: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - my.domain.com
    secretName: tls-secret
  rules:
  - host: my.domain.com
    http:
      paths:
      - backend:
          service:
            name: new-service
            port:
              number: 80
        path: /someendpoint
        pathType: ImplementationSpecific
      - backend:
          service:
            name: new-service
            port:
              number: 80
        path: /
        pathType: Prefix
cczfrluj

cczfrluj1#

可以通过设置
nginx.ingress.kubernetes.io/use-regex annotation to true .
参见use-regex注解的描述:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: test.com
    http:
      paths:
      - path: /foo/.*
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

有关路径优先级的详细信息,请参阅此ingress path matching

2exbekwf

2exbekwf2#

解决方案是使用正则表达式(regex)匹配除/some端点之外的所有路径。

相关问题