【发布时间】:2020-01-20 23:21:27
【问题描述】:
我正在使用 GKE 设置简单的 Kubernetes 集群。我已将 Java Spring boot 应用程序设置为 Kubernetes 部署和服务(类型为 Load Balancer,暴露在端口 80 上)。当使用服务的外部 IP 直接访问时,此应用运行良好。
我还安装了nginx-ingress for GKE 并提供了以下 Ingress 资源:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
name: rewrite
namespace: default
spec:
rules:
- host: "myhost.ddns.net"
http:
paths:
- backend:
serviceName: app-java
servicePort: 80
path: /app-java/?(.*)
从现在开始,有趣的事情发生了:
问题 1:如果我访问位于 http://myhost.ddns.net/app-java 的站点 - 我只获得 HTML 文件,所有其他资源都有 404(从 http://myhost.ddns.net/foo.js 下载尝试而不是 http://myhost.ddns.net/app-java/foo.js。
问题 2:如果我访问位于 http://myhost.ddns.net/app-java/ 的站点 - 我会同时获得 HTML 文件以及所有脚本和图像。但是,当我深入挖掘时,通过 POST 发送表单内容失败。它的HTML代码是:
<form action="/select" method="post">
尝试访问http://myhost.ddns.net/select 而不是http://myhost.ddns.net/app-java/select。
我发现它可能与这个问题密切相关:Thymeleaf template (in Spring boot application) behind reverse proxy not forming url's correctly。提供的解决方案是编写以下 nginx 反向代理配置:
location /app-java {
proxy_pass http://10.0.0.0:80;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Prefix /app-java;
}
但是,我不知道如何将其转换为入口资源 yaml。
如何使用 ingress 解决这个 url 重写问题?
编辑:在 @HelloWorld 的提示之后,我重新组织了应用程序以在 /app-java 上下文路径上提供内容(使用 Spring Boot 2 属性 server.servlet.context-path=/app-java)。之后,我将rewrite-target 更改为:
nginx.ingress.kubernetes.io/rewrite-target: /app-java/$1
现在它工作正常。
【问题讨论】:
标签: url-rewriting kubernetes-ingress nginx-ingress