Я настраиваю простой кластер Kubernetes, используя GKE. Я настроил Java Spring boot app для развертывания и обслуживания Kubernetes (с типом Load Balancer
, доступным для порта 80
). Это приложение прекрасно работает, когда к нему обращаются напрямую, используя внешний IP для службы.
Я также установил nginx -адрес для 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 (в загрузочном приложении Spring) за обратным прокси-сервером неправильно формирует URL-адрес . При условии, что есть возможность записать следующую 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.
Как я могу исправить эту проблему переписывания URL-адресов с помощью входа?
Редактировать: После подсказок от @HelloWorld я реорганизовал приложение для обслуживания контента на /app-java
контекстный путь (используя свойство Spring Boot 2 server.servlet.context-path=/app-java
). После этого я изменил rewrite-target
на:
nginx.ingress.kubernetes.io/rewrite-target: /app-java/$1
И теперь он работает нормально.