通配符规则的 Kubernetes nginx ingress 配置
Kubernetes nginx ingress configuration for wildcard rule
我正在努力解决以下问题。我有 2 项服务 运行。我正在使用通配符来处理子域。请参阅下面的示例配置文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
kubernetes.io/ingress.global-static-ip-name: web-static-ip
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-alias: www.foo.bar
nginx.ingress.kubernetes.io/use-regex: "true"
name: foo-bar-ingress
namespace: test
spec:
rules:
- host: '*.foo.bar'
http:
paths:
- backend:
serviceName: legacy-service
servicePort: 80
path: /(.*)
pathType: ImplementationSpecific
- host: foo.bar
http:
paths:
- backend:
serviceName: new-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
以 abc.foo.bar -> legacy-service 和 foo.bar -> new-service 的方式使用应用程序非常好。但是,当我访问带有 www 前缀的应用程序时,它会进入通配符子域路径下,这意味着 www.foo.bar 进入旧版服务,这是我想要避免的。 AFAIU 这个“www”被这个星号正则表达式捕获并且走错了路。我希望它转到新服务。
有什么方法可以通过 nginx ingress 配置来实现吗?
还可以通过指定主机名来实现从 www.foo.bar
重定向请求。请注意,主机的顺序很重要,因为它们被翻译成 Envoy 过滤器链。因此,通配符主机应该是最后一个主机。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
kubernetes.io/ingress.global-static-ip-name: web-static-ip
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-alias: www.foo.bar
nginx.ingress.kubernetes.io/use-regex: "true"
name: foo-bar-ingress
namespace: test
spec:
rules:
- host: 'foo.bar'
http:
paths:
- backend:
serviceName: new-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
- host: 'www.foo.bar'
http:
paths:
- backend:
serviceName: new-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
- host: '*.foo.bar'
http:
paths:
- backend:
serviceName: legacy-service
servicePort: 80
path: /(.*)
pathType: ImplementationSpecific
我正在努力解决以下问题。我有 2 项服务 运行。我正在使用通配符来处理子域。请参阅下面的示例配置文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
kubernetes.io/ingress.global-static-ip-name: web-static-ip
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-alias: www.foo.bar
nginx.ingress.kubernetes.io/use-regex: "true"
name: foo-bar-ingress
namespace: test
spec:
rules:
- host: '*.foo.bar'
http:
paths:
- backend:
serviceName: legacy-service
servicePort: 80
path: /(.*)
pathType: ImplementationSpecific
- host: foo.bar
http:
paths:
- backend:
serviceName: new-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
以 abc.foo.bar -> legacy-service 和 foo.bar -> new-service 的方式使用应用程序非常好。但是,当我访问带有 www 前缀的应用程序时,它会进入通配符子域路径下,这意味着 www.foo.bar 进入旧版服务,这是我想要避免的。 AFAIU 这个“www”被这个星号正则表达式捕获并且走错了路。我希望它转到新服务。
有什么方法可以通过 nginx ingress 配置来实现吗?
还可以通过指定主机名来实现从 www.foo.bar
重定向请求。请注意,主机的顺序很重要,因为它们被翻译成 Envoy 过滤器链。因此,通配符主机应该是最后一个主机。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
kubernetes.io/ingress.global-static-ip-name: web-static-ip
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-alias: www.foo.bar
nginx.ingress.kubernetes.io/use-regex: "true"
name: foo-bar-ingress
namespace: test
spec:
rules:
- host: 'foo.bar'
http:
paths:
- backend:
serviceName: new-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
- host: 'www.foo.bar'
http:
paths:
- backend:
serviceName: new-service
servicePort: 8080
path: /(.*)
pathType: ImplementationSpecific
- host: '*.foo.bar'
http:
paths:
- backend:
serviceName: legacy-service
servicePort: 80
path: /(.*)
pathType: ImplementationSpecific