Google Cloud Kubernetes - сходство сессий балансировщика нагрузки с Cloudflare - PullRequest
1 голос
/ 05 июня 2019

Фон

У меня есть веб-приложение, которое развернуто для развертывания с несколькими модулями.Развертывание выставлено в интернет с сервисом kubernetes с внешним IP.

Внешний IP-адрес, доступный миру через Cloudflare:

Client ---> Cloudflare ---> k8 service ---> pod

Это веб-приложение должно быть определено с помощью липких сеансов.Поэтому я исправил свой сервис с помощью sessionAffinity: ClientIP, например:

kubectl patch service MYSERVICE  -p '{"spec":{"sessionAffinity":"ClientIP"}}'

Я проверил его в среде разработки и обнаружил, что сходство сессий не работает должным образом.

Расследование

Я искал проблему с липкими сессиями.Затем я обнаружил, что IP-адрес вызывающего абонента Cloudflare может меняться время от времени - случайным образом.Это перенаправит всех пользователей на другой модуль - именно то, что должен решить Sticky Session.

Итак, проблема в том, что моя служба Loadbalancer перенаправляет трафик в соответствии с Cloudflare IP и случайным образом.

Возможные решения

  1. Я обнаружил, что возможно загружать трафик в соответствии с Cookie.Основал этот источник .Но это с использованием расширенных компонентов Kubernetes, таких как BackendService и Ingress, которые должны быть четко определены.Есть ли у вас более простое решение?
  2. Cloudflare, прикрепляющий реальный клиентский IP к запросу в заголовках.Можно ли определить балансировку нагрузки для просмотра этого заголовка и перенаправить трафик в соответствии с его значением?

1 Ответ

1 голос
/ 10 июня 2019

Самый простой способ использовать Nginx Ingress Controller с приведенным ниже официальным примером входящего ресурса.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-test
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"    
spec:
  rules:
  - host: stickyingress.example.com
    http:
      paths:
      - backend:
          serviceName: http-svc # k8 service name
          servicePort: 80 # k8 service port
        path: /

Для его использования на вашем компьютере должен быть установлен Nginx Ingress Controller.Кубернетский кластер.Вы можете следовать инструкциям в ответе на этот пост , чтобы следовать инструкциям по установке.Затем примените вышеуказанный входной объект.

Вы также можете прочитать из этого блога , чтобы получить больше информации о том, как использовать липкие сессии в Kubernetes.

Также не стесняйтесь исследовать другие nginx входные аннотации если вы можете их использовать.

Надеюсь, это поможет!

...