Моя цель - направить локальный HTTP-сервис, который не находится в Kubernetes, через Kubernetes Ingress.
Приведенная ниже конфигурация работает, поэтому я могу открыть http://owncloud.example.com
или https://owncloud.example.com
извне.
Вот конфигурация Kubernetes:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: owncloud
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/secure-backends: "true"
ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-snippet:
location ~ ^/(.*) {
proxy_pass http://192.168.250.100:8260/$1;
proxy_set_header Host $host;
}
location ~ ^/api(.*) {
proxy_pass http://192.168.250.100:8261/$1;
proxy_set_header Host $host;
}
spec:
tls:
- hosts:
- owncloud.example.com
secretName: owncloud-tls
rules:
- host: owncloud.example.com
Проблема заключается в том, что я вижу некоторые странные ошибки в консоли Javascript браузера, связанные с «мета». Они связаны с глубоким кодом Javascript. Так что, к сожалению, нет полезного журнала. Сайт производит странное поведение в нескольких местах, в то время как локально работает нормально. Так что, похоже, это как-то связано с Kubernetes Ingress.
Ранее я использовал обычный Nginx, подключенный к внешней стороне, и это прекрасно работало:
location / {
proxy_pass http://192.168.250.100:8260/
}
Если я добавлю точно такой же блок в server-snippet
, сайт вообще не загружается. Он перехватывает Ingress по умолчанию.
Как правильно proxy_pass
traffi c из Kubernetes Ingress в другой сервис, который работает за пределами Kubernetes? Так что он не пропускает что-то через прокси.
Было бы неплохо провести исследование на server-snippet
, чтобы понять, чем конфигурация Kubernetes Ingress отличается от стандартной Nginx.
При использовании разных опций мне не удалось найти решение для proxy_pass для другого http при доступе к пути /api
.
---------- ------- Обновления -----------------
Я собрал все вопросы для сравнения.
Локально - работает :
Если я нажимаю manifest.json
, отображается «Ничего для предварительного просмотра». Если я использую wget
для загрузки этого json, я вижу <!DOCTYPE html>
в первой строке. Это HTML файл загружен. Но я могу подтвердить, что эта локальная версия работает отлично в течение многих лет. Так что этот скриншот просто для того, чтобы узнать, как он выглядит, когда он работает.
Через Ingress - не работает :
Я успешно вошел в систему. Не обнаружил ничего странного из опыта пользователя, но проблема существует:
Пытался выйти из системы. Я не могу это сделать. Выдает Owncloud Speci c Ошибка «Доступ запрещен CSRF-проверка не удалась», и на консоли я вижу это:
Если я go в https://owncloud.example.com/login страница специально:
Если я пытаюсь получить доступ к файлам в этом Owncloud, он также завершается с ошибкой 400
:
Если добавить дополнительные annotations
:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-snippet: |
location ~ ^/?(.*) {
proxy_pass http://192.168.250.100:8260/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
# Owncloud tuning
nginx.ingress.kubernetes.io/proxy-body-size: "500000m"
nginx.ingress.kubernetes.io/proxy-max-temp-file-size: "500000m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "36000s"
nginx.ingress.kubernetes.io/proxy-send-timeout: "36000s"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "36000s"
nginx.ingress.kubernetes.io/proxy-buffering: "off"
nginx.ingress.kubernetes.io/proxy-redirect-from: "off"
nginx.ingress.kubernetes.io/connection-proxy-header: "keep-alive"
Суммировать
Нет ошибок на стороне приложения. Итак, первое, что приходит мне в голову, это /logout
поведение. Я получаю 412
HTTP-код, который означает: Precondition Failed client error response code indicates that access to the target resource has been denied
и 400
ошибка неправильного запроса.
Есть ли у вас какие-либо знания, чтобы решить эту проблему?
Большое спасибо