Как лучше всего настроить прокси-проход в объекте Nginx Ingress для Kubernetes

В настоящее время я пытаюсь перенести сайт, который находился на сервере с балансировкой нагрузки Apache, на мой кластер k8s. Однако приложение было настроено странным образом с proxypass и proxyreversepass следующим образом:

ProxyPass /something http://example.com/something
ProxyPassReverse /something http://example.com/something

И я хотел бы имитировать это в Nginx Ingress

Сначала я попытался использовать аннотацию rewrite-target, однако она не сохраняет заголовок Location, необходимый для повторного запуска приложения.

Затем я попытался разместить аннотацию proxy-redirect-to/from внутри определенного блока местоположения, например:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gpg-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-redirect-from: http://originalapp.com/something
    nginx.ingress.kubernetes.io/proxy-redirect-to: http://example.com/something
spec:
  rules:
  - host: example.com
    http:
      paths:
        - path: /something
          backend:
            serviceName: example-com
            servicePort: 80

Вместо этого я хотел бы иметь возможность использовать пользовательскую переменную proxy_pass, но это не кажется возможным.

Как лучше всего имитировать этот проход прокси?


person Pablo Marti Cordero    schedule 01.05.2019    source источник


Ответы (1)


Во-первых, вы можете использовать настраиваемую конфигурацию для входящего контроллера nginx, документацию можно найти здесь

Кроме того, если вы просто хотите использовать контроллер входящего трафика nginx в качестве обратного прокси, каждое правило входа уже создает директиву proxy_pass для соответствующей восходящей / серверной службы.

И если пути совпадают с вашим правилом и серверной службой, вам не нужно указывать правило перезаписи, только путь для серверной службы. Но если пути разные, подумайте об использовании аннотации nginx.ingress.kubernetes.io/rewrite-target, иначе вы получите 404 backend ошибку

Итак, чтобы перенаправить запрос, который поступает во внешний интерфейс http://example.com/something, на серверный example-com/something, ваше правило входа должно быть таким, как показано ниже.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gpg-app-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
   #nginx.ingress.kubernetes.io/rewrite-target: /different-path
spec:
  rules:
  - host: example.com
    http:
      paths:
        - path: /something
          backend:
            serviceName: example-com
            servicePort: 80

Дополнительные сведения об аннотациях см. В Аннотации Nginx Ingress

Также рассмотрите возможность проверки журналов модуля nginx-ingress-controller через, если что-то не так.

kubectl logs nginx-ingress-controller-xxxxx

Надеюсь, поможет!

person coolinuxoid    schedule 15.05.2019
comment
Это именно то, что я должен был сделать. Я не понимал, что каждый вход - это собственный proxy_pass. Когда я узнал, что все очень просто складывается. - person Pablo Marti Cordero; 15.05.2019
comment
@coolinuxoid Когда правило входа автоматически создает директиву proxy_pass для соответствующей восходящей / серверной службы, это http. Для моей службы он создает директиву proxy_pass http://default-my-ingress-test.myapp.com-myapp-88;. Но вместо этого мне нужно, чтобы он был таким https: proxy_pass https://default-my-ingress-test.myapp.com-myapp-88;. Тогда будет работать только мое приложение, так как этот бэкэнд принимает только запросы https. Есть ли способ изменить эту директиву proxy_pass для службы с этой целью? - person AnjanaDyna; 17.03.2021
comment
@AnjanaDyna проверьте это kubernetes.github.io/ingress-nginx/user-guide/ - person coolinuxoid; 19.03.2021