首页 > 解决方案 > Kubernetes Ingress 路径优先级(ingress-nginx)

问题描述

我部署了 2 个基于 Angular 的前端应用程序。我使用带有以下配置的 ingress-nginx ( k8s.gcr.io/ingress-nginx/controller:v0.44.0) 将请求路由到这些应用程序:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: portal-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - path: /?(.*)
        backend:
          serviceName: app1
          servicePort: 80
      - path: /app2
        backend:
          serviceName: app2
          servicePort: 80

当我点击<ip-address>/它时,它正在路由到 app1,但是当我点击<ip-address>/app2它时,它正在路由回 app1。

标签: nginxkuberneteskubernetes-ingressazure-aksnginx-ingress

解决方案


根据ingress-nginx 文档,它遵循的第一步是将路径按降序排列,然后将这些路径转换为 ​​nginx位置块。nginx 在这些块上遵循首次匹配策略。

在您的情况下,您可以提供两个路径,并且/app2比 长/,它将首先写入 nginx 配置中。含义/app2将有机会首先匹配(并将流量发送到app2),而其他所有内容都将转到app1。你不需要正则表达式来实现这一点。

代码:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: portal-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: app1
          servicePort: 80
      - path: /app2
        backend:
          serviceName: app2
          servicePort: 80

推荐阅读