Как я могу использовать proxy pass в ingress-nginx?

Вопрос или проблема

Можешь помочь мне с этим?

Я переношу приложение, которое раньше работало на nginx балансировщике нагрузки, на k8s. Для этого мне нужно установить несколько websocket-соединений. Ранее в locations.conf у меня была следующая конфигурация для этого соединения:

location /notifier-back-socket/ {
  proxy_pass http://notifier:60114/notifier-back;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection 'upgrade';
  proxy_set_header Host $host;
  proxy_cache_bypass $http_upgrade;
}

Но теперь, с учетом ingress, мне нужно было выполнить этот прокси-пасс для моего приложения, как я мог бы это сделать?

Примечание: Ingress уже настроен с TLS-терминацией

Вот мой ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: notifier
  namespace: example
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/use-regex: "true"

spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - example.com.br
    secretName: example-tls
  rules:
  - host: example.com.br
    http:
      paths:
      - path: /notifier_front(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: notifier-front-service
            port:
              number: 6059

      - path: /notifier-back/
        pathType: ImplementationSpecific
        backend:
          service:
            name: notifier-back-service
            port:
              number: 60114

Ответ или решение

Использование proxy_pass в Ingress NGINX для WebSocket-подключений

Если вы перемещаете приложение из среды, управляемой nginx, в Kubernetes и вам нужно настроить соединение WebSocket, вы на правильном пути, используя Ingress NGINX. Давайте подробнее рассмотрим, как правильно настроить Ingress для обеспечения поддержки WebSocket на вашем кластере Kubernetes.

Общее описание

При миграции приложение, использовавшее nginx как балансировщик нагрузки, необходимо также учитывать, что WebSocket-соединения требуют определённых настроек для корректной работы через Ingress. В вашем случае, вы уже имеете некоторую настройку в Ingress, с TLS-тамированием. Основная задача заключается в правильной конфигурации маршрутов и необходимых заголовков.

Настройка Ingress для WebSocket

Ваш пример Ingress выглядит весьма корректно, однако для того, чтобы обеспечить полноценную работу WebSocket, нам необходимо внести определенные правки и добавить необходимые аннотации.

Полный конфигурационный файл Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: notifier
  namespace: example
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/websocket-services: notifier-back-service  # Добавляем аннотацию для WebSocket

spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - example.com.br
    secretName: example-tls
  rules:
  - host: example.com.br
    http:
      paths:
      - path: /notifier_front(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: notifier-front-service
            port:
              number: 6059

      - path: /notifier-back/(.*)  # Обратите внимание на добавленный суффикс /(.*) для правильного соответствия
        pathType: ImplementationSpecific
        backend:
          service:
            name: notifier-back-service
            port:
              number: 60114

Объяснение изменений

  1. Добавление аннотации для WebSocket:
    Аннотация nginx.ingress.kubernetes.io/websocket-services: notifier-back-service позволяет Ingress NGINX erkennen, что данный сервис будет использовать WebSocket. Это критически важно для обеспечения корректного проксирования.

  2. Путь с использованием регулярных выражений:
    Проверьте, что путь для /notifier-back/ корректно обрабатывается. В данном случае, использование регулярных выражений (например, /(.*)) может обеспечить, что все нужные запросы будут правильно маршрутизироваться на сервис.

  3. Настройка таймаутов:
    Вы уже добавили параметры для чтения и отправки, что важно для долгоживущих соединений WebSocket. Убедитесь, что указанные значения соответствуют требованиям вашего приложения.

Тестирование и отладка

После внесения изменений, важно протестировать ваше приложение:

  • Попробуйте установить соединение с помощью клиента WebSocket и убедитесь, что соединение успешно устанавливается.
  • Проверьте журналы Ingress NGINX для выявления любых ошибок или предупреждений.
  • Убедитесь, что данные корректно передаются между клиентом и сервером.

Заключение

Переход на Kubernetes с использованием Ingress NGINX требует внимания к деталям, особенно с WebSocket-соединениями. Правильная конфигурация включает в себя настройки аннотаций, маршрутов и таймаутов. Следуя вышеприведенным рекомендациям, вы сможете успешно настроить ваш Ingress для обеспечения стабильного и эффективного проксирования WebSocket-соединений.

Оцените материал
Добавить комментарий

Капча загружается...