目标是支持以下两个用例:
-
我们的组织有一个共享域
shared.domain.com
,因此每个服务都需要有一个唯一的路径。例如,对于我们的服务myservice
,我们选择/myservice
。因此,我们希望对shared.domain.com/myservice/users
的请求进行重写,并使用路径/user
将其路由到我们的服务。 -
我们还有一个特定于服务的域
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
:的路径中使用此正则表达式
/*(/|$)(.*)
此外,您正在使用v1beta1
API,该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