通配符规则的 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