首页 > 解决方案 > Minikube 与 nginx 入口路径重写问题

问题描述

我正在使用带有 nginx 入口的 minikube。

我正在尝试像这样使用 url 重写

这是我的入口定义:

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

以下 url 重写如下:

这很好。但

minikube 版本:v0.35.0

如何修复多个路径元素的情况?

更新

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

标签: kubernetesminikubekubernetes-ingressnginx-ingress

解决方案


之前的 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
-------------------------------------------------------------------------------

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

因此,您应该始终提供 url 作为/reload/x/y/

重复尾部斜杠的另一个问题(在 v 0.22.0 和更高版本中已修复)。

为了了解那里发生了什么,您可以执行到 ingress-controller pod,查找/etc/nginx/nginx.conf并搜索

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

或者

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

要修复它,请将 ingress-controller 版本更新到最新版本,或者您也可以使用configuration-snippet注释:

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

推荐阅读