【问题标题】:Kubernetes nginx ingress configuration for wildcard rule通配符规则的 Kubernetes nginx 入口配置
【发布时间】:2022-01-31 19:25:16
【问题描述】:

我正在努力解决以下问题。我有 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: /$1
    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 进入 legacy-service,这是我想要避免的。 AFAIU 这个“www”被这个星号正则表达式捕获并且走错了路。我希望它转到新服务。

有什么方法可以通过 nginx 入口配置实现这一点?

【问题讨论】:

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

还可以通过指定主机名来重定向来自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: /$1
    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

【讨论】:

  • 您好,但主机不接受数组
  • 感谢您的评论。我看过一个带有数组的配置,但编辑了帖子以使用单独的主机配置。
  • 但这也无济于事。配置是有效的,但不幸的是 *.foo.bar 规则在前缀 www 版本上
  • @AdamSoliński 您是否尝试过更改主机定义的顺序。最后定义通配符主机可能会有所帮助,因为此配置被转换为特使过滤器,并且特使代理有一个过滤器链,其中顺序很重要。
  • 非常感谢,Jonas,现在可以了,我还没有意识到这些被翻译成特使过滤器,然后以有序的方式链接起来。
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多