Служба HTTP / HTTPS, которая находится за пределами кластера Kubernetes через Ingress - PullRequest
0 голосов
/ 19 февраля 2020

Моя цель - направить локальный 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.

---------- ------- Обновления -----------------

Я собрал все вопросы для сравнения.

Локально - работает :

enter image description here

Если я нажимаю manifest.json, отображается «Ничего для предварительного просмотра». Если я использую wget для загрузки этого json, я вижу <!DOCTYPE html> в первой строке. Это HTML файл загружен. Но я могу подтвердить, что эта локальная версия работает отлично в течение многих лет. Так что этот скриншот просто для того, чтобы узнать, как он выглядит, когда он работает.

Через Ingress - не работает :

Я успешно вошел в систему. Не обнаружил ничего странного из опыта пользователя, но проблема существует:

enter image description here

Пытался выйти из системы. Я не могу это сделать. Выдает Owncloud Speci c Ошибка «Доступ запрещен CSRF-проверка не удалась», и на консоли я вижу это:

enter image description here

Если я go в https://owncloud.example.com/login страница специально:

enter image description here

Если я пытаюсь получить доступ к файлам в этом Owncloud, он также завершается с ошибкой 400:

enter image description here

Если добавить дополнительные 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"

enter image description here

Суммировать

Нет ошибок на стороне приложения. Итак, первое, что приходит мне в голову, это /logout поведение. Я получаю 412 HTTP-код, который означает: Precondition Failed client error response code indicates that access to the target resource has been denied и 400 ошибка неправильного запроса.

Есть ли у вас какие-либо знания, чтобы решить эту проблему?

Большое спасибо

1 Ответ

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

Наконец-то нашел рабочее решение.

Я только что исправил location и proxy_pass, чтобы устранить причину root.

Так что если у вас есть какая-то локальная служба HTTP, которая находится за пределами кластера Kubernetes, и вы хотите обслужить это через Ingress, вам просто нужно это:

kind: Ingress
apiVersion: extensions/v1beta1
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;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;

        # Owncloud tuning
        proxy_max_temp_file_size 0;
        client_max_body_size 500000m;
        proxy_read_timeout 36000s;
        proxy_send_timeout 36000s;
        proxy_connect_timeout 36000s;
        proxy_buffering off;
        proxy_redirect off;
        proxy_set_header Connection "Keep-Alive";
      }
    # Owncloud tuning
    nginx.ingress.kubernetes.io/proxy-max-temp-file-size: "0"
    nginx.ingress.kubernetes.io/proxy-body-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"
spec:
  rules:
  - host: owncloud.example.com
  tls:
  - hosts:
    - owncloud.example.com
    secretName: owncloud-example-tls
  • Удалить блок настройки Owncloud, если у вас есть другая служба

  • Удалите ssl, secure, X-Forwarded-Proto и tls: биты, если вам не нужен HTTPS

Вы можете добавить больше location блоков, таких как ~ "^/api/(.*)" так что он работает как обычно Nginx.

В моем случае было полезно направить некоторые локальные Docker Compose и old fashion-сервисы наружу через Kubernetes Ingress.

PS Don ' не забудьте проголосовать за комментарий @mWatney, если вы пришли сюда, чтобы решить ошибку Owncloud CSRF.

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