Kubernetes Ingress NGINX重写-如何支持不同域的多路径模式



目标是支持以下两个用例:

  1. 我们的组织有一个共享域shared.domain.com,因此每个服务都需要有一个唯一的路径。例如,对于我们的服务myservice,我们选择/myservice。因此,我们希望对shared.domain.com/myservice/users的请求进行重写,并使用路径/user将其路由到我们的服务。

  2. 我们还有一个特定于服务的域myservice.domain.com。在这种情况下,我们本身不需要重写:对myservice.domain.com/users的请求应该通过路径/user传递给我们的服务。然而,由于我们需要重写以满足上面的#1,所以我们需要在";框架";这个用例的重写。

我们使用的是Kubernetes Ingress NGINX重写(nginx.ingress.kubernetes.io/rewrite-target(。用例#1运行良好。然而,我们不知道如何让#2发挥作用。

目前,我们不得不对两个域使用相同的路径,这并不理想,因为它对任何调用myservice.domain.com/users的人都不向后兼容。现在他们必须呼叫myservice.domain.com/myservice/users。我们可以对代码进行更改,使其与调用方向后兼容,但这并不理想。

这是我们的配置:

# ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: $APP_NAME
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: 'https'
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/proxy-redirect-from: "http://"
nginx.ingress.kubernetes.io/proxy-redirect-to: "https://"
spec:
rules:
- host: shared.domain.com
http:
paths:
- path: /myservice(/|$)(.*)
backend:
serviceName: $APP_NAME
servicePort: http
- host: myservice.domain.com
http:
paths:
- path: "(/|$)(.*)" # Doesn't work
backend:
serviceName: $APP_NAME
servicePort: http

我们使用这些文档作为参考:https://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-目标。

您需要在myservice.domain.com:的路径中使用此正则表达式

/*(/|$)(.*)

此外,您正在使用v1beta1API,该api已被降级,很快将不可用:

警告:networking.k8s.io/v1beta1Ingress在v1.19+中已弃用,v1.22+版本中不可用;使用networking.k8s.io/v1入口

下面的ingress.yaml使用v1编写,带有myservice.domain.com的正确正则表达式:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: $APP_NAME
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: 'https'
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/proxy-redirect-from: "http://"
nginx.ingress.kubernetes.io/proxy-redirect-to: "https://"
spec:
rules:
- host: shared.domain.com
http:
paths:
- path: /myservice(/|$)(.*)
pathType: Prefix
backend:
service:
name: $APP_NAME
port:
number: 80
- host: myservice.domain.com
http:
paths:
- path: /*(/|$)(.*)
pathType: Prefix
backend:
service:
name: $APP_NAME
port:
number: 80

最新更新