我正在使用与 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 调用的不同服务的不同路径?
我找到了解决问题的方法。当我添加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)
| 归档时间: |
|
| 查看次数: |
6250 次 |
| 最近记录: |