TL; DR: Я не могу получить привязку сеанса в Kubernetes, используя официальная диаграмма входящего трафика nginx. Я пробовал эти инструкции:
Sticky Sessions - контроллер входящего трафика nginx
Использование привязки сеанса в Kubernetes
Я также пытался читайте об обслуживании. Однако я не получаю никакого эффекта, когда запросы направляются на мою внутреннюю службу, а затем нагрузка балансируется ее автономной службой.
Дополнительная информация о моем случае: у меня есть общедоступный API, работающий с тремя модулями в Kubernetes, с входом nginx перед ним. Кластер находится на AWS и настроен с помощью Копс.
Для стороннего пользователя я настроил дайджест-аутентификацию, чтобы иметь возможность возвращать некоторые конфиденциальные данные. Я использовал вилку этот дайджест-пакет аутентификации.
Все нормально и щегольски, в dev работает отлично.
Однако после того, как я разверну свою систему, предоставив ей три модуля без сохранения состояния, первый дайджест-запрос попадет в один модуль, а ответ клиента - на другой модуль, что нарушит функциональность.
Что мне не хватает? Все, что я хочу, - это чтобы IP-адрес клиента всегда получал свой запрос в одном модуле в моем развертывании.
Спасибо!
Я нашел ответ, и что ж, знаю! Конечно, это была моя вина.
Проблема заключалась в том, что я пытался настроить диаграмму входящего трафика nginx, но это не помогло. Вход nginx обеспечивает только функциональность - сервисы, которые вы запускаете сами, обеспечивают требуемое поведение.
В моей собственной службе, которую я развернул, у меня был ingress
-заявление. Добавление аннотации для файлов cookie решило мою проблему.
Кроме того, спасибо Непомуцен за то, что сообщил мне в комментариях, что cookie
affinity будет работать, даже если это пользователь-бот.
Вот моя полная диаграмма управления для моего собственного сервиса, который полагался на вход nginx:
# Default values for chart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
image:
repository: [redacted]
tag: [redacted]
pullPolicy: IfNotPresent
imagePullSecret: [redacted] # Must be registered with the namespace.
service:
name: api
type: ClusterIP
externalPort: 8080
internalPort: 8080
livenessProbe: /alive
readinessProbe: /ready
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/affinity: "cookie" # THIS WAS THE REQUIRED LINE.
#kubernetes.io/tls-acme: 'true' # Kube Lego to obtain Let's Encrypt SSL certificates
hosts:
- [redacted]
tls:
- secretName: tls
hosts:
- [redacted]
hpa:
minReplicas: 3
maxReplicas: 10
cpuAvg: 65
resources:
limits:
cpu: 200m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
env:
- name: APPLICATION_ENV
value: "production"
- name: TZ
value: "Europe/Stockholm"