Балансировка пользователей на одном узле в kubernetes

#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