Kubernetes nginx сходство входящего сеанса через порты - PullRequest
0 голосов
/ 14 апреля 2020

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

apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  selector:
    app: my-app
  ports:
  - name: web
    port: 8080
    protocol: TCP
    targetPort: 8080
  - name: service
    port: 8081
    protocol: TCP
    targetPort: 8081

Затем я использую один вход для маршрутизации трафика c на правильный сервисный порт на основе пути:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
spec:
  rules:
  - host: myapp.test.com
    http:
      paths:
      - backend:
          serviceName: app
          servicePort: 8080
        path: /app
      - backend:
          serviceName: app
          servicePort: 8081
        path: /service

Это прекрасно работает для маршрутизации. Входящие запросы поступают на правильный сервисный порт в зависимости от пути. Однако проблема, с которой я столкнулся, заключается в том, что для работы этого унаследованного приложения запросы к обоим портам 8080 и 8081 должны быть направлены на один и тот же модуль для каждого клиента. Вы можете видеть, что я пытался добавить аннотацию upstream-ha sh. Это, казалось, гарантировало, что все запросы к 8080 от одного клиента направлялись к одному и тому же модулю, а все запросы к 8081 от одного клиента направлялись к одному и тому же модулю, но не то, что это один и тот же модуль для какого-либо одного клиента. Когда я запускаю с одним экземпляром модуля, все замечательно, но когда я запускаю дополнительные модули, некоторые клиенты перенаправляют запросы / app на один модуль и / service на другой и в этом приложении, которое в настоящее время не работает. Я пробовал другие аннотации во входе, включая nginx .ingress.kubernetes.io / affinity: "cook ie" и nginx .ingress.kubernetes.io / affinity-mode: "persistent", а также пытался добавить sessionAffinity: ClientIP к сервису, но пока ничего не работает. Цель состоит в том, чтобы все запросы к любому пути направлялись к одному и тому же модулю для любого одного клиента. Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 14 апреля 2020

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

Вы можете сделать это, установив параметры уровня обслуживания на:

service.spe c .externalTrafficPolicy: Local

, вы можете прочитать больше здесь:

https://kubernetes.io/docs/tutorials/services/source-ip/

после этого входные аннотации должны работать. Я проверил это только с внешним балансировщиком нагрузки, но не с входом.

, сохраняя все остальное таким же, и имея это определение сервиса, должно работать

apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  externalTrafficPolicy: Local
  selector:
    app: my-app
  ports:
  - name: web
    port: 8080
    protocol: TCP
    targetPort: 8080
  - name: service
    port: 8081
    protocol: TCP
    targetPort: 8081
...