Kubernetes NGINX Ingress 将 HTTP 请求从 POST 更改为 GET

Mar*_*ner 6 nginx kubernetes

我正在使用与 Docker-for-Mac 捆绑在一起的 Kubernetes。我正在尝试配置一个 Ingress,它将以 /v1/ 开头的 http 请求路由到我的后端服务,并将 /ui/ 请求路由到我的 Angular 应用程序。

我的问题似乎是请求的 HTTP 方法被入口 (NGINX) 从 POST 更改为 GET。

我尝试了各种重写规则,但没有成功。我什至从 Docker-for-Mac 切换到 Minikube,但结果是一样的。

如果我使用没有路径的简单入口(只是默认后端),那么服务将获取正确的 HTTP 方法。下面的入口有效:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  backend:
    serviceName: backend
    servicePort: 8080
Run Code Online (Sandbox Code Playgroud)

但这个入口并没有:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"

spec:
  rules:
  - http:
      paths:
      - path: /v1
        backend:
          serviceName: backend
          servicePort: 8080
      - path: /ui
        backend:
          serviceName: webui
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

当我调试“后端”服务时,我发现 HTTP 请求是 GET 而不是 POST。

我在某处读到 NGINX 重写了 308(永久)重定向,并且 HTTP 方法从 GET 更改为 POST,但如果是这种情况,我如何配置我的入口以支持需要 POST 调用的不同服务的不同路径?

Mar*_*ner 4

我找到了解决问题的方法。当我添加host:到配置中时,http 方法不会更改。这是我当前的入口 yaml(重写和正则表达式用于省略发送 /v1 作为后端 URL 的一部分)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /v1(/|$)(.*)
        backend:
          serviceName: gateway
          servicePort: 8080
Run Code Online (Sandbox Code Playgroud)