#kubernetes #kubernetes-ingress
Вопрос:
Я создал простой API на python, используя колбу.
Api используется для просмотра фильмов и работает как прокси, то есть:
Api получает ссылку от пользователя со страницей, содержащей mp4. Используя ссылку, он загружает mp4 с веб-запросом со страницы ссылки пользователя и возвращает пользователю mp4, но эти mp4 (ссылки) назначены IP-адресу, поэтому для того, чтобы пользователь мог посмотреть фильм, все должно проходить через API, API должен выполнить другой запрос и вернуть запрос пользователю.
Вот как выглядит часть моего API, которая отвечает за отправку запросов на просмотр фильма.
@WatchBp.route("/stream", methods=["GET"])
def stream():
print(request.headers)
try:
link = html.unescape(request.args.get("link"))
origin = html.unescape(request.args.get("origin"))
referer = html.unescape(request.args.get("referer"))
r = requests.get(link, headers={"Range": request.headers["Range"], "referer": referer, "origin": origin}, stream=True)
res = Response(r.iter_content(chunk_size=10 * 1024),mimetype=r.headers["Content-Type"],direct_passthrough=True,status=r.status_code)
res.headers["Content-Range"] = r.headers["Content-Range"]
res.headers["Accept-Ranges"] = 'bytes'
res.headers["Content-Length"] = r.headers["Content-Length"]
return res
except:
pass
return ('',501)
Весь Api работает на Digitalocean с использованием kubernetes, а он использует балансировщик нагрузки digitalocean.
Контейнеры, содержащие api, используют изображение docker tiangolo / uwsgi-nginx-колба: python3.8 .
В настоящее время приложение основано на 1 узле kubernetes
Теперь есть еще несколько пользователей, и я хотел бы добавить второй узел.
Но второй узел-это второй компьютер, и если ссылка на mp4 взята с узла 1, а следующий запрос балансировки нагрузки перенаправляется на узел 2, приложение не сможет загрузить mp4, потому что это будет другой ip-адрес.
Конфигурация моего приложения с использованием kubernetes использует вход, каналы входа подключены к балансировщику нагрузки, а каналы входа перенаправляют трафик на мой API.
Теперь вопрос в том, может ли пользователь, который смотрит фильм, всегда перенаправляться на узел, с которого был загружен mp4? Спасибо за любую помощь.
Комментарии:
1. разве вы не можете использовать липкую сессию с входом ?
2. @HarshManvar, если я использую это, запросы всегда будут поступать на один и тот же узел ?
3. запрос поступит в тот же модуль.
Ответ №1:
я не уверен, как на самом деле работает перемещение трафика на узел.
Поскольку ваш трафик или запрос в идеале хотят каждый раз переходить в один и тот же модуль.
Здесь может быть полезен липкий сеанс из входа Nginx
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "hello-cookie"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/affinity-mode: persistent
nginx.ingress.kubernetes.io/session-cookie-hash: sha1
spec:
rules:
- host: DOMAIN.NAME
http:
paths:
- path: /
backend:
serviceName: hello-service
servicePort: hello-port
вы можете прочитать больше по адресу : https://zhimin-wen.medium.com/sticky-sessions-in-kubernetes-56eb0e8f257d