Назад | Перейти на главную страницу

Kubernetes nginx ingress привязка к сеансу

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"