kubernetes ingress nginx переписать частично работающий - иногда неверный контекстный путь - PullRequest
0 голосов
/ 21 января 2020

Я настраиваю простой кластер 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

И теперь он работает нормально.

1 Ответ

1 голос
/ 21 января 2020

Я вижу, вы пытаетесь заставить свой браузер добавить префикс ко всем путям в полете.

Я полагаю, что вы, наверное, неправильно поняли идею X-Forwarded-Prefix и все, что было описано в шаблоне Thymeleaf (в загрузочном приложении Spring) за обратным прокси-сервером неправильно формируется URL , где член сообщества описал, как передать этот заголовок в ваше приложение. Если вы хотите попробовать и посмотреть, как это работает, вы можете добиться этого, просто добавив эту аннотацию к вашему входному объекту:

nginx.ingress.kubernetes.io/x-forwarded-prefix: "/app-java"

, но заметьте, что это не решит вашу проблему.

Конечно, вы также можете добавить эти заголовки в ответ от приложения, чтобы они отправлялись в ваш браузер (что, я полагаю, вы ожидали достичь), но браузеры не заботятся об этих заголовках, так что нет никакого смысла делать это.

Если вы все еще хотите попробовать это сами и доказать это, вы можете добавить эту аннотацию к входному объекту:

nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_headers "X-Forwarded-Prefix: /app-java";

Насколько мне известно, единственный способ решить эту проблему - чтобы изменить код приложения так, чтобы он отвечал правильными путями.

Вы можете обнаружить, что многие приложения используют настраиваемый базовый путь, который настраивается либо переменными env, файлами конфигурации или аргументами cli.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...