【问题标题】:nginx-ingress returning 404 with multiple ingresses filesnginx-ingress 返回 404 和多个入口文件
【发布时间】:2019-09-30 21:35:40
【问题描述】:

我正在尝试使用 nginx-ingress 在 GKE 中设置一个 kubernetes 集群来处理请求路由。我有两个不同的项目,我想在同一个域中托管,每个项目都管理自己的入口定义。自述文件here 似乎显示了类似的内容,所以我认为这应该是可能的。

当我单独部署任一入口时,一切正常,我可以访问我期望的路由。但是,当我同时添加两者时,只有 metadata.name 值按字母顺序出现的入口才会到达预期的后端,而另一个入口将从 nginx-ingress 返回 404。

如果我切换 metadata.name 值,这种行为是一致的(具有第一个字母名称的入口将起作用),所以我认为它与路由本身或所涉及的服务/pod 无关,但是而是与 nginx-ingress 如何处理入口名称有关。

我尝试了各种版本的 nginx-ingress-controller:

  • quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
  • quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.0
  • quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.23.0
  • quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.22.0

我还尝试过强制正则表达式路由匹配(使用nginx.ingress.kubernetes.io/rewrite-target: /),交换入口上的名称,将项目部署到不同的命名空间,并将路径更改为完全不同但没有运气 - 只有一个入口文件会一次使用。

最后,我尝试制作一个包含两个定义的入口文件(因此只有一个入口名称在起作用),效果很好。比较统一的工作设置和非工作设置的 nginx 配置,唯一不同的是“set $ingress_name”,例如:

set $ingress_name   "test-ingress-1";

set $ingress_name   "test-unified-ingress";

这里是入口(更改了主机名):

test-ingress-1.yaml:

apiVersion: extensions/v1beta1                               
kind: Ingress                                                
metadata:                                                    
  annotations:                                               
    kubernetes.io/ingress.class: nginx                 
    nginx.ingress.kubernetes.io/from-to-www-redirect: "false"                          
  name: test-ingress-1                                       
  namespace: default                                         
spec:                                                        
  rules:                                                     
  - host: test.com                               
    http:                                                    
      paths:                                                 
      - backend:                                             
          serviceName: test-frontend                         
          servicePort: 80                                    
        path: /test                    
status:                                                      
  loadBalancer: {}                                           

test-ingress-2.yaml:

apiVersion: extensions/v1beta1                               
kind: Ingress                                                
metadata:                                                    
  annotations:                                               
    kubernetes.io/ingress.class: nginx                 
    nginx.ingress.kubernetes.io/from-to-www-redirect: "false"                          
  name: test-ingress-2                                       
  namespace: default                                         
spec:                                                        
  rules:                                                     
  - host: test.com                               
    http:                                                    
      paths:                                                 
      - backend:                                             
          serviceName: test-backend                         
          servicePort: 80                                    
        path: /api/test                    
status:                                                      
  loadBalancer: {} 

我希望这两个单独的入口文件一起配置 nginx,但没有成功。我有什么遗漏或做错了吗?

感谢您的帮助!

【问题讨论】:

  • 一个入口文件可以正常工作吗?
  • 是的,一个入口文件可以正常工作,但我正在尝试找到一种方法来处理多个文件,以便将两个项目分开。

标签: kubernetes nginx-ingress


【解决方案1】:

您可以尝试添加此注释并测试它是否有效。

nginx.ingress.kubernetes.io/rewrite-target: /

【讨论】:

  • 不走运,添加重写目标会将 nginx 配置文件中的模式匹配切换为正则表达式匹配,但我看到了相同的行为。
【解决方案2】:

为什么不将多个路径放入一个入口文件?

apiVersion: extensions/v1beta1                               
kind: Ingress                                                
metadata:                                                    
  annotations:                                               
    kubernetes.io/ingress.class: nginx                 
    nginx.ingress.kubernetes.io/from-to-www-redirect: "false"                          
  name: test-ingress-1                                       
  namespace: default                                         
spec:                                                        
  rules:                                                     
  - host: test.com                               
    http:                                                    
      paths:
      - path: /test                                                 
        backend:                                             
          serviceName: test-frontend                         
          servicePort: 80                                    
      - path: /api/test
        backend:                                             
          serviceName: test-backend                         
          servicePort: 80                                    
status:                                                      
  loadBalancer: {}  

或者按照下面的建议使用rewrite-target

【讨论】:

  • 路径用于两个不同的项目,我想分别管理它们。每个项目都会有不止一条路径,我希望有小的、集中的入口定义,而不是一个巨大的入口定义。不幸的是,使用 rewrite-target 并没有修复 404。
  • 很遗憾,无法使用相同主机名的多个 Ingress 资源。其中一种资源将简单地覆盖其他资源。解决方案是为每个入口规则部署一个单独的入口控制器
【解决方案3】:

我在 GKE 上遇到了同样的问题,所以,试试这个:

  • 确保您已将 NGINX 控制器安装在同一命名空间中(如果您正在使用它)。如果没有,那么,安装(我推荐 helm)How install NGNIX controller

  • 验证入口控制器、服务和 Pod 是否正在运行。

  • 安装并运行 NGINX 后,验证您的入口文件。

试试这个:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress-1
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
          serviceName: test-frontend
          servicePort: 80
        path: /test(/|$)(.*)
      - backend:
          serviceName: test-backend
          servicePort: 80
        path: /api/test(/|$)(.*)

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 2021-11-06
    • 2020-12-05
    • 2020-11-05
    • 1970-01-01
    • 2019-12-16
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多