Вопрос или проблема
Можешь помочь мне с этим?
Я переношу приложение, которое раньше работало на 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
Объяснение изменений
-
Добавление аннотации для WebSocket:
Аннотацияnginx.ingress.kubernetes.io/websocket-services: notifier-back-service
позволяет Ingress NGINX erkennen, что данный сервис будет использовать WebSocket. Это критически важно для обеспечения корректного проксирования. -
Путь с использованием регулярных выражений:
Проверьте, что путь для/notifier-back/
корректно обрабатывается. В данном случае, использование регулярных выражений (например,/(.*)
) может обеспечить, что все нужные запросы будут правильно маршрутизироваться на сервис. -
Настройка таймаутов:
Вы уже добавили параметры для чтения и отправки, что важно для долгоживущих соединений WebSocket. Убедитесь, что указанные значения соответствуют требованиям вашего приложения.
Тестирование и отладка
После внесения изменений, важно протестировать ваше приложение:
- Попробуйте установить соединение с помощью клиента WebSocket и убедитесь, что соединение успешно устанавливается.
- Проверьте журналы Ingress NGINX для выявления любых ошибок или предупреждений.
- Убедитесь, что данные корректно передаются между клиентом и сервером.
Заключение
Переход на Kubernetes с использованием Ingress NGINX требует внимания к деталям, особенно с WebSocket-соединениями. Правильная конфигурация включает в себя настройки аннотаций, маршрутов и таймаутов. Следуя вышеприведенным рекомендациям, вы сможете успешно настроить ваш Ingress
для обеспечения стабильного и эффективного проксирования WebSocket-соединений.