Ingress-nginx 为什么位置与同一个入口文件不同?

Ingress-nginx why location is different from same ingress file?

我在我的 GKE 集群中使用 ingress-nginx 来公开我的服务。 我有 2 个不同的 GKE 集群 (v1.19.12-gke.2101),它们都使用 ingress-nginx(图表 v4.0.6)。

在这些集群上,我使用 oauth-proxy 公开了一些服务。它在第一个集群上运行良好,但在路径 /test/ 上出现 404 的第二个集群上却不行。我已经调查了很长时间,但没有找到可能导致此问题的原因。我发现的主要区别在于位置不同的 nginx.conf 文件。这是区别:

第一个集群(工作):

location ~* "^/test(/|$)(.*)/" {

第二个集群(不工作):

location /test(/|$)(.*)/ {

这是这条线路使用的入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-url: "<auth-url>"
    nginx.ingress.kubernetes.io/auth-signin: "<auth-signin>"
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
    kubernetes.io/tls-acme: 'true'
    ingress.kubernetes.io/force-ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/proxy-body-size: 500m
    cert-manager.io/cluster-issuer: "letsencrypt-prod-dns01"
  name: service-oauth
  namespace: default
spec:
  rules:
  - host: "test.com"
    http:
      paths:
      - path: "/test(/|$)(.*)"
        pathType: ImplementationSpecific
        backend:
          service:
            name: test
            port:
              number: 1234
  ingressClassName: nginx
  tls:
  - secretName: test-tls
    hosts:
      - "test.com"

我已经检查了我所有的配置文件(入口、服务),没有发现任何差异。如果您知道问题出在哪里,请告诉我。

感谢您的帮助。

您缺少启用正则表达式的注释,即:

nginx.ingress.kubernetes.io/use-regex: "true"

您可以通过转至 url:

来测试这是否是问题所在
test.com/test(/|$)(.*)

并检查是否有不同的 NGINX 回答您(oauth 代理)以及 NGINX 是否正在记录不同的内容(应该将请求转发到正确的服务)


至于为什么它在第一个集群上工作..你是否为同一主机但在另一个入口上启用了正则表达式(或使用重写目标)?

我也曾经注意到这种行为.. 没有这个注释的入口(也没有 rewrite-target 注释)工作得很好,但它不应该..我很确定这是因为同一主机还有其他入口指定使用正则表达式注释。