在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
2条答案
按热度按时间cczfrluj1#
可以通过设置
nginx.ingress.kubernetes.io/use-regex annotation to true
.参见use-regex注解的描述:
有关路径优先级的详细信息,请参阅此ingress path matching
2exbekwf2#
解决方案是使用正则表达式(regex)匹配除/some端点之外的所有路径。