Как установить сродство сеанса между внутренним обслуживанием внутри кластера 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.