Параметры привязки сеанса для нескольких модулей, предоставляемых одной службой

У меня есть установка Metallb как LB с Nginx Ingress, установленным в кластере K8S. Я читал о сродстве сеанса и его значении, но пока у меня нет четкой картины.

Как я могу создать единую службу, отображающую несколько модулей одного и того же приложения? После создания единой точки входа службы, как сопоставить конкретный IP-адрес клиента с Pod, извлеченным службой?

Есть ли какой-нибудь блог, объясняющий эту концепцию с точки зрения того, как выполняется сопоставление между клиентским IP и POD в кубернетах?

Но я не вижу IP клиента в YAML. Затем, как эта служба будет сопоставлять трафик между соответствующими клиентами и своими конечными точками? это вопрос, который у меня есть.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10000

person Pert8S    schedule 27.05.2019    source источник
comment
потому что вы используете nginx в качестве контроллера входа, мы говорим о сеансах http, это означает, что вам необходимо настроить закрепление файлов cookie в ваших правилах входа, если вы войдете в репозиторий github контроллера входа nginx, у вас есть много примеров   -  person c4f4t0r    schedule 27.05.2019
comment
@ c4f4t0r Я хочу использовать обычную привязку сеанса, прежде чем переходить на файлы cookie. Кроме того, я хочу проверить и посмотреть, сопоставлен ли запрос клиента с модулем на основе его IP-адреса.   -  person Pert8S    schedule 27.05.2019
comment
если у вас есть веб-приложение, выполняющее привязку на основе ip, это не так хорошо, если у вас есть мобильный пользователь, ip может меняться много раз   -  person c4f4t0r    schedule 27.05.2019
comment
Сначала я пытаюсь проверить эту функцию. вы правы, если веб-приложение с использованием липких сессий полезно. Я бы сказал, что это более продвинутая часть управления сеансом. Я думаю, мне нужно сначала изучить основы картографии.   -  person Pert8S    schedule 27.05.2019


Ответы (2)


Основная концепция Session Affinity - всегда перенаправлять трафик от одного клиента к определенному узлу. Помните, что привязка сеанса - это наилучший метод, и есть сценарии, когда он не удастся из-за перезапуска модуля или сетевых ошибок. Существует два основных типа привязки сеанса:

1) На основе IP-адреса клиента

Этот вариант хорошо работает в сценарии, когда на каждый IP-адрес приходится только один клиент. В этом методе вам не нужен Ingress / Proxy между сервисами K8s и клиентом. IP-адрес клиента должен быть статическим, потому что каждый раз, когда клиент меняет IP-адрес, он будет перенаправлен на другой модуль.

Чтобы включить привязку сеанса в кубернетах, мы можем добавить следующее в определение службы.

service.spec.sessionAffinity: ClientIP

Поскольку сообщество предоставило надлежащий манифест для использования этого метода, я не буду дублировать его.

2) На основе файлов cookie

Он работает, когда есть несколько клиентов с одного и того же IP-адреса, потому что он хранится на уровне веб-браузера. Для этого метода требуется объект Ingress. Шаги по применению этого метода с более подробной информацией можно найти здесь в разделе Сходство сеанса на основе файлов cookie.

  • Создание развертывания контроллера NGINX
  • Создать сервис NGINX
  • Создать Ingress
  • Перенаправьте свое общедоступное DNS-имя на общедоступный / внешний IP-адрес службы NGINX.

О сопоставлении ClientIP и POD согласно документации kube-proxy отвечает за SessionAffinity. Одна из задач Kube-Proxy - запись в IPtables, подробнее здесь, вот как это отображается.

Статьи, которые могут помочь в понимании привязки сеансов: https://sookocheff.com/post/kubernetes/building-stateful-services/ https://medium.com/@diegomrtnzg/redirect-your-users-to-the-same-pod-by-using-session-affinity-on-kubernetes-baebf6a1733b < / а>

person PjoterS    schedule 12.06.2019

следуйте справке службы для привязки сеанса

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10000
person P Ekambaram    schedule 27.05.2019
comment
Да, до сих пор я видел, как этот YAML везде использовался в качестве примера. Но я не вижу IP клиента в YAML. Как эта служба будет сопоставлять трафик между соответствующими клиентами и своими конечными точками? это вопрос, который у меня есть. - person Pert8S; 27.05.2019
comment
sessionAffinity: ClientIP - person P Ekambaram; 27.05.2019
comment
указанное выше свойство будет направлять трафик в тот же серверный модуль на основе clientIP. - person P Ekambaram; 27.05.2019
comment
нужно ли вносить какие-либо изменения в файл Ingress? или только служебный файл, достаточный для вышеуказанной конфигурации липкого сеанса. - person vijay; 18.02.2021
comment
да, вам может потребоваться включить nginx.ingress.kubernetes.io/affinity - person P Ekambaram; 19.02.2021