nginx-ingress返回带有多个入口文件的404

时间:2019-05-13 22:22:42

标签: kubernetes nginx-ingress

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

当我分别部署任何一个入口时,一切都很好,并且我可以访问我期望的路由。但是,当我同时添加两个入口时,只有具有按字母顺序排列的metadata.name值的入口将到达预期的后端,而另一个入口将从nginx-ingress返回404。

如果我切换metadata.name值,则此行为是一致的(具有第一个字母名称的入口将起作用),因此我认为这与路由本身或涉及的服务/吊舱无关,但是宁可与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";

vs

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,但是还没有成功。有什么我想念或做错的事吗?

谢谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您可以尝试添加此批注并对其进行测试吗?

Timer timer = new Timer();
timer.scheduleAtFixedRate(...)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

  • 安装并运行 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(/|$)(.*)