0

我在我的 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"

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

谢谢你的帮助。

4

1 回答 1

0

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

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

您可以通过转到 url 来测试这是否是问题:

test.com/test(/|$)(.*)

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


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

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

于 2021-12-03T16:53:49.460 回答