Minikube具有Nginx入口路径重写问题

时间:2019-06-24 12:16:02

标签: kubernetes minikube kubernetes-ingress nginx-ingress

我正在将minikube与nginx入口一起使用。

我正在尝试使用this这样的网址重写

这是我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: config-reader-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  backend:
    serviceName: default-http-backend
    servicePort: 80
  rules:
  - host: microservices.info
    http:
      paths:
      - path: /reload(/|$)(.*)
        backend:
          serviceName: spring-cloud-reload
          servicePort: 8080
      - path: /upload(/|$)(.*)
        backend:
          serviceName: spring-cloud-upload
          servicePort: 8080

以下网址是这样重写的:

  • /reload/

  • /reload/xyx/xyz

这很好。但是

  • /reload/x/y重写为/x//而不是/x/y

  • /reload/x/y/重写为/x/y//而不是/x/y/
  

minikube版本:v0.35.0

如何解决多路径元素的情况?

更新

-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:    0.21.0
  Build:      git-b65b85cd9
  Repository: https://github.com/aledbf/ingress-nginx
-------------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:1)

nginx-ingress v0.22.0之前的版本存在一个已知问题,带有尾部斜杠。

要检测正在运行哪个版本的入口控制器,请在pod中执行并运行nginx-ingress-controller version命令。

kubectl exec -it $POD_NAME -- /nginx-ingress-controller --version

-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:    0.24.1
  Build:      git-ce418168f
  Repository: https://github.com/kubernetes/ingress-nginx
-------------------------------------------------------------------------------

重写目标注释对于尾部斜杠非常敏感。如果不存在,该请求将不会被重写。

因此,您应始终以/reload/x/y/的形式提供url

另一个带有重复斜杠的问题(在v 0.22.0及更高版本中已修复)。

为了了解那里发生的事情,您可以执行到入口控制器窗格,找到/etc/nginx/nginx.conf并搜索

set $location_path  "/reload(/|${literal_dollar})(.*)";

rewrite "(?i)/reload(/|$)(.*)" /$2 break;

要修复此问题,请将入口控制器版本更新为最新版本,或者也可以使用configuration-snippet批注:

nginx.ingress.kubernetes.io/configuration-snippet: |
    rewrite (?i)/reload/x/y/ /x/y break;