Прежде чем перейти к вопросу, вот кратко о том, чего я пытаюсь достичь:
У нас более 1000 Neo4J databases
. Конечный пользователь может потребовать конкретный экземпляр базы данных. Таким образом, мы запускаем этот конкретный экземпляр Neo4J как докер-контейнер и делаем его доступным для пользователя.
Вопрос:
Для обработки запущенного экземпляра базы данных Neo4J по требованию,
У нас есть настройка kubernetes cluster
, и мы динамически создаем объекты deployment
, service
и ingress
для этой базы данных Neo4J.
В качестве выходного пользователь получает два URL: один для http
и один для bolt
.
У нас nginx
настроен как Ingress Controller
в Kubernetes
кластере. Nginx
разрешает http
и websocket
трафик. Протокол болтов должен работать на websocket
Проблема в том, что мы не можем подключиться к базе данных Neo4J, используя bolt
, поскольку ingress
не может перенаправить запрос с bolt url
на запущенный модуль.
Дайте мне знать, если это правильный способ сделать это.
Вот yaml объектов входа, обслуживания и развертывания:
Ingress.yaml
:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: neo-sandbox
annotations:
kubernetes.io/ingress.class: private
nginx.ingress.kubernetes.io/rewrite-target: "/"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.org/websocket-services: "neo-sandbox-bolt"
spec:
rules:
- host: sandbox.neo.com
http:
paths:
- path: "/22220"
backend:
serviceName: neo-sandbox-http
servicePort: 22220
- path: "/22221"
backend:
serviceName: neo-sandbox-bolt
servicePort: 22221
Http_Service.yaml
:
apiVersion: v1
kind: Service
metadata:
labels:
app: neo-sandbox-http
name: neo-sandbox-http
spec:
type: NodePort
selector:
app: neo-sandbox
ports:
- name: frontend-http-port
port: 22220
protocol: TCP
targetPort: 22220
Bolt_Service.yaml
:
apiVersion: v1
kind: Service
metadata:
labels:
app: neo-sandbox-bolt
name: neo-sandbox-bolt
spec:
type: NodePort
selector:
app: neo-sandbox
ports:
- name: frontend-bolt-port
port: 22221
protocol: TCP
targetPort: 22221
Deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: neo-sandbox
version: latest
name: neo-sandbox
spec:
replicas: 1
selector:
matchLabels:
app: neo-sandbox
version: latest
template:
metadata:
labels:
app: neo-sandbox
version: latest
spec:
containers:
- env:
- name: NEO4J_dbms_memory_pagecache_size
value: 1G
- name: NEO4J_dbms_memory_heap_maxSize
value: 3G
image: <neo4j-docker-image>
imagePullPolicy: IfNotPresent
name: neodb
ports:
- containerPort: 7474
protocol: TCP
- containerPort: 7687
protocol: TCP
resources:
limits:
cpu: "2"
memory: 5Gi
requests:
cpu: 200m
memory: 1Gi
- env:
- name: FRONTEND_HTTP_PORT
value: "22220"
- name: FRONTEND_BOLT_PORT
value: "22221"
image: <ha-proxy-docker-image>
name: proxy
ports:
- containerPort: 22220
protocol: TCP
- containerPort: 22221
protocol: TCP
resources:
limits:
cpu: 500m
memory: 2Gi
requests:
cpu: 50m
memory: 1Gi
Обратите внимание:
1) kubernetes pod
запускает два контейнера. Один контейнер запускает стандартный образ докера из Neo4j, а другой контейнер запускает образ HA proxy
, который выполняет перенаправление портов (перенаправляет трафик с 22220
на 7474
и 22221
на 7687
).
2) Я могу получить доступ к bolt service
внутри кластера. Так что проблема на уровне ingress
.
Вот URL-адреса, которые получает пользователь:
для HTTP -> sandbox.neo.com/22220
для BOLT -> sandbox.neo.com/22221
3) Параметры конфигурации Nginx можно просмотреть здесь
4) Пример Nginx Websocket: здесь