在 Kubernetes 中使用 nginx 将现有路径路由到另一个 pod

在 Kubernetes 中使用 nginx 将现有路径路由到另一个 pod

我在 GKE 中有一个应用程序(demoapp),它通过 GCE 入口暴露给互联网,如下所示:

- host: demoapp.com                                                                                                                                                                                                                
  http:                                                                                                                                                                                                                                 
    paths:                                                                                                                                                                                                                              
    - backend:                                                                                                                                                                                                                          
        serviceName: demoapp-service                                                                                                                                                                                                
        servicePort: 80            

该应用程序有许多客户,每个客户都有自己的页面,其路径方案类似于 demoapp.com/customers/customer1。我正在推出该应用程序的新版本 (demoapp2),并希望首先从某些客户那里收集一些反馈。因此,我想将某些客户路径路由到新应用程序而不是旧应用程序,以便例如 demoapp.com/customers/customer1 将解析为 demoapp2-service 的路径,而不是 demoapp-service 的路径。但这似乎不起作用:

- host: demoapp.com                                                                                                                                                                                                                
  http:                                                                                                                                                                                                                                 
    paths:
    - backend:
        serviceName: demoapp2-service
        servicePort: 80
      path: /customers/customer1                                                                                                                                                                                                        
    - backend:                                                                                                                                                                                                                          
        serviceName: demoapp-service                                                                                                                                                                                                
        servicePort: 80            

我尝试过其他变体,例如将path: /path: /*添加到 demoapp-service 路由,但我猜即使默认不覆盖路径,工作 URL 也会是 demoapp.com/customers/customer1/customers/customer1。所以接下来我认为我可以在 demoapp nginx 配置中使用类似这样的内容:

location /customers/customer1 {                                                                                                                                                                                  
      proxy_pass http://demoapp2-service/customers/customer1;
}

但这似乎也不起作用,我在日志中看不到任何内容。有人知道如何实现这个方案吗?

答案1

你可以挖掘NGINX Plus 入口控制器重写注释功能并满足您的需要。

请找到官方示例在这里

示例:在下面的示例中,我们对两个需要 URI 重写的应用程序进行负载平衡:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    nginx.org/rewrites: "serviceName=tea-svc rewrite=/;serviceName=coffee-svc rewrite=/beans/"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea/
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee/
        backend:
          serviceName: coffee-svc
          servicePort: 80

相关内容