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
注释)工作得很好,但它不应该..我很确定这是因为同一主机还有其他入口指定使用正则表达式注释。
我在我的 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
注释)工作得很好,但它不应该..我很确定这是因为同一主机还有其他入口指定使用正则表达式注释。