Как установить сродство сеанса между внутренним обслуживанием внутри кластера Kubernetes

Вот моя проблема: у меня есть 3 службы, определенные в файле yaml kubernetes:

  • один интерфейс (сайт)
  • один сервер: с отслеживанием состояния, для пользовательских сеансов
  • один сервер: без гражданства

Мне нужна привязка сеанса для службы с отслеживанием состояния, но не для службы без отслеживания состояния или интерфейсной службы. Мне нужно, чтобы привязка сеанса была на основе файлов cookie, а не на основе clientIP.

mydomain/stateful  ===> Front-End Service (3 pods) ===> Stateful Service (3 pods, need session affinity)
mydomain/stateless ===> Front-End Service (3 pods) ===> Stateless Service (3 pods, do not need session affinity)

Я пытался использовать службу Ingress, но не понимаю, как я могу использовать ее в качестве прокси между двумя службами внутри кластера Kubernetes. Все примеры, которые я вижу, показывают, как использовать Ingress в качестве маршрутизатора для запросов, поступающих извне кластера.

Вот мой poc.yaml:

####################################################################
######################### STATEFUL BACKEND #########################
# Deployment for pocbackend containers, listening on port 3000
apiVersion: apps/v1
kind: Deployment
metadata:
  name: stateful-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: stateful-backend
      tier: backend
  template:
    metadata:
      labels:
        app: stateful-backend
        tier: backend
    spec:
      containers:
      - name: pocbackend
        image: pocbackend:2.0
        ports:
           - name: http
             containerPort: 3000
---
# Service for Stateful containers, listening on port 3000
apiVersion: v1
kind: Service
metadata:
  name: api-stateful
spec:
  selector:
    app: stateful-backend
    tier: backend
  ports:
  - protocol: TCP
    port: 3002
    targetPort: http
  #sessionAffinity: ClientIP
---
#####################################################################
######################### STATELESS BACKEND #########################
# Deployment for pocbackend containers, listening on port 3000
apiVersion: apps/v1
kind: Deployment
metadata:
  name: stateless-backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: stateless-backend
      tier: backend
  template:
    metadata:
      labels:
        app: stateless-backend
        tier: backend
    spec:
      containers:
      - name: pocbackend
        image: pocbackend:2.0
        ports:
           - name: http
             containerPort: 3000
---
# Service for Stateless containers, listening on port 3000
apiVersion: v1
kind: Service
metadata:
  name: api-stateless
spec:
  selector:
    app: stateless-backend
    tier: backend
  ports:
  - protocol: TCP
    port: 3001
    targetPort: http
---
#############################################################
######################### FRONT END #########################
# deployment of the container pocfrontend listening to port 3500
apiVersion: apps/v1
kind: Deployment
metadata:
  name: front-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
      tier: frontend
  template:
    metadata:
      labels:
        app: frontend
        tier: frontend
    spec:
      containers:
      - name: pocfrontend
        image: pocfrontend:2.0       
        ports:
           - name: http
             containerPort: 3500      
---
# Service exposing frontend on node port 85
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: LoadBalancer
  selector:
    app: frontend
    tier: frontend
  ports:
  - protocol: TCP
    port: 85
    targetPort: http

Вы знаете, как решить мою проблему?

Спасибо!

1 ответ

Решение

Сам по себе Kubernetes не предоставляет session affinity на сервисном [концептуальном] уровне.

Единственный способ, который приходит мне в голову, - это использовать Istio, и это Destination Rules. Взято из руководства istio:

DestinationRuleопределяет политики, которые применяются к трафику, предназначенному для службы, после выполнения маршрутизации. Эти правила определяют конфигурацию для балансировки нагрузки, размер пула подключений из сопутствующего элемента и параметры обнаружения выбросов для обнаружения и удаления неработоспособных узлов из пула балансировки нагрузки.

В этом документе показано, как настроитьsticky session с istio.

Другие вопросы по тегам